JavaScript 中常见的搜索算法

线性搜索

线性搜索是一种常见的搜索算法,它接受一个数组和一个值 - 并返回该值所在的索引。如果该值不存在,该函数将返回 -1。实施:

  1. 从从 i 开始并遍历数组长度的 for 循环开始
  2. 检查当前数组元素是否等于给定值。
  3. 如果找到,则返回该值的索引
  4. 如果值不存在,则返回 -1 代码如下:
function linearSearch(arr, val){
    for(let i = 0; i < arr.length; i++){
        if(arr[i] === val) return i;
    }
    return -1;
}

该函数的平均和最差时间复杂度为 O(N),最佳情况时间复杂度为 O(1)。我们的下一个搜索算法将改进这个时间复杂度。

二进制搜索

二进制搜索是一种比线性搜索更有效的算法,但需要注意的是它仅适用于已排序的数组。实施:

  1. 创建一个接受排序数组和值的函数。
  2. 在数组的开头创建一个左指针,在数组的末尾创建一个右指针。
  3. 当左指针在右指针前面时:
    • 在数组中间创建一个指针。您可以通过取起始值和结束值的平均值并使用 Math.floor() 来确保一个四舍五入的数字来找到这个中间值
    • 如果找到匹配值,则返回索引
    • 如果值太小,将左指针向上移动
    • 如果值太大,将右指针向下移动
    • 继续此过程,直到找到正确的值
  4. 如果该值不存在,则返回 -1

代码如下:

function binarySearch(arr, elem) {
    let start = 0;
    let end = arr.length - 1;
    let middle = Math.floor((start + end) / 2);
    while(arr[middle] !== elem && start <= end) {
        if(elem < arr[middle]) end = middle - 1;
        else start = middle + 1;
        middle = Math.floor((start + end) / 2);
    }
    return arr[middle] === elem ? middle : -1;
}

记住!此方法仅适用于排序数组!但是,如果您确实有一个排序数组,那么与线性搜索相比,时间复杂度会大大提高。最差和平均时间复杂度为 O(log n),最佳情况为 O(1)。

简单字符串搜索

我将介绍的最终搜索算法是简单字符串搜索。该算法对于在较大的字符串中查找模式很有用。例如,您可以尝试找出“AABA”在字符串“AABAACAADAABAABA”中出现的次数。实施:

  1. 定义一个函数,该函数接受一个较大的字符串,然后是包含您要查找的模式的字符串
  2. 循环较长的字符串
  3. 在该循环中,循环较短/模式字符串
  4. 检查匹配
    • 如果您找到匹配项,请继续
    • 如果你找到一个完整的匹配,增加你的匹配计数
  5. 如果未找到匹配项,则跳出内部循环
  6. 返回最后的总数

代码如下:

function naiveSearch(long, short){
  let count = 0;
  for(let i = 0; i < long.length; i++){
    for(let j = 0; j < short.length; j++){
      if(short[j] !== long[i+j]) break;
      if(j === short.length - 1) count++;
      }
    }
 return count;
}

简单字符串搜索的最佳情况时间复杂度是 O(n)。最坏的情况是 O(m*(n-m+1))。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端e站

如果有所帮助,欢迎来杯奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值