最簡單的二分查詢情況下,我們假設陣列中沒有重複元素,因此很容易實現。如果陣列中存在重複元素,二分查詢就沒有想象中那麼容易了。
如果資料中存在相同的元素,但我們要查詢第乙個值等於給定值的元素,如果直接用最簡單的二分查詢,顯然是不滿足的。
看下面的例子,有 3 個等於 8 的元素,簡單二分查詢會返回 7,但第乙個值等於 8 的元素應該是 a[5]。
其實,只要我們在簡單二分查詢的基礎上再多加上一點限制即可。
當我們發現 a[mid] = val 時,我們需要繼續確認 a[mid] 左邊還有沒有等於 val 的元素。若 mid 左邊沒有和 a[mid] 相等的元素,則此時 a[mid] 就是我們要找的第乙個值等於給定值的元素。另外,若 mid 到了第乙個元素的位置,說明左邊已經沒有元素,此時 a[mid] 也即是我們要找的元素。否則,我們就需要繼續向左邊查詢。
float
binary_search
(float data, int left, int right, float value)
else
if (value < data[mid])
else
}return
-1;}
複製**
這個問題和上面要查詢第乙個值等於給定值的問題思路一樣,只不過是查詢的方向改變了。
當我們發現 a[mid] = val 時,我們需要繼續確認 a[mid] 右邊還有沒有等於 val 的元素。若 mid 右邊沒有和 a[mid] 相等的元素,則此時 a[mid] 就是我們要找的最後乙個值等於給定值的元素。另外,若 mid 到達了最後乙個元素的位置,說明右邊已經沒有元素,此時 a[mid] 也即是我們要找的元素。否則,我們就需要繼續向右邊查詢。
float
binary_search
(float data, int left, int right, float value)
else
if (value < data[mid])
else
}return
-1;}
複製**
當我們發現 a[mid] >= val 時,我們需要繼續確認 a[mid] 左邊還有沒有大於等於 val 的元素。若 mid 左邊的值小於 a[mid],則此時 a[mid] 就是我們要找的第乙個大於等於給定值的元素。另外,若 mid 到達了第乙個元素的位置,說明左邊已經沒有元素,此時 a[mid] 也即是我們要找的元素。否則,我們就需要繼續向左邊查詢。
float
binary_search
(float data, int left, int right, float value)
else
}return
-1;}
複製**
當我們發現 a[mid] <= val 時,我們需要繼續確認 a[mid] 右邊還有沒有小於等於 val 的元素。若 mid 右邊的值大於 a[mid],則此時 a[mid] 就是我們要找的最後乙個小於等於給定值的元素。另外,若 mid 到達了最後乙個元素的位置,說明右邊已經沒有元素,此時 a[mid] 也即是我們要找的元素。否則,我們就需要繼續向右邊查詢。
float
binary_search
(float data, int left, int right, float value)
else
}return
-1;}
複製**
當我們要查詢 202.102.133.13 這個 ip 位址的歸屬地時,我們就在位址庫中搜尋,發現這個 ip 位於 [202.102.133.0, 202.102.133.255] 這個範圍內,我們就可以找到對應的歸屬地——山東東營。
[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] 江蘇連雲港
複製**
因此,我們可以按照 ip 位址庫的起始位址對所有區間進行排序,然後問題就轉化為了找到最後乙個起始位址小於等於給定 ip 位址的區間。
參考資料-極客時間專欄《資料結構與演算法之美》
資料結構和演算法之 二分查詢下
最簡單的二分查詢情況下,我們假設陣列中沒有重複元素,因此很容易實現。如果陣列中存在重複元素,二分查詢就沒有想象中那麼容易了。如果資料中存在相同的元素,但我們要查詢第乙個值等於給定值的元素,如果直接用最簡單的二分查詢,顯然是不滿足的。看下面的例子,有 3 個等於 8 的元素,簡單二分查詢會返回 7,但...
資料結構和演算法之 二分查詢上
二分查詢 binary search 的思想非常簡單,但看似越簡單的東西往往越難掌握好,想要靈活運用就更加困難。生活中二分查詢的思想無處不在。乙個最常見的就是猜數遊戲,我隨機寫乙個 0 到 99 的數,然後你來猜我寫的是什麼。猜的過程中,我會告訴你每次是猜大了還是猜小了,直到猜中為止。假如我寫的數是...
資料結構之二分查詢
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其 缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成...