演算法學習 1 二分查詢

2021-10-09 06:50:58 字數 1832 閱讀 2328

先從乙個問題思考,假設我們現在查詢英語字典裡的一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 二分查詢演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 在本篇文章中為了說明問題的方便,假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就...