03 兩種查詢演算法實現

2021-09-28 14:52:01 字數 2615 閱讀 8019

什麼是列表查詢;

順序查詢(線性查詢);

二分查詢;

順序查詢與二分查詢比較;

執行時間;

增速問題

一:什麼是查詢

二:順序查詢(線性查詢):從列表中查詢指定的元素

定義:從列表的第乙個元素開始,順序進行搜尋,直到找到元素或搜尋到列表最後乙個元素為止。

#線性查詢的**實現

#enumerate() 函式用於將乙個可遍歷的資料物件(如列表、元組或字串)組合為乙個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。

#教程:

deflinear_search

(li,var)

:for index,v enumerate

(li)

:if v == var:

return index

else

:return

none

複雜度:範圍是列表(n),乙個for迴圈====》o(n) 從頭到尾遍歷每個元素

三:二分查詢定義

​ 又叫折半查詢,從有序列表(必須為有序)的初始候選區list[o:n]開始,通過對待查詢的值與候選區中間值的比較,可以使候選區減少一半。(僅當列表為有序的時候,二分查詢才管用)

舉例:從下面列表中查詢3元素:

首先我們需要對候選區做乙個了解,這樣有助於我們更好的理解,

在上面的列表中我們使1所在的位置為left,9所在的位置為right,這樣從left-right就是候選區,

​ 候選區中間值(mid) =(left-right)// 2;如果我們需要查詢的值(val)大於候選區中間值(mid),則左邊的值為:left = mid+1 ,right不變,候選區為:【(mid+1),right】;相反:查詢的值(val)小於候選區中間值(mid),則left不變,右邊值為:right = mid - 1,候選區為【left, ( mid -1)】

然後依次進行取值,其中left、mid、right都是指的值的下標;如果最後left>right,則表示該範圍沒有所需要的值。

**如下:

def

binary_search

(li,val)

:#li傳入的列表,val所需要的值

'''定義值'''

left =

0 right =

len(li)-1

while left <= right:

#候選區有值

mid =

(right+left)//2

#候選區中間值

if li[mid]

== val:

return mid

elif li[mid]

> val:

#帶查詢的值在中間值(mid)的左側

right = mid -

1else

:#li[mid] < val 帶查詢的值在中間值(mid)的右側

left = mid +

1else

:return

none

四:順序查詢與二分查詢比較

​ 我們在使用大o表示法討論執行時間時,log指的都是log2。使用簡單查詢法查 找元素時,在最糟情況下需要檢視每個元素。

​ 因此,如果列表包含8個數字,你最多需要檢查8 個數字。而使用二分查詢時,最多需要檢查log n個元素。如果列表包含8個元素,你最多需要 檢查3個元素,因為log 8 = 3(2^3 = 8)。如果列表包含1024個元素,你最多需要檢查10個元素, 因為log 1024 = 10(2^10 =1024)。

五:兩者執行時間

選擇演算法的時候我們本能的選擇效率最高的,以最大限度的減少執行時間或者占用空間。

如果列表包含100個數字,順序查詢最多需要猜100次,40億個數字,則最多需要才40億次;順序查詢最多需要猜測的次數與列表長度相同==》執行時間線性時間。

二分查詢的話最多猜7次,40億最多猜32(log2^32)次===>執行時間表示為對數時間。

六:增速問題 (演算法的執行時間以不同的速度增加 )

時間線性時間。

二分查詢的話最多猜7次,40億最多猜32(log2^32)次===>執行時間表示為對數時間。

六:增速問題 (演算法的執行時間以不同的速度增加 )

隨著元素數量的增加,二分查詢需要的額外時間並不多, 而順序查詢需要的額外時間卻很多。因此,隨著列表的增長,二分查詢的速度比順序查詢快得多,但如果是無序列表,使用二分查詢的話需要進行排序,兩者各有優缺點。

變位詞 兩種演算法實現

方案一 使用資料結構 map。兄弟單詞共用乙個簽名key,key為單詞內部排序後的詞條,list儲存同一key的單詞集合 相對於程式設計珠璣中的方法,該方法在空間上節省了每個單詞乙個key的空間 在時間上,不再需要二分查詢,o 1 的查詢 但是這種方法還可以優化,見方案二 方案二 使用trie樹。t...

兩種查詢方法

1.問題 寫出兩種檢索演算法 在乙個排好序的陣列t 1 n 中查詢x,如果x在t中,輸出x在t的下標j 如果x不在t中,輸出j 0.按實驗模板編寫,分析 部分僅給出複雜度結果即可。2.解析 問題的理解和推導,可用電子版直接在此編寫,也可用紙筆推導,拍照嵌入本文件 1.順序查詢,最簡單最經典的思路,從...

C 兩種查詢演算法的比較

網上找了不少資料關於c 中獲得當前系統時間也給個鏈結,以備不時之需!我的實驗就是比較順序排序和二分排序在大資料量的情況下的差異,構造了乙個mytimer類用於記錄程式執行所消耗的時間!演算法 不貼了,main 的部分貼出來!測試結果 兩者之間演算法的差距太大了.如果不是怕浪費時間,肯定採用更大的陣列...