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日

相关文章

  • JavaScript数组深拷贝和浅拷贝的两种方法

    JavaScript数组的深拷贝和浅拷贝是前端开发中非常常见的操作,本文将介绍两种常用的深拷贝和浅拷贝的方法。 JavaScript数组浅拷贝 JavaScript数组浅拷贝指的是在拷贝过程中只拷贝了原数组的引用,而不是拷贝了原数组中的所有元素。 1. 使用slice()函数进行浅拷贝 const arr1 = [1, 2, 3, 4] const arr2…

    JavaScript 2023年5月27日
    00
  • 用javascript做一个webgame连连看大家看下

    以下是用JavaScript做一个Web游戏连连看的完整攻略: 步骤1:准备工作 在开始编写游戏之前,需要做一些准备工作。 1.1 创建HTML模板 首先,我们需要创建一个基础的HTML网页模板。可以在文档头部引入所需的CSS和JavaScript文件,以及设置一个基础布局。 下面是一个简单的HTML模板示例: <!DOCTYPE html> &…

    JavaScript 2023年6月10日
    00
  • PHP Cookie学习笔记

    下面我来详细讲解“PHP Cookie学习笔记”的完整攻略。 一、什么是Cookie Cookie即浏览器的“小甜饼”,是一种存储在客户端的短文本数据。通过Cookie,Web应用程序能够在客户端存储和检索数据,从而实现用户状态的跟踪和数据交换。在PHP中,通过setcookie()函数可以创建、修改或删除Cookie。 二、如何使用Cookie 1.创建C…

    JavaScript 2023年6月11日
    00
  • 详解JavaScript基本类型和引用类型

    详解JavaScript基本类型和引用类型 基本类型 JavaScript 中的基本类型指的是简单的数据类型。它们在赋值时被直接存储在变量访问的位置。JavaScript 有 6 种基本类型:Number、String、Boolean、null、undefined 和 Symbol。 Number Number 是一种表示数字的基本类型,它包括整数和浮点数。…

    JavaScript 2023年5月28日
    00
  • 纯js实现页面返回顶部的动画(超简单)

    以下是纯JS实现页面返回顶部动画的攻略: 1. 准备工作 在 HTML 的 head 标签中引入一个自定义的 JavaScript 文件,比如: <head> <script src="js/scroll-top.js"></script> </head> 2. 编写 JavaScript …

    JavaScript 2023年6月10日
    00
  • JavaScript数组和循环详解

    JavaScript数组和循环详解 什么是JavaScript数组 JavaScript数组是指一种存储多个值的数据结构,这些值可以是任意数据类型,比如数字、字符串、对象等。JavaScript数组可以通过下标来访问其中存储的值,其中下标从0开始计数。 创建JavaScript数组 可以使用[]或者Array()构造器来创建一个JavaScript数组,例如…

    JavaScript 2023年5月18日
    00
  • 原生JS实现逼真的图片3D旋转效果详解

    下面我将详细讲解“原生JS实现逼真的图片3D旋转效果”的完整攻略。 前言 图片3D旋转效果是一种常见的网页设计效果,可以使页面看起来更加生动、有趣,并且能够吸引用户的注意力。本文将通过一个完整的案例来教您如何使用原生JS实现逼真的图片3D旋转效果。 准备工作 在开始之前,我们需要先准备好一些必要的工具和素材:1. 一张需要进行3D旋转效果的图片2. HTML…

    JavaScript 2023年6月10日
    00
  • 关于js和php对url编码的处理方法

    当涉及到 URL 编码和解码时,JavaScript 和 PHP 都提供了自己的方法。 JavaScript URL 编码和解码 JavaScript 中处理 URL 编码和解码的方法是 encodeURIComponent() 和 decodeURIComponent() 方法。其中,encodeURIComponent() 用于将 URL 中的非字母数字…

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