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

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日

相关文章

  • SVG描边动画

    下面是关于“SVG描边动画”的完整攻略。 1. 什么是SVG描边动画? SVG描边动画指的是利用SVG的path路径元素来创建描边动画效果。通常,SVG的path路径元素可以表示成简单的连续线或复杂的曲线,而SVG描边动画则可以让这些线条按照一定的顺序绘制出来,从而创造出动画效果。 2. 如何实现SVG描边动画? 下面是一个基本的SVG描边动画示例: &lt…

    JavaScript 2023年6月11日
    00
  • Javascript Date setUTCFullYear() 方法

    以下是关于JavaScript Date对象的setUTCFullYear()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setUTCFullYear()方法 JavaScript的setUTCFullYear()方法设置对象UTC年份部分。该方法接受一个整数,表示要设置的UTC年份。如果该参数超出了JavaScript所能表示的…

    JavaScript 2023年5月11日
    00
  • Javascript之旅 对象的原型链之由来

    (一)对象的原型链由来 在 JavaScript 中,每个对象都有一个原型对象。原型对象充当着对象的模板,它包含了常用的属性和方法,子对象可以通过原型链继承这些属性和方法。 每个对象都可以通过__proto__属性访问它的原型对象,对象的原型对象也可以拥有自己的原型对象,这就是所谓的原型链。 但是,面对大量对象,JavaScript 在内存中会保存很多原型对…

    JavaScript 2023年6月10日
    00
  • JavaScript鼠标特效大全

    如果你想为自己的网站增加一些动感和互动性,可以考虑在网站中添加一些JavaScript鼠标特效。这些特效可以使你的网站更加吸引人,让用户留下深刻的印象。在这里,我将为大家介绍一些JavaScript鼠标特效的实现方法和示例。 实现方法 1. 使用CSS伪类:hover CSS伪类:hover可以检测鼠标的悬停状态,我们可以利用这个特性来实现一些动态效果。下面…

    JavaScript 2023年6月11日
    00
  • 简单了解JS打开url的方法

    了解 JS 打开 URL 的方法可以帮助我们在网页中实现跳转到其他页面的效果。下面是一些简单的方法和代码示例: 方法一:使用 window.open() 打开新窗口 这是一种很常见的打开 URL 的方法,并且可以指定新的窗口大小、位置和是否有工具栏等选项。 window.open(‘http://www.example.com’, ‘_blank’, ‘to…

    JavaScript 2023年6月11日
    00
  • javascript的函数第2/3页

    让我们来详细讲解“JavaScript的函数第2/3页”的完整攻略。 函数的声明 函数是 JavaScript 中的重要组成部分,它可以使我们编写可重用的代码。在 JavaScript 中,函数有两种声明方式:函数声明和函数表达式。 函数声明 函数声明是最常用和最熟悉的方式。它使用 function 关键字来定义一个函数,并给它取一个名称。语法如下: fun…

    JavaScript 2023年5月18日
    00
  • Javascript this关键字使用分析

    Javascript this关键字使用分析 在学习Javascript时,this是一个让初学者容易混淆的关键字。在本文中,我们将深入分析Javascript中this的使用规则和技巧,并提供两个示例说明。 this是什么 this关键字在Javascript中代表当前对象的上下文。具体来说,当一个函数被调用时,this就代表调用这个函数的对象。 this…

    JavaScript 2023年6月10日
    00
  • js定时器(执行一次、重复执行)

    下面我来详细讲解关于JS定时器的使用方法。 JS定时器概述 JS定时器是指按照指定的时间间隔来执行一段JavaScript代码的一种机制。在Web开发中,经常需要执行一些定时操作,例如图片轮播、定时刷新页面等等,这时候就可以使用JS定时器。 JS定时器一般分为两种类型:setTimeout和setInterval。其中setTimeout表示延时执行一次任务…

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