查询算法
- 顺序查找 Inorder Search
即普通的遍历,穷举法,没啥好解释的
- 二分查找 Binary Search
如果一个序列是一个排序好的序列,则使用二分查找可以极大的缩短查找时间
具体的做法是:
查找该序列中间未知的数据
- 相等,找到
- 要找的数据较大,则对后续部分的数据做同样的步骤
- 要找的数据较小,则对前面部分的数据做同样的步骤
function binarySearch(target,arr){
let minIndex = 0;
let maxIndex = arr.length-1;
while (minIndex <= maxIndex) {
let mid = Math.floor((minIndex + maxIndex) / 2);//中间下标
if (arr[mid] === target) {
return true;
}
else if (arr[mid] > target) {
maxIndex = mid - 1;
}
else {
minIndex = mid + 1;
}
}
}
- 插值查找 Interpolation Search
插值查找是对二分查找的进一步改进
如果序列不仅是一个排序好的序列,而且序列的步长大致相同,使用插值查找会更快的找到目标。
插值查找基于如下假设:下标之间的距离比和数据之间的距离比大致相同,即:
(目标下标-最小下标) / (最大下标 - 最小下标) ≈ (目标值 - 最小值) / (最大值 - 最小值)
因此可以算出大致的下标落点:
目标下标 ≈ (目标值 - 最小值) / (最大值 - 最小值) * (最大下标 - 最小下标) + 最小下标
这样就可以计算出大致的下标落点,后续的比较和二分查找一样。
function interpolationSearch(arr, target) {
if (arr.length === 0 || target < arr[0] || target > arr[arr.length - 1]) return false;
var minIndex = 0; //最小下标
var maxIndex = arr.length - 1; //最大下标
while (minIndex <= maxIndex) {
var mid = (target - arr[minIndex]) / (arr[maxIndex] - arr[minIndex]) * (maxIndex - minIndex) + minIndex;
if (arr[mid] === target) {
return true;
}
else if (arr[mid] > target) {
maxIndex = mid - 1;
}
else {
minIndex = mid + 1;
}
}
return false;
}