【前端学算法】搜索算法详解

顺序搜索

原理:

顺序或线性搜索是最基本的搜索算法。它的机制是,将每一个数据结构中的元素和我们要找的元素做比较。顺序搜索是最低效的一种搜索算法。

代码实现:

js 复制代码
// equalsFn  自定义匹配规则
const DOES_NOT_EXIST = -1;
function sequentialSearch(arr, value, equalsFn){
  for(let i = 0; i < arr.length; i++) {
    if(equalsFn(value, arr[i]){
      return i;
    };
  };
  return DOES_NOT_EXIST;
};

二分搜索

原理:

二分搜索算法要求被搜索的数据结构已排序。以下是该算法遵循的步骤。

1) 选择数组的中间值。

2)如果选中值是待搜素值,那么算法执行完毕。

3)如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找(较小)

  1. 如果待搜索值比选中值要大,则返回步骤1并在选中值右边的子数组中寻找(较大)

代码实现:

js 复制代码
const DOES_NOT_EXIST = -1;
const Compare = {
   LESS_THAN: true,
   EQUALS: true,
   BIGGER_THAN: true,
};
// compareFn 自定义匹配规则
function binarySearch(arr, value, compareFn){
  const sortedArr = sort(arr);/ sort方法对数组进行排序
  let low = 0;
  let high = sortedArr.length - 1;
  while(low <= high){
    // 计算中间项索引
    const mid = Math.floor((low + high)/2);
    // 获取中间项值
    const ele = sortedArr[mid];
  
    if(compareFn(value,ele) === Compare.LESS_THAN){//  // 如果搜索值比中间项值小,则选择数组低半边重新开始
     high = mid - 1;
    } else if(compareFn(ele,value) === Compare.BIGGER_THAN){// 如果搜索值比中间项值大,则选择数组高半边重新开始
     low = mid + 1;
    } else {
      retrun mid;
    };
  };
  // 如果low比high大,则意味着搜索值不存在并返回-1
  return DOES_NOT_EXIST;
};

内插搜索

原理:

内插搜索是改良版的二分搜索。二分搜索总是检查mid位置上的值,而内插搜索可能会根据要搜索的值检查数组中的不同地方。这个算法要求被搜索的数据结构已排序。以下是该算法遵循的步骤:

1)使用position公式选中一个值

2)如果这个值是待搜索值,那么算法执行完毕(值找到了)

3)如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找(较小)

4)如果待搜索值比选中值要大,则返回步骤1并在选中值右边的子数组中寻找(较大)

内插搜索的高效性只针对均匀分布的数组,而对于分布不均匀的数组,内插查找便不再适用了。

代码实现:

js 复制代码
const DOES_NOT_EXIST = -1;
const compare = {
   LESS_THAN: true,
   EQUALS: true,
   BIGGER_THAN: true,
};

function interpolationSearch(arr, value, compareFn, equalsFn, diffFn) {
  const { length } = array;
  let low = 0;
  let high = length - 1;
  let position = -1;
  let delta = -1;
  while(low <= high && biggerOrEquals(value, arr[low], compareFn) && lesserOrEquals(value, arr[high], compareFn)){
    // 计算比较值的位置
    delta = diffFn(value,arr[low]) / diffFn(arr[high], arr[low]);
    position = low + Math.floor(high - low) * delta;
    if(equalsFn(value,array[position]){
      retrun position;
    };
    if(compareFn(value,array[position]) === Compare.LESS_THAN){   
      // 如果待搜索值小于当前位置的值,则在数组选中值左边的子数组中寻找
      high = position - 1;  
    } else {
     // 如果待搜索值大于当前位置的值,则在数组选中值右边的子数组中寻找
     low = position + 1;
    };
  };
  retrun DOES_NOT_EXIST;
};

function lesserOrEquals(a, b, compareFn){
  const comp = compareFn(a, b);
  return comp = Compare.LESS_THAN || comp === Compare.EQUALS;
};

function biggerOrEquals(a, b, compareFn){
  const comp = compareFn(a, b);
  return comp = Compare.BIGGER_THAN || comp === Compare.EQUALS;
};

function diffFn(a, b){
  return Number(a) - Number(b)
};
相关推荐
JarvanMo13 分钟前
8 个你可能忽略了的 Flutter 小部件(一)
前端
JarvanMo21 分钟前
Flutter 中的微服务架构:拆解你的应用
前端
JarvanMo22 分钟前
对我来说,那个框架就是 Flutter。
前端
Mintopia29 分钟前
🧠 自监督学习在 WebAIGC 中的技术突破与应用前景
前端·人工智能·aigc
Mintopia32 分钟前
🧭 传统 Web 开发最好的 AI 助手框架排行榜(2025版)
前端·人工智能·aigc
坚持就完事了42 分钟前
003-HTML之表单
服务器·前端·html
暖木生晖44 分钟前
Javascript函数之匿名函数以及立即执行函数的使用方法?
开发语言·javascript·ecmascript
光影少年1 小时前
React Native第六章
javascript·react native·react.js
晓得迷路了1 小时前
栗子前端技术周刊第 105 期 - npm 安全性加强、Storybook 10、htmx 4.0 Alpha 1...
前端·javascript·npm