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

顺序搜索

原理:

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

代码实现:

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)
};
相关推荐
我爱加班、、19 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao19 小时前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly19 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
hedley(●'◡'●)20 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751520 小时前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育20 小时前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再20 小时前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose20 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花20 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹21 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集