JavaScript 数据结构与算法——搜索

132 阅读2分钟

JavaScript 数据结构与算法——搜索

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 17 天,点击查看活动详情

介绍

搜索算法是一种在有限的空间当中查找特定元素的一种算法,搜索算法的基本思想是:通过比对来判断当前的值是否是我们需要的值。在日常中,我们使用的经常使用的搜索算法有:顺序搜索、二分搜索、内插搜索等。接下来我们将对这三种搜索算法进行介绍。

顺序搜索

思想

顺序搜索顾名思义,按照顺序依次比对每个元素,直到我们找到了我们需要的元素。顺序搜索算法是最基本的搜索算法,也是最简单的搜索算法,但也是一种低效的搜索算法,下面我们一起来实现一下。

实现

function orderSearch(array: number[], value: number): number | null {
  //遍历数组
  for (let i = 0; i < array.length; i++) {
    //获取数组每个元素然后和我们需要搜索的元素进行比对
    if (array[i] === value) {
      //比对成功,返回元素下标
      return i;
    }
  }

  // 失败,返回null
  return null;
}

二分搜索

思想

二分搜索算法的原理和猜数字游戏类似,假如我们需要猜一个 1-100 的数字,我们可以先取中间的数来判断,如果中间的数比要猜的数大,我们就向左边缩小范围,如果中间的数比要猜的数小,我们就向右边缩小范围,如果中间的数和要猜的数恰好相等,那么我们就找到了。当然,要实现这样的效果,我们需要要搜索的数组是有序的,不然我们无法通过比较大小来确定范围。

实现

// 比较函数类型
type compareFnType<T> = (val1: T, val2: T) => number;

// 搜索函数接口
interface IBinarySearch<T> {
  (array: T[], searchVal: T, compareFn: compareFnType<T>): number;
}

//排序好的数组
const array: number[] = [
  2, 5, 9, 14, 16, 27, 35, 45, 68, 96, 104, 169, 178, 257, 468,
];

// 比价函数
const compareFn: compareFnType<number> = function (val1, val2) {
  if (val1 > val2) {
    return 1;
  } else if (val1 < val2) {
    return -1;
  } else {
    return 0;
  }
};

// 需要搜索的值
const searchVal: number = 9;

// 搜索函数实现
const binarySearch: IBinarySearch<number> = function (
  array,
  searchVal,
  compareFn
) {
  let low = 0;
  let height = array.length - 1;

  while (low < height || low !== height) {
    //求中间数下标
    let mid = Math.floor(low + height);

    //获取中间下标的值
    let element = array[mid];
    if (compareFn(element, searchVal) === 1) {
      //如果找到的数比寻找的数大,我们就向下半区找
      height = mid - 1;
    } else if (compareFn(element, searchVal) === -1) {
      //如果找到的数比寻找的数小,我们就向上半区找
      low = mid + 1;
    } else {
      return mid;
    }
  }

  return null;
};

内插搜索

思想

内插搜索是改良版的二分搜索。二分搜索总是检查 mid 位置上的值,而内插搜索可能会根据要搜索的值检查数组的不同地方。先定义一个position变量来保存每次需要的搜索值,然后搜索的时候我们检查这个值是不是待搜索的值,如果是则找到,如果不是则检查这个值是否比搜索值小,如果是则搜索的范围变小,如果不是则搜索的范围变大。