有序數組的最快的查找算法

最近面試問的比較多的一個題目是:
有一個有序的數組,有沒有最快的方法查找到裏面的一個元素是否存在?存在返回下標,不存在返回-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
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章