困而學,學而知什麼是二分查詢演算法呢?
首先需要說明的是,只要在陣列有序的情況下,二分查詢才是有用。如果是乙個無序的陣列,二分查詢就沒有意義了。現在有1~100個數,當然是有序的,現在需要你猜乙個數。你每猜一次,我告訴你猜大了還是猜小了,那麼現在開始吧。
現在有三種方案
從1按照順序猜
我們來看看這種方式,如果從1按照順序猜,最好的情況就是第1次就猜中,最壞的情況就是最後一次才會猜中。
第二種方案是亂猜,這種方案和第一種方案的的結果是一樣,最好就是首次就猜中,最壞情況也是就是最後才猜中。
第三種方案則是使用我們今天要說二分查詢法,那又如何使用二分查詢法來猜呢?這種方案的最好和最壞的情況又分別的是什麼,也就是和上面的兩種方案比起來提公升點到底在**呢?容我慢慢道來。
顯而易見的,如果使用二分查詢,最好的情況都是一樣的,以第1次就能查到。但是最壞的情況則不然,其他兩種情況,最壞的情況需要100次,而使用二分查詢只需要7次,效率顯而易見。
專業人士就需要用專業解釋。使用第一種方案查詢是一種線性查詢,查詢的次數會根據需要查詢的數量遞增。也就是如果有n
個數字,最多就需要查詢n
次。而使用二分查詢最多隻需要log2n次。(先不嘮叨這個,後續會有單獨的文章來嘮叨)
從上面的對比來看,這個提公升點肯定是在查詢的次數上面了。那麼還有其他的提公升呢?
其實在演算法的效率的對比上面一直有兩個重要的點:空間
和時間
。上面我們比較了空間
複雜度,我們現在來看看他們的時間
複雜度。
這裡直接說結論吧,第一種方案的時間複雜度是:o(n),二分查詢法的時間複雜度是:o(logn)
這裡不嘮叨大o
表示法,後面緊跟著嘮叨。
想象一下,在億的數量下,二分查詢的效率有多高。
mysql中b+樹中節點內部資料查詢就是用到了二分查詢法話不多說,直接上菜。
private
static
intbinarysearch
(long
arr,
int item)
else
if(midval > item)
else
}return-1
;}
演算法 基礎篇 二分查詢
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後...
演算法 二分查詢演算法
思想 二分搜尋主要解決的問題是確定排序後的陣列x 0,n 1 中是否包含目標元素target。二分搜尋通過持續跟蹤陣列中包含元素target的範圍 如果target存在陣列中的話 來解決問題。一開始,這個範圍是整個陣列,然後通過將target與陣列中的中間項進行比較並拋棄一半的範圍來縮小範圍。該過程...
二分查詢演算法
1.第一步查詢中間元素,即5,由於5 6,則6必然在5之後的陣列元素中,那麼就在中查詢,2.尋找的中位數,為7,7 6,則6應該在7左邊的陣列元素中,那麼只剩下6,即找到了。二分查詢演算法就是不斷將陣列進行對半分割,每次拿中間元素和goal進行比較。include iostream using na...