資料結構和演算法之——二分查詢上
二分查詢(Binary Search)的思想非常簡單,但看似越簡單的東西往往越難掌握好,想要靈活運用就更加困難。
1. 二分查詢的思想?
生活中二分查詢的思想無處不在。一個最常見的就是猜數遊戲,我隨機寫一個 0 到 99 的數,然後你來猜我寫的是什麼。猜的過程中,我會告訴你每次是猜大了還是猜小了,直到猜中為止。假如我寫的數是 23,猜數過程如下所示。
最多隻需要 7 次就猜出來了,這個過程是很快的。同理,要查詢某個資料是否在給定的陣列中,我們同樣也可以利用這個思想。
二分查詢針對的是一個有序的資料集合,查詢思想有點類似於分治,每次都通過和中間元素進行比較,將待查詢區間縮小為之前的一半,直到找到要查詢的元素或者區間縮小為 0 為止。
2. 二分查詢的時間複雜度?
我們假設資料大小為 n,每次查詢資料大小都會縮小為原來的一半,最壞情況下,直到查詢區間縮小為空時停止查詢。
若經過 k 次區間縮小最後變為空,則 ,所以二分查詢的時間複雜度為 。
這種對數時間複雜度的演算法是一種非常高效的演算法,有時候甚至比時間複雜度為常量級的演算法還要高效。因為常量級的時間複雜度對應的常數可能非常大,比如 O(100), O(1000),因此這些演算法有時候可能還沒有 的演算法執行效率高。
2. 簡單二分查詢的演算法實現?
迴圈法
float Binary_Search(float data[], int left, int right, float value)
{
while (left <= right)
{
int mid = left + (right - left) / 2;
if (value == data[mid])
{
return mid;
}
else if (value < data[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
遞迴法
float Binary_Search(float data[], int left, int right, float value)
{
if (left <= right)
{
int mid = left + (right - left) / 2;
if (value == data[mid])
{
return mid;
}
else if (value < data[mid])
{
return Binary_Search(data, left, mid-1, value);
}
else
{
return Binary_Search(data, mid+1, right, value);
}
}
return -1;
}
注意事項
- 迴圈退出條件 left <= right
- mid = left + ((right-left) >> 1),用移位運算優化計算效能
- left 和 right 的更新分別是 mid+1 和 mid-1
3. 二分查詢的應用場景?
二分查 找依賴的是順序表結構,也就是陣列,需要能夠按照下標隨機訪問元素。
二分查詢針對的是有序資料,如果資料無序,需要先進行排序。而如果有頻繁的插入、刪除操作,則每次查詢前都需要再次排序,這時候,二分查詢將不再適用。
資料量太小可以直接遍歷查詢,沒有必要用二分查詢。但如果資料之間的比較操作非常耗時,比如資料為長度超過 300 的字串,則不管資料量大小,都推薦使用二分查詢。
而如果資料量過大,則意味著我們需要用非常大的連續記憶體空間來儲存這些資料,記憶體開銷可能無法滿足。
獲取更多精彩,請關注「seniusen」!
相關文章
- 資料結構和演算法之——二分查詢下資料結構演算法
- 資料結構與演算法-二分查詢資料結構演算法
- 【資料結構與演算法】—— 二分查詢資料結構演算法
- 【資料結構】折半查詢(二分查詢)資料結構
- 資料結構與演算法——二分查詢演算法資料結構演算法
- 資料結構與演算法整理總結---二分查詢資料結構演算法
- 演算法與資料結構——二分查詢插入點演算法資料結構
- 資料結構和演算法面試題系列—二分查詢演算法詳解資料結構演算法面試題
- C語言_資料結構和演算法之_排序和查詢C語言資料結構演算法排序
- [資料結構] 二分查詢 (四種寫法)資料結構
- iOS標準庫中常用資料結構和演算法之查詢iOS資料結構演算法
- 【Java資料結構與演算法】簡單排序、二分查詢和異或運算Java資料結構演算法排序
- 淺談演算法和資料結構(10):平衡查詢樹之B樹演算法資料結構
- 資料結構與演算法:查詢演算法資料結構演算法
- 6-1 二分查詢 (20分) PTA 資料結構資料結構
- javascript資料結構之二分查詢簡單介紹JavaScript資料結構
- 淺談演算法和資料結構(9):平衡查詢樹之紅黑樹演算法資料結構
- 【資料結構基礎應用】【查詢和排序演算法】資料結構排序演算法
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 查詢演算法__二分查詢演算法
- 淺談演算法和資料結構(8):平衡查詢樹之2-3樹演算法資料結構
- 資料結構與演算法——單詞查詢樹資料結構演算法
- 【演算法資料結構Java實現】折半查詢演算法資料結構Java
- 從零開始學資料結構和演算法 (五) 分治法 (二分查詢、快速排序、歸併排序)資料結構演算法排序
- 重學資料結構和演算法(三)之遞迴、二分、字串匹配資料結構演算法遞迴字串匹配
- 查詢演算法之二分查詢演算法
- 淺談演算法和資料結構(7):二叉查詢樹演算法資料結構
- 資料結構和演算法之-列表資料結構演算法
- 資料結構-單連結串列查詢按序號查詢資料結構
- 演算法與資料結構之並查集演算法資料結構並查集
- 23.資料結構 查詢資料結構
- 資料結構與演算法-二叉查詢樹資料結構演算法
- 資料結構與演算法 第五章 查詢資料結構演算法
- 【演算法】二分查詢演算法
- 二分查詢演算法演算法
- 演算法->二分查詢演算法
- 資料結構與演算法——查詢演算法-斐波那契(黃金分割法)查詢資料結構演算法
- 資料結構和演算法之——跳錶資料結構演算法