二分查詢的平均查詢長度 二分查詢

2021-10-18 02:00:11 字數 2312 閱讀 7367

資料的查詢在計算機的操作中非常常見,那麼我們應該怎樣在計算機中實現查詢操作呢?

最簡單的一種方法:「傻找」,也就是乙個乙個的找,我們把陣列中的每個元素都和我們想要查詢的目標元素進行比對,看一下列表中是否有和這個元素相同的元素,如果我們想要尋找的那個目標元素在列表**現了,那麼就宣告查詢成功,這種演算法寫成**是這個樣子的:

#假設我們想要在0-100之間來尋找某個元素

item = int(input("請輸入你想查詢的元素: ")) #輸入的元素預設格式為str型別,要先轉成int型別

item_index = 0 # 目標元素在陣列中的位置

temp = -1

for i in range(100):

if i == item:

item_index = i + 1

temp = 1

break

else:

temp = -1

if temp == 1:

print("陣列中有你想要找的元素,它的位置在:{}".format(item_index))

else:

print("陣列中沒有你想要找的元素!")

這就是簡單查詢,我們這裡用的是乙個有序列表,在實際情況中,我們更多碰到是無序列表(當然我們也可以先用排序演算法先排好序,再進行查詢),但無論有序還是無序的列表,這種演算法的時間複雜度都為o(n),即我們每次尋找目標元素都要進行遍歷(乙個乙個地找),當資料量非常龐大的時候,這種演算法就會顯得效率極低。

既然簡單查詢的效率非常低,那我們有沒有更好的辦法來進行查詢操作呢?

當然是有的,那就是二分查詢了。二分查詢是一種比簡單查詢高效的多的查詢方法,為什麼這麼講呢?二分查詢的實現邏輯是:當你想讓我猜某個數字在不在列表中的時候,我每次都猜列表最中間的那個數字,然後用這個最中間的數字來和要猜數字進行比較,這樣的好處就在於每次猜測都可以排除掉一半的元素,就像下圖這樣:

這樣就極大的提公升了效率,看一下**:

def binary_search(list,item):

low = 0 #陣列的開頭

high = len(list) - 1 #陣列的結尾

while low <= high:

mid = (low + high) // 2

guess = list[mid]

if guess == item:

return "列表中存在此元素"

if guess > item:

high = mid - 1

else:

low = mid + 1

return "列表中沒有此元素"

nums = list(range(100))

item = int(input("請輸入想要查詢的數字:"))

print(binary_search(nums,item))

tips:這個**中return的部分是為了方便理解,一般情況下是要return個true或者false的

這就是二分查詢,二分查詢的演算法時間複雜度相比簡單查詢有了很大提公升,時間複雜度為o(logn),這個演算法時間複雜度相比於簡答查詢就快了很多,當資料量非常大的時候,就可以看出區別。100個元素時,簡單查詢就要進行100步操作,而二分查詢就只要進行log10(100)次,即7次就可以找到那個元素,當資料量越大,二分查詢演算法就越有優勢:

我們假設計算機每進行一步操作要花費一毫秒

簡單查詢 二分查詢

100個元素 100毫秒 7毫秒

10000個元素 10秒 14毫秒

1000000000個元素 11天 30毫秒

這裡的關鍵就在於理解對數的概念,log 10 (100)就相當於在問,多少個10相乘等於100。我們都知道指數增長的非常快,而對數作為指數的逆運算,自然而然的會讓數量級的下降速度變得非常快,這個下降速度就相當於指數的增長速度。

這也就是為什麼二分查詢如此高效的根本原因。由此也可以看出數學對於計算機的重要性,歷史幾乎所有的計算機科學家都首先是數學家,例如巴貝奇、圖靈、馮-諾依曼這些計算機的底層原理構建者。

如果有人告訴你,你數學好對你的計算機學習會有一些幫助,那麼這個人一定是在胡扯,因為計算機所有的底層原理都可以追溯到數學方法,演算法從某種程度上也可以說是用計算機語言將數學方法實現出來了。數學沒了計算機依然可以發展,而計算機沒了數學就會不復存在。

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

查詢 二分查詢

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素 按關鍵字有序排列 首先,假設表中元素是按 公升序排列 將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成前 後兩...

查詢 二分查詢

參考 原始碼 目錄 順序查詢 二分查詢 插值查詢 斐波那契查詢 分塊查詢 雜湊查詢 二叉樹查詢 紅黑樹查詢 演算法簡介 二分查詢 binary search 是一種在有序陣列中查詢某一特定元素的查詢演算法。查詢過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則查詢過程結束 如果某一特定元素...