什麼是列表查詢;
順序查詢(線性查詢);
二分查詢;
順序查詢與二分查詢比較;
執行時間;
增速問題
一:什麼是查詢
二:順序查詢(線性查詢):從列表中查詢指定的元素
定義:從列表的第乙個元素開始,順序進行搜尋,直到找到元素或搜尋到列表最後乙個元素為止。
#線性查詢的**實現
#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 的部分貼出來!測試結果 兩者之間演算法的差距太大了.如果不是怕浪費時間,肯定採用更大的陣列...