今天在編寫一些代碼時,我遇到了一個情況,這個情況導致我編寫了一種我以前從未見過的二進制搜索。這個二進制搜索有一個名稱,它真的是一個「二進制」搜索?這種二進制搜索是否有名字?
動機
首先,爲了使搜索更容易理解,我將解釋其催生創建使用情況。
假設您有一個有序號碼列表。系統會要求您查找最接近x的列表中的編號索引。
int findIndexClosestTo(int x);
的呼叫findIndexClosestTo()
總是遵循這個規則:
如果
findIndexClosestTo()
最後的結果是i
,然後指數接近i
有幸成爲當前呼叫的結果概率較大findIndexClosestTo()
。
換句話說,這次我們需要找到的索引更可能更接近我們發現的最後一個,而不是更遠。
例如,想象一個在屏幕上左右走動的模擬男孩。如果我們經常查詢男孩位置的指數,那麼他可能就在我們找到他的最後一個地方。
算法
鑑於以上的情況下,我們所知道的findIndexClosestTo()
最後的結果是i
(這實際上是第一次函數被調用,i
默認列表的中間指標,爲簡單起見,儘管單獨的二進制搜索來查找第一個調用的結果實際上會更快),並且該函數已被再次調用。鑑於新號碼x
,我們按照這個算法來尋找其索引:
interval = 1;
- 位於
i
我們正在尋找,x
數?如果是這樣,請返回i
; - 如果不是,請確定
x
是高於還是低於i
。 (請記住,清單是排序的。) - 移動
interval
指數的方向x
。 - 如果我們在新位置找到了
x
,請返回該位置。 - Double
interval
。 (即interval *= 2
) - 如果我們已經通過
x
,回去interval
指標,設定interval = 1
,進入4
鑑於上述(動機標題下)的概率規則,這在我看來是找到正確索引的最有效方法。你知道更快的方法嗎?
我認爲這實際上是一個數組而不是一個列表?因爲列表上的二進制搜索將是愚蠢的。 – Nemo
我會假設最好的答案將取決於基於i的位置的概率分佈是什麼。例如,如果有99%的可能性在我的3分之內,那麼與其他地方只有0.001%的可能性相比,非常不同的答案會很有用。我認爲最佳答案應該是基於概率的分佈,以便二分法搜索選擇一個點,使得每邊都有50%的機會。所以如果你可以定義概率曲線,你可以定義一個很好的算法。 – Chris
@Chris非常好點。如果所有數據點的概率都是相近的,那麼這可能會比常規二分查找更差。就我而言,從最後一點開始,概率似乎會呈指數衰減,在這種情況下,我相信這種搜索速度更快。它的插值是 –