簡體   English   中英

JavaScript:快速搜索數組中的間隔

[英]JavaScript: quickly search for interval in array

給出了一個排序的數字數組。

這個想法是,對於任何給定的數字,代碼需要在數組中找到兩個封閉的索引,以便:

array[a] <= query <= array[b]

例如,如果給定的數組是[1, 20, 56, 200]並且數字是67 ,則56 <= 67 <= 200因此結果為[2, 3]

我用一個簡單的O(n)循環和二元搜索的兩個變體做了一個小測試,令人驚訝的是,對於低n(~0-100?),循環要快得多。 測試可以在這里訪問: http//jsperf.com/array-search-test/5

有沒有辦法比二進制搜索更優化? 這個功能每秒運行數千次,數萬次。

我用一個簡單的O(n)循環和二元搜索的兩個變體做了一個小測試,令人驚訝的是,對於低n(~0-100?),循環要快得多。 測試可以在這里訪問: http//jsperf.com/array-search-test/2

首先,這就是大O的工作原理。 在二進制搜索中,有許多操作; 順序數組訪問相對較少。

但這並不完全是這里發生的事情。 您的基准測試不符合他們的要求。

例如,在標記為“O(n),n = 50”的基准測試中,n仍然是最壞情況-1000。 你剛剛運行了50次搜索。 但是,由於數組的第十個元素是50,它只會進行50次比較。 以下二進制搜索不是這樣; 他們都從元素500開始。非常公平!

制作一些數組。

我用一個簡單的O(n)循環和二元搜索的兩個變體做了一個小測試,令人驚訝的是,對於低n(~0-100?),循環要快得多。 測試可以在這里訪問: http//jsperf.com/array-search-test/2

當然,與直接迭代的小得多的循環體相比,二進制搜索具有很大的開銷。

大O符號描述了“ 當參數傾向於特定值或無窮大時函數 的限制行為 [上限]”並且沒有提供任何證據來比較特定實現的兩次運行。

然而,正如@minitech注意到的那樣,你的測試用例存在缺陷,即使在n = 50時,二進制搜索已經比線性搜索更快。 這是一個更新的例子 ,它也測試n = 5(其中線性搜索確實更快)並且很好地描繪了圖中預期的O(n)O(log N)差異(盡管測試數據呈指數增長(5 *) 10 n )圖表是指數與線性的)。

有沒有辦法比二進制搜索更優化?

您可以查看插值搜索

這個功能每秒運行數千次,數萬次。

為什么? 您甚至可以更好地構建值的查找表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM