js实现检索算法之二分法

本文探讨了JavaScript中顺序查找和二分查找两种算法的实现及效率差异。初始代码使用顺序查找,后改进为二分查找,结果显示二分查找在有序数组中查找目标元素的效率显著提高。二分查找利用了数组的有序性,每次缩小搜索范围,提高了查找速度。
摘要由CSDN通过智能技术生成

二分查找

一开始这么写是不行的

var search = function(nums, target) {
    if(nums.indexOf(target)<0){
        for(let i=0;i<nums.length;i++){
            if(nums[i]===target)return i
        }
    }
    return -1
};

对于测试的数组nums=[-1,0,3,5,9,12]nums[0]是不管用的,但是后面的元素都可以正确匹配

错在判断条件nums.indexOf(target)<0这儿

为什么呢?

考虑到indexOf方法是不是自己有哪里没有注意到的细节问题?

官网描述

indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

果然哈,前半句话,找得到匹配元素的话,会返回这个元素的第一个(可能有重复)索引值

那么第一个元素的索引值是0,不会>0,根本就不会进入到判断条件当中去,直接return -1

所以改成这样就可以了nums.indexOf(target)!==-1

var search = function(nums, target) {
    if(nums.indexOf(target)!==-1){
        for(let i=0;i<nums.length;i++){
            if(nums[i]===target)return i
        }
    }
    return -1
};

啊虽然但是,我用的不是二分法(都不知道是个啥,拉垮得一匹

执行用时:72 ms, 在所有 JavaScript 提交中击败了37.88%的用户

内存消耗:43.9 MB, 在所有 JavaScript 提交中击败了45.29%的用户

所以学学二分法

在要查找的数据是有序的前提下,二分法查找会比顺序查找更高效

值得注意的是,二分法也只是对有序的数据集有效

二分法的原理就是

从中间开始找此时分两段,选择其中一段,再从中间开始找并分两半

var search = function(nums, target) {
    var upperBound=nums.length-1;
    var lowerBound=0;
    while(lowerBound<=upperBound){
        //之后每一轮循环都会缩小查找的区间,target总在“某一半中”
        var mid = Math.floor((upperBound+lowerBound)/2);
        if(nums[mid]<target){
            lowerBound = mid + 1;
        }else if(nums[mid]>target){
            upperBound = mid - 1;
        }else{
            return mid
        }
    }
    return -1
};

执行用时:64 ms, 在所有 JavaScript 提交中击败了73.86%的用户

内存消耗:43.9 MB, 在所有 JavaScript 提交中击败了41.27%的用户

可以,对比看来效率还是提高不少的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值