二分查詢大集合(媽媽再也不用擔心我的二分查詢了)

2021-09-08 11:35:50 字數 1944 閱讀 1350

什麼是二分查詢就不多說了。

有時經常會碰到類似於從乙個有序陣列中找到元素第一次出現的位置,求乙個有序陣列中小於某元素的個數,將乙個元素插入乙個有序陣列中,等等這樣的需求。比如 leetcode 315. count of smaller numbers after self 這道題用二分查詢來解,就需要維護乙個有序陣列,不斷往陣列中新增元素。這樣,傳統的 "從乙個有序陣列中求乙個元素的位置,有則返回,沒有則返回 -1",就需要變一下型了。

當然這完全可以用傳統的二分查詢,找到乙個相對來說 "比較正確" 的位置,然後從這個位置向左向右擴充套件,完全可以,而且複雜度也基本是一樣的,不過這樣的實現太 ugly 了。

為了以後能不用每次遇到二分查詢就要推下解,特記錄如下,媽媽再也不用擔心我的二分查詢了。

二分**:

function binarysearch(a, target) 

return a[start] === target ? start : -1;

}

start 的最終結果永遠比 end 大 1。下同。

測試程式:

function _binarysearch(a, target) 

return -1;

}

換個思路,求有序陣列中最後一次出現某數的位置,也就是求 "該數+1"(不管它在不在數列中) 第一次出現的位置 - 1。

function binarysearch(a, target) 

return a[end] === target - 1 ? end : -1;

}

這裡要注意的是找到的 end 索引可能是 -1,但是因為陣列是特殊的物件,所以 a["-1"] 返回 undefined,正是利用了這個 hack,使得程式可以一行返回。同時要注意 target 在函式最開始已經自增過,所以需和 target-1 進行大小對比。

測試程式:

function _binarysearch(a, target) 

return -1;

}

跟求最後一次出現某數的位置類似。

function binarysearch(a, target) 

return start;

}

如 return 的數等於陣列的長度,則表示陣列內所有元素都比 target 元素小。

測試程式:

function _binarysearch(a, target) 

return a.length;

}

**:

function binarysearch(a, target) 

return end;

}

如果 return -1,則表示陣列中沒有比 target 元素小的元素了(只能去找索引值為-1的元素了),這時要特別注意需要特判。

測試程式:

function _binarysearch(a, target) 

return -1;

}

暫時只想到這四種應用場景。

測試程式的測試用例:

for (var i = 0; i < 1000; i++) ); // sort

var target = ~~(math.random() * 500); // target 元素

var ans1 = binarysearch(a, target);

var ans2 = _binarysearch(a, target);

if (ans1 === ans2)

console.log('ok');

else

alert('error!');

}

二分查詢的平均查詢長度 二分查詢

資料的查詢在計算機的操作中非常常見,那麼我們應該怎樣在計算機中實現查詢操作呢?最簡單的一種方法 傻找 也就是乙個乙個的找,我們把陣列中的每個元素都和我們想要查詢的目標元素進行比對,看一下列表中是否有和這個元素相同的元素,如果我們想要尋找的那個目標元素在列表 現了,那麼就宣告查詢成功,這種演算法寫成 ...

二分查詢和遞迴的二分查詢

在乙個有序的陣列中查詢給定的資料項,把陣列衝中間分成兩半,然後看要查詢的資料項在陣列的哪一半,再次折半查詢。如下 public int find long searchkey else if lowerbound upperbound else private int recfind long se...

二分查詢及遞迴的二分查詢

一 思路 二分查詢又名折半查詢,顧名思義是分成兩部分,每查詢一次資料減半,所以查詢起來會很快。但是二分查詢的條件是已經有序的資料。1 設定兩個變數i,j.為查詢的範圍,i一般為0,j一般為陣列長度減一 2 設定變數mid,mid為所查陣列範圍的中間位置,即mid i j 2 3 比較所要查詢的資料v...