JS数组搜索之折半搜索实现方法分析

yizhihongxing

JS数组搜索之折半搜索实现方法分析

什么是折半搜索

折半搜索,也称二分搜索,是一种高效的搜索算法,它可以在一个已经按照某种顺序排好序的数组中查找某个值的位置。折半搜索每次对数组进行“折半”,判断目标值在左半部分还是右半部分,然后重复这个过程,直到找到目标值或者确定目标值不存在于数组中。

如何实现折半搜索

在JavaScript中,可以通过以下代码实现一个折半搜索的函数:

function binarySearch(arr, target) {
    let left = 0;
    let right = arr.length - 1;

    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        if (arr[mid] === target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return -1; // target不存在于数组中
}

上述代码中的arr是要进行搜索的数组,target是要查找的值。函数会首先将搜索区间的左右边界leftright设为数组的第一个和最后一个位置,然后在循环内部进行折半搜索。循环条件为left <= right,因为如果target不存在于数组中,最终的搜索区间会变成left > right,循环将退出。每次循环中,使用Math.floor((left + right) / 2)计算中间位置mid,然后根据arr[mid]target的大小关系更新搜索区间的左右边界leftright。如果arr[mid]等于target,直接返回mid,表示找到了目标值的位置。如果循环结束后仍然没有找到目标值,返回-1表示目标值不存在于数组中。

折半搜索的时间复杂度

假设待搜索的数组长度为N,折半搜索每次将搜索区间缩小一半,因此最多需要进行log2(N)次比较才能找到目标值或确定目标值不存在于数组中。因此,折半搜索的时间复杂度为O(log2(N)),相比于线性搜索的O(N)时间复杂度,折半搜索具有更高的效率。

示例说明

示例1

我们有一个已经排好序的数组arr,包含如下元素:

const arr = [1, 3, 4, 5, 7, 8, 10];

现在我们要查找数字5的位置,可以调用上述实现折半搜索的函数:

const index = binarySearch(arr, 5);
console.log(index); // 3

代码会返回数字5在数组中的位置,应该是3。

示例2

现在我们有一个乱序的数组arr2,包含如下元素:

const arr2 = [8, 3, 5, 1, 10, 7, 4];

我们可以先对数组进行排序,然后再进行折半搜索。在这里,我们使用JavaScript原生的sort函数对数组进行排序:

const sortedArr2 = arr2.sort((a, b) => a - b);
const index = binarySearch(sortedArr2, 5);
console.log(index); // 2

排序后的sortedArr2是排好序的数组,然后我们调用折半搜索函数查找数字5的位置。代码会返回2,因为在排好序的数组中,数字5的位置是2。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS数组搜索之折半搜索实现方法分析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • javascript中关于&& 和 || 表达式的小技巧分享

    接下来我将详细讲解“JavaScript中关于&&和||表达式的小技巧分享”的完整攻略。 什么是 && 和 || 表达式? 在 JavaScript 中,&& 和 || 都是逻辑运算符。 && 表示“与”,当两个操作数都为真(truthy)时,它的结果为真。如果第一个操作数为假(falsy),则…

    JavaScript 2023年6月11日
    00
  • 从面试题学习Javascript 面向对象(创建对象)

    很高兴能够为你详细讲解“从面试题学习Javascript 面向对象(创建对象)”的完整攻略。下面我将为你提供详细的自学指导及相关示例。 学习Javascript面向对象的创建对象 了解Javascript中对象的创建方式 在Javascript中,有多种创建对象的方式,包括: 对象字面量语法 构造函数 Object.create方法 工厂函数等 在学习创建对…

    JavaScript 2023年5月27日
    00
  • canvas压缩图片转换成base64格式输出文件流

    下面是使用canvas压缩图片并转换为base64格式输出文件流的完整攻略: 步骤一:html文件部分 首先,我们需要在html文件中添加一个input元素,用于选择要上传的图片。代码如下: <label for="image_upload">选择图片:</label> <input type="f…

    JavaScript 2023年5月19日
    00
  • Javascript Global escape() 函数

    以下是关于JavaScript Global对象中escape()函数的完整攻略,包括两个示例说明。 JavaScript Global对象中的escape()函数 JavaScript Global对象中的escape()函数用于将一个字符串进行编码,以便在URL中使用。(Uniform Resource Locator)是用于标识某个资源的字符串。URL…

    JavaScript 2023年5月11日
    00
  • Javascript循环删除数组中元素的几种方法示例

    针对 “Javascript循环删除数组中元素的几种方法示例” 这个主题,我会给出详细的讲解。下面是本次攻略的完整目录: 目录 前言 常规方法:for循环+splice 优化方法1:倒序循环+splice 优化方法2:将要删除的元素移动到末尾+pop 总结 前言 Javascript是一种弱类型的脚本语言,最大的特点就是非常灵活。但是在生产环境中,我们不仅要…

    JavaScript 2023年5月28日
    00
  • 微信小程序之圆形进度条实现思路

    让我来为你详细讲解“微信小程序之圆形进度条实现思路”的完整攻略。 思路概述 实现微信小程序的圆形进度条的思路如下: 使用canvas元素画出一个圆形,并将其设置为背景图片。 使用定时器或requestAnimationFrame动态绘制圆形进度,通过控制绘制的比例来实现进度条效果。 可以设置一些可调节的参数,如圆的半径、进度条的宽度、进度条的颜色等。 具体实…

    JavaScript 2023年6月11日
    00
  • 一文带你搞懂JavaScript中转义字符的使用

    一文带你搞懂JavaScript中转义字符的使用 在JavaScript中,转义字符是指以反斜线 “\” 开头的字符,用于表示在字符串中无法直接输入的内容,比如双引号,单引号,换行符等。下面我们来详细讲解JavaScript中转义字符的使用。 转义字符的使用 使用转义字符时,需要将反斜线和需要转义的字符组合使用。下面是一些常见的转义字符及其含义: 转义字符 …

    JavaScript 2023年5月20日
    00
  • JavaScript定时器实现的原理分析

    关于“JavaScript定时器实现的原理分析”的完整攻略,以下内容供参考。 纯文本格式 一、JavaScript定时器的种类 在JavaScript中,有两种类型的定时器:setTimeout和setInterval。它们两者的区别在于: setTimeout:只执行一次定时任务,执行完后就不再执行; setInterval:每隔一段时间重复执行定时任务。…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部