IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JavaScript 中常见的搜索算法 -> 正文阅读

[数据结构与算法]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))。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-16 21:51:22  更:2022-06-16 21:52:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:39:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码