二分查找的概念在于,定义一个数组arr,找到当前数组中点middle,如果要查找的值小于当前middle索引对应的值,则将缩小范围,继续求缩小范围的middle值,接着继续比较,不断缩小范围,最后找到该值;
当数据量大的时候,二分查找是很有优势的,下面是二分查找算法的比较:
// 二分查找
// 在有序的线性表的顺序查找中,时间复杂度为{log(n)}
let arr = [];
for(let i = 0 ;i<10000000;i++){
arr.push(i);
}
function middleSearch(arr,e) {
let low = 0;
let high = arr.length;
let middle ;
while (low<=high){
middle =Math.floor((low +high)/2);
if(arr[middle]<e){
low = middle+1;
}else if(arr[middle]>e){
high = middle-1
}else{
return middle
}
}
return middle
}
let time = new Date();
let index = middleSearch(arr,9999999);
time = new Date() -time;
console.log(time,index); // 0 9999999
// 系统内置的indexOf
time = new Date();
index = arr.indexOf(9999999);
time = new Date() -time;
console.log(time,index); // 17 9999999
当数据量少的时候,则两个算法基本没什么差异,下面是设置数组长度为10的情况:
综上,二分查找适合顺序存储,有序的而且数据量很大的数组,而原生的indexOf则适合随机存储并且数据量不大的数组;