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变量来保存每次需要的搜索值,然后搜索的时候我们检查这个值是不是待搜索的值,如果是则找到,如果不是则检查这个值是否比搜索值小,如果是则搜索的范围变小,如果不是则搜索的范围变大。