返回顶部
首页 > 资讯 > 精选 >JavaScript中的二分查找法怎么使用
  • 899
分享到

JavaScript中的二分查找法怎么使用

2023-07-05 10:07:18 899人浏览 安东尼
摘要

这篇文章主要介绍“javascript中的二分查找法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的二分查找法怎么使用”文章能帮助大家解决问题。二分查找公式functi

这篇文章主要介绍“javascript中的二分查找法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的二分查找法怎么使用”文章能帮助大家解决问题。

二分查找公式

function binarySearch(nums, target) {let left = 0let right = ...while(...) {const mid = Math.floor(left + (right - left) / 2)if(nums[mid] === target) {...} else if(nums[mid] < target) {left = ...} else if(nums[mid] > target) {right = ...}} return ...}

分析二分查找技巧 不要出现else,而是把所有情况用else if 写清楚,这样可以清楚的展示所有细节。

Math.floor(left + (right - left) / 2)其实和Math.floor((left +right)/2)的结果是一样的。如果leftright很大的时候,相加会导致移除。Math.floor(left + (right - left) / 2)可以有效的防止溢出。

寻找一个数

var search = function (nums, target) {  let left = 0;  let right = nums.length - 1;  while (left <= right) {    const mid = Math.floor(left + (right - left) / 2);    if (nums[mid] === target) {      return mid;    } else if (nums[mid] > target) {      right = mid - 1;    } else if (nums[mid] < target) {      left = mid + 1;    }  }  return -1;};

力扣第704题二分查找 这题是二分查找最简单的题型,几乎所有的二分查找的题型都是根据这个拓展的。

我们首先考虑的是搜索区间。因为定义的rightnums.length - 1,所以搜索区间为[left, right]两端都闭。当查找到了目标元素,则停止搜索退出循环,然后返回目标值对应的索引

当没有找到目标元素,循环的终止条件为left === right + 1的时候,直接返回-1即可。

缺陷

如果给你个有序数组nums = [1,2,2,2,3],target为2,此时用上面的方法返回的索引是2。如果我们想得到的target的在nums中最左边满足条件的值,或者最右边满足条件的值,这种方法就有问题了。

可能会想到,当找到了target的值,然后向左,向右做线性搜索。但是这样就很难保证二分查找对数级的复杂度了。

寻找最左边满足条件的值

方式一

function leftBound(nums, target) {  let left = 0;  let right = nums.length;  while (left < right) {    const mid = Math.floor(left + (right - left) / 2);    if (nums[mid] === target) {      right = mid;    } else if (nums[mid] < target) {      left = mid + 1;    } else if (nums[mid] > target) {      right = mid;    }  }  if (left === num.length) return -1;  return nums[left] === target ? left : -1;}

上面是一种比较常见的代码形式。但是和我们刚开始的框架是可以匹配的。在这里while中使用的<,而不是<=。因为我们在定义right的时候,是nums.length而不是nums.length-1。那就说明我们的搜索区间是在[left,right)左闭右开。所以终止条件就是当left == right的时候。

还会发现一个不一样的地方,right = mid而不是right = mid - 1,这个还是受上面的搜索区间的影响。因为搜索区间为[left,right)左闭右开,所以当nums[mid]被检测到的时候,下一步应该缩小搜索区间。当nums[mid] === target的时候,虽然已经找到了target的值,但是不要立即返回,而是缩小搜索区间为[left, mid)。然后不断的向左边收缩,直到定左侧边界,也就是当left == right的时候。

最后,考虑下越界情况,当left的值为nums.length的时候说明查找左侧边界已经超出了搜索区间,说明target的值比所有数都大。当left的值为target的时候,说明找到了直接返回即可。然后其实返回left和返回right都一样,因为我们的终止条件是left == right

方式二

function leftBound(nums, target) {  let left = 0;  let right = nums.length - 1;  while (left <= right) {    const mid = Math.floor(left + (right - left) / 2);    if (nums[mid] < target) {      left = mid + 1;    } else if (nums[mid] > target) {      right = mid - 1;    } else if (nums[mid] === target) {      right = mid - 1;    }  }  if (left >= nums.length || nums[left] != target) {    return -1;  }  return left;}

方式一的搜索区间为[left, right)。我们方式二的搜索区间改为[left, right]左闭右闭。因为right的取值为nums.length - 1nums的最后一个值。while的终止条件则为left == right + 1,也就是代码中用的<=

此时right = mid - 1而不是right = mid, 因为搜索区间变了,[left,right]两边都闭。

最后判断一下边界条件,如果left >= nums.length说明已经超出了搜索区间,或者呢left的值和target不一样说明没找到。

这样就和第⼀种⼆分搜索算法统⼀了,都是两端都闭的搜索区间,⽽且最后返回的也是left 变量的值。不过我还是比较倾向于这种。哈哈。

寻找最右侧满足条件的值

方式一

function rightBound(nums, target) {  let left = 0;  let right = nums.length;  while (left < right) {    const mid = Math.floor(left + (right - left) / 2);    if (nums[mid] === target) {      left = mid + 1;    } else if (nums[mid] < target) {      left = mid + 1;    } else if (nums[mid] > target) {      right = mid;    }  }  if (left === 0) return -1;  return nums[left + 1] === target ? left - 1 : -1;}

这种方式和寻找左侧边界类似,还是使用搜索区间为[left, right)左闭右开的方式。关键的点在于当nums[mid]=== target的时候,设置的是left=mid+1。这样就可以把搜索区间变为[mid+1, right)。利用这种方式不断的增大左边界left的值,是的区间不断的向右靠拢,最后到达右边界。

但是这种方式最后返回的是left - 1。因为while的终止条件是left === right ,此时循环已经退出,如果已经找到了,那么left的则比要锁定的目标索引多1。因为下面这段代码

