先從乙個問題思考,假設我們現在查詢英語字典裡的一k為開頭的單詞。如果我們從頭開始翻,一直翻到k,那樣太浪費時間了。通常我們都會直接翻開字典中間開啟位置看看是什麼字母的,如果我們翻到了j,k在j後面,那麼我們繼續往後翻就到了,比從頭開始翻快多了。
二分查詢是一種演算法,其輸入是乙個有序的元素列表(必須有序)。如果要查詢的元素包含在列表中,二分查詢返回其位置,否則返回null。
再看乙個簡單的例子
如果我們現在在1到100裡的數字找99,如果我們重頭開始查詢,需要99步
如果我們用二分查詢,50->75->88->94->97->99,6次就能查詢,而且在這個範圍裡任何數字在7次內都能查詢完畢。
簡單查詢:最多需要100步
二分查詢:最多需要7步
當我們要查詢的有240000元素的字典,使用二分查詢,每次排除一般單詞,最多隻需18步。
一般而言,對於包含n個元素的列表,使用二分查詢最多需要log2n步,而簡單的查詢需要n步。
#include #include #include const int target = 120;
int arr[10]=;
int binary_search(int *p, int target, int len)
} return -1;
}int main()
執行結果
程式執行查詢4次,找到120在陣列arr[9].
假設有乙個包含128個名字的有序列表,你要使用二分查詢在其中查詢乙個名字,請
問最多需要幾步才能找到?
log(2)128 = 7 7次
上面列表的長度翻倍後,最多需要幾步?
8步
簡單查詢
二分查詢
100個元素
100ms
1ms10000個元素
10s14ms
1000000000個元素
11天32ms
僅知道演算法需要多長時間才能執行完畢還不夠,還需知道執行時間如何隨列表增長而增加。
大o表示演算法的執行速度。它的單位不是秒,而是運算元。比如說簡單查詢乙個含n個元素的列表,需要執行n次操作。而二分查詢需要執行log(2)n次。
簡單查詢的執行時間總是為o(n)。查詢adit時,一次就找到了,這是最佳的情形,但大o表示法說的是最糟的情形。因此,你可以說,在最糟情況下,必須檢視**簿中的每個條目,對應的執行時間為o(n)。這是乙個保證——你知道簡單查詢的執行時間不可能超過o(n)。
1. o(log n),也叫對數時間,這樣的演算法包括二分查詢。
2. o(n),也叫線性時間,這樣的演算法包括簡單查詢。
3. o(n * log n),這樣的演算法包括第4章將介紹的快速排序—— 一種速度較快的排序演算法。
4. o(n2),這樣的演算法包括第2章將介紹的選擇排序—— 一種速度較慢的排序演算法。
5. o(n!),這樣的演算法包括接下來將介紹的旅行商問題的解決方案—— 一種非常慢的演算法。
二分查詢的速度比簡單查詢快得多。
o(log n)比o(n)快。需要搜尋的元素越多,前者比後者就快得越多。
演算法執行時間並不以秒為單位。
演算法執行時間是從其增速的角度度量的。
演算法執行時間用大o表示法表示。
演算法學習之路 二分查詢
描述 給定乙個單調遞增的整數序列,問某個整數是否在序列中。輸入 第一行為乙個整數n,表示序列中整數的個數 第二行為n n不超過10000 個整數 第三行為乙個整數m m不超過50000 表示查詢的個數 接下來m行每行乙個整數k。輸出 每個查詢的輸出佔一行,如果k在序列中,輸出yes,否則輸出no。輸...
經典演算法學習 二分查詢
在所有的查詢演算法中,二分查詢是最簡單一種。二分查詢要求原先的序列是已經排序的,每次都是以序列中間的數字作為比較,如果小於中間的數字,那麼就在序列左邊繼續遞迴查詢 如果大於中間的數字,那麼就在序列右邊繼續遞迴查詢。直到找到該數字,或者直到序列中只有乙個數字的時候都還沒找到,則查詢失敗。查詢的時間複雜...
二分查詢演算法學習札記
二分查詢演算法學習札記 說明blog 二分查詢演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 在本篇文章中為了說明問題的方便,假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就...