總結 二分查詢(下)

2021-09-28 14:23:16 字數 1499 閱讀 7114

總結:二分查詢(下)

一、四種常見的二分查詢變形問題

16|二分查詢(下):如何快速定位ip對應的省份位址?

file:///j/geektime/唯一更新qq群170701297/ebook/資料結構與演算法之美/16二分查詢(下):如何快速定位ip對應的省份位址?.html[2019/2/17 17:27:19]

1.查詢第乙個值等於給定值的元素

2.查詢最後乙個值等於給定值的元素

3.查詢第乙個大於等於給定值的元素

4.查詢最後乙個小於等於給定值的元素

二、適用性分析

1.凡事能用二分查詢解決的,絕大部分我們更傾向於用雜湊表或者二叉查詢樹,即便二分查詢在記憶體上更節省,但是畢竟記憶體如此緊缺的情況並不多。

2.求「值等於給定值」的二分查詢確實不怎麼用到,二分查詢更適合用在」近似「查詢問題上。比如上面講幾種變體。

三、思考

1.如何快速定位出乙個ip位址的歸屬地?

[202.102.133.0, 202.102.133.255] 山東東營市

[202.102.135.0, 202.102.136.255] 山東煙台

[202.102.156.34, 202.102.157.255] 山東青島

[202.102.48.0, 202.102.48.255] 江蘇宿遷

[202.102.49.15, 202.102.51.251] 江蘇泰州

[202.102.56.0, 202.102.56.255] 江蘇連雲港

假設我們有 12 萬條這樣的 ip 區間與歸屬地的對應關係,如何快速定位出乙個ip位址的歸屬地呢?

2.如果有乙個有序迴圈陣列,比如4,5,6,1,2,3。針對這種情況,如何實現乙個求「值等於給定值」的二分查詢演算法?

有三種方法查詢迴圈有序陣列

一、找到分界下標,分成兩個有序陣列

判斷目標值在哪個有序資料範圍內,做二分查詢

二、找到最大值的下標 x;

所有元素下標 +x 偏移,超過陣列範圍值的取模;

利用偏移後的下標做二分查詢;

如果找到目標下標,再作 -x 偏移,就是目標值實際下標。

兩種情況最高時耗都在查詢分界點上,所以時間複雜度是 o(n)。

16|二分查詢(下):如何快速定位ip對應的省份位址?

file:///j/geektime/唯一更新qq群170701297/ebook/資料結構與演算法之美/16二分查詢(下):如何快速定位ip對應的省份位址?.html[2019/2/17 17:27:19]

複雜度有點高,能否優化呢?

三、我們發現迴圈陣列存在乙個性質:以陣列中間點為分割槽,會將陣列分成乙個有序陣列和乙個迴圈有序陣列。

如果首元素小於 mid,說明前半部分是有序的,後半部分是迴圈有序陣列;

如果首元素大於 mid,說明後半部分是有序的,前半部分是迴圈有序的陣列;

如果目標元素在有序陣列範圍中,使用二分查詢;

如果目標元素在迴圈有序陣列中,設定陣列邊界後,使用以上方法繼續查詢。

時間複雜度為 o(logn)。

二分查詢總結

今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...

二分查詢總結

我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...

二分查詢總結

二分查詢其實並不簡單 這個演算法有很多版本 而且變化也比較多 稍一不留神就容易寫錯 這裡總結一下 一般二分查詢 binary serach int f int array,int key,int len else cout return 1 注意判斷條件必須要這麼寫 因為比如奇數個元素 1,3,5 ...