總結:二分查詢(下)
一、四種常見的二分查詢變形問題
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 ...