if(nums[mid] === target) {left = mid + 1}

所以最后的目标值要left - 1

方式二

function rightBound(nums, target) {  let left = 0;  let right = nums.length - 1;  while (left <= right) {    const mid = Math.floor(left + (right - left) / 2);    if (nums[mid] === target) {      left = mid + 1;    } else if (nums[mid] < target) {      left = mid + 1;    } else if (nums[mid] > target) {      right = mid - 1;    }  }  if (right < 0 || nums[right] !== target) {    return -1;  }  return right;}

这里和类似左侧边界的搜索区间[left, right]左闭右闭。

关于“JavaScript中的二分查找法怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: JavaScript中的二分查找法怎么使用

本文链接: https://lsjlt.com/news/351126.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中的二分查找法怎么使用
    这篇文章主要介绍“JavaScript中的二分查找法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的二分查找法怎么使用”文章能帮助大家解决问题。二分查找公式functi...
    99+
    2023-07-05
  • python二分法查找怎么使用
    这篇文章主要讲解了“python二分法查找怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python二分法查找怎么使用”吧!对于要搜索的元素越多,二分查找速度比简单查找快的更多 这是...
    99+
    2023-06-25
  • JavaScript二分查找算法的应用方法
    这篇文章主要介绍“JavaScript二分查找算法的应用方法”,在日常操作中,相信很多人在JavaScript二分查找算法的应用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript二分查找算...
    99+
    2023-06-20
  • 如何使用二分法查找
    本篇内容介绍了“如何使用二分法查找”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1、二分法查找...
    99+
    2024-04-02
  • Android二分查找算法怎么用
    本篇内容主要讲解“Android二分查找算法怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android二分查找算法怎么用”吧!旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组...
    99+
    2023-06-04
  • C#二分查找算法怎么用
    这篇“C#二分查找算法怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#二分查找算法怎么用”文章吧。1、定义:折半搜索...
    99+
    2023-06-30
  • JavaScript中二分查找的例题详解
    目录二分查找公式寻找一个数缺陷寻找最左边满足条件的值方式一方式二寻找最右侧满足条件的值方式一方式二你有没有碰到过这样的情况,当刷题的时候,刚开始满头雾水不知道从何下手,然后匆匆忙忙的...
    99+
    2023-03-09
    JavaScript二分查找算法 JavaScript二分查找
  • C语言二分查找法怎么用
    这篇文章主要讲解了“C语言二分查找法怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言二分查找法怎么用”吧!示例 1:输入: nums = [-1,0,3,5,9,12], targ...
    99+
    2023-06-30
  • Python二分查找算法怎么应用
    本篇内容主要讲解“Python二分查找算法怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python二分查找算法怎么应用”吧!1. 算法描述二分法是一种效率比较高的搜索方法回忆之前做过的...
    99+
    2023-07-02
  • C语言中二分查找怎么用
    这篇文章主要介绍了C语言中二分查找怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基础的二分查找先来回顾下基础的二分查找的基本框架,一般实际场景都是查找和 target ...
    99+
    2023-06-29
  • java二分法查找怎么实现
    java二分法查找怎么实现BinarySearch二分法查找,顾名思义就是要将数据每次都分成两份然后再去找到你想要的数据,我们可以这样去想,二分法查找很类似与我们平时玩的猜价格游戏,当你报出一个价格时裁判会告诉你价格相对于真实值的高低,倘若...
    99+
    2014-09-02
    java教程 java 二分法
  • Java怎么实现二分法查找
    这篇文章主要讲解了“Java怎么实现二分法查找”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现二分法查找”吧!二分法查找概述二分查找也称折半查找(Binary Search),...
    99+
    2023-07-02
  • 怎么在c语言中使用二分法查找数组中的元素
    今天就跟大家聊聊有关怎么在c语言中使用二分法查找数组中的元素,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。c语言二分法实现查找数组元素的方法:递归算法#include<stdi...
    99+
    2023-06-14
  • java 中二分法查找的应用实例
    java 中二分法查找的应用实例二分查找的前提是:数组有序 注意:mid的动态变化,否则出错!!!  实例代码:public class BiSearch { public static void main(St...
    99+
    2023-05-31
    java 二分法 ava
  • 使用Python实现二分法查找的示例
    关于二分法的定义我就不说了,CSDN很多大牛和前辈都已经阐述的很清楚了,直接上代码。 首先,先创建一个名称为 binary_search 的函数:传递两个参数,元素列表和要查找的值。...
    99+
    2023-05-17
    Python 二分法 Python二分查找
  • php二分查找算法怎么实现
    PHP实现二分查找算法的步骤如下: 确定要查找的数组和目标值。 定义一个函数,传入查找的数组、目标值以及数组的起始位置和结束位置作...
    99+
    2024-03-15
    php
  • 如何使用Java二分查找
    这篇文章主要介绍“如何使用Java二分查找”,在日常操作中,相信很多人在如何使用Java二分查找问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java二分查找”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • sort 包中的二分查找
    php小编草莓在这篇文章中将向大家介绍sort包中的二分查找算法。二分查找是一种高效的查找算法,它适用于有序数组中查找特定元素的场景。通过将数组不断分成两部分,并与目标元素进行比较,我...
    99+
    2024-02-09
  • c语言中怎么用递归实现二分法查找
    递归实现二分法查找的思路如下: 首先定义一个函数,接收一个有序数组、待查找的元素、数组的起始位置和结束位置作为参数。 在函数中,首...
    99+
    2024-02-29
    c语言
  • python二分查找算法的代码怎么写
    以下是一个简单的二分查找算法的Python代码实现: def binary_search(arr, target): lef...
    99+
    2023-10-26
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作