最近面試問的比較多的一個題目是:
有一個有序的數組,有沒有最快的方法查找到裏面的一個元素是否存在?存在返回下標,不存在返回-1。
部分人回答用循環,多數人想到用數組的findIndex方法。
很少的人知道這個題是要用二分查找的。
這個題主要是想看一下應聘人員對數據結構和算法有沒一下了解。
當然上面三種方式都可以實現這個需求,但是最優解還是二分查找法。
首先,循環和findIndex的是算法複雜度度是O(n),而二分查找的算法複雜度是O (logn)。
比如數組裏面放1-10000的數值,那麼找到9999這個數的話,二者的時間是多少呢?
這個數值是變動的,我們關注數量級。findIndex的方式是4ms多,二分的話是0.4ms,差了10倍左右。
如果是1000000個數值呢?
可以看出二分查找的時間上優勢。
測試代碼:
let arr = [];
for (let i = 0; i < 1000000; i++) {
arr.push(i+1)
}
console.time('findTime:');
console.log(arr.findIndex(item=>item===999999))
console.timeEnd('findTime:');
console.time('binary:')
console.log(binarySearch(arr,999999))
console.timeEnd('binary:')
function binarySearch(arr, key) {
let start = 0;
let end = arr.length-1;
// let mid = Math.floor((start + end) / 2)
// console.log(mid);
let mid ;
while (start <= end) {
mid = parseInt((start + end) / 2)
if (key < arr[mid]) {
end = mid-1;
} else if (key > arr[mid]) {
start = mid+1
}else if (key === arr[mid]) {
return mid//返回下標
}else{
return -1
}
}
}