在電腦科學中,二分查詢(英語:binary search),也稱折半搜尋(英語:half-interval search)、對數搜尋(英語:logarithmic search),是一種在有序陣列中查詢某一特定元素的搜尋演算法。
搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;
如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。
如果在某一步驟陣列為空,則代表找不到。
這種搜尋演算法每一次比較都使搜尋範圍縮小一半。
按照上面的定義,我們來嘗試寫一下二分查詢法的**。
public static int binary(int arr, int data) else if (arr[mid] < data) else現在問你,上面的**有沒有問題?哪段**會出現 bug ?} return -1;
}
請思考一分鐘後再往下檢視。
對於上面這段**而言,問題出在第 6 行**處:
mid = (min + max) / 2;這句**在 min 和 max 很大的時候,會出現溢位的情況,從而導致陣列訪問出錯。
別看現在輕描淡寫的指出了這個錯誤,但這個錯誤在當時可是存在了好些年。
那怎麼改進呢?一般的做法是這樣的:將加法變成減法。
public static int binary(int arr, int data) else if (arr[mid] < data) else還有一種更高逼格的寫法,也是官方的二分搜尋法的實現寫法:使用位運算。} return -1;
}
public static int binary(int arr, int data) else if (arr[mid] < data) else} return -1;
}
python實現二分查詢(無bug)
二分查詢的優點 比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難 學習之前,在網上找了一些教程,測試過程中,總會有兼顧不到的地方,所以在此總結了一下,解決了大部分的漏洞。如果還有什麼問題,歡迎各位指正,如下 def sort list my list 首先將列表排序,這...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
二分查詢需要注意的Bug
不應該使用middle left right 2這種情況,否則對於大資料來說會產生溢位問題。切記!值不同的時候,left相對middle應該 1,不要直接用middle進行賦值。include include using namespace std 下面乙個移位是一樣的,相當於除去2,主要是要用ri...