在日常生活中,幾乎每天都要進行一些查詢的工作,在**簿中查閱某個人的**在電腦的資料夾中查詢某個具體的檔案等等。
查詢表是由同一型別的資料元素構成的集合。例如**號碼簿和字典都可以看作是一張查詢表。
一般對於查詢表有以下幾種操作:
在查詢表中查詢某個具體的資料元素;
在查詢表中插入資料元素;
從查詢表中刪除資料元素。
查詢表術語
靜態查詢表:在查詢表中只做查詢操作,而不改動表中資料元素,稱此類查詢表為靜態查詢表。
動態查詢表:在查詢表中做查詢操作的同時進行插入資料或者刪除資料的操作,稱此類表為動態查詢表。
關鍵字:關鍵字又細分為主關鍵字和次關鍵字。
主關鍵字:若某個關鍵字可以唯一地識別乙個資料元素時,稱這個關鍵字為主關鍵字,例如學生的學號就具有唯一性。
次關鍵字:像學生姓名、年齡這類的關鍵字,由於不具有唯一性,稱為次關鍵字。
演算法描述:
從表中的最後乙個資料元素開始,逐個同記錄的關鍵字做比較,如果匹配成功,則查詢成功;如果直到表中第乙個關鍵字查詢完也沒有成功匹配,則查詢失敗。
如下圖所示:
下面我們用python去實現順序查詢演算法,**如下:
def sequence_search(array, key):
"""順序查詢演算法
"""for i in range(len(array)):
if array[i] == key:
return i
return false
array_0 = [23, 43, 12, 54, 65, 48]
print(sequence_search(array_0, 12))
會把查詢到的數字的索引值列印出來,輸出結果如下:
折半搜尋也稱二分搜尋、對數搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法。
演算法描述:
搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。
優缺點:
注意:折半查詢演算法只適用於有序表,無序表不可以用折半查詢演算法。
下面我們看乙個具體的折半查詢的例子,並分析具體過程:
對採用折半查詢演算法查詢關鍵字為 21 的過程為:
1. 21 < 56 21一定存在於 low 和 mid 指向的區域中間,如下圖:
2. 更新 high 指標和 mid 指標的位置,令 high 指標移動到 mid 指標的左側同時令 mid 重新指向 low 指標和 high 指標的中間位置。19 < 21,21肯定處於 mid 和 high 指向的區域中,如下圖:
3.當第三次做判斷時,發現 mid 就是關鍵字 21 ,查詢結束,如下圖:
半查詢的執行過程可以用二叉樹來描述,這棵樹通常稱為「判定樹」。
下面用python實現折半查詢演算法,**如下:
def halffind(nums, key, low, high):
"""二分查詢遞迴實現
"""mid = (low + high) // 2
if key == nums[mid]:
return mid
if low > high:
return false
if key > nums[mid]:
return halffind(nums, key, mid + 1, high)
else:
return halffind(nums, key, low, mid - 1)
對其進行測試,測試**如下:
if __name__ == "__main__":
nums = [-789, -96, -53, 23, 52, 56, 520] # 測試案例
key = int(input("請輸入要搜尋的關鍵字:"))
print(halffind(nums, key, 0, len(nums)))
測試結果如下:
查詢演算法 二分查詢python實現
二分查詢 時間複雜度為o logn 空間複雜度為o 1 二分查詢也叫做折半查詢,是一種在有序陣列中查詢某一特定元素的查詢演算法。查詢過程從中間元素開始。如果中間元素正好是要查詢的元素,則查詢過程結束。def binary search1 arr,value binary search1 尋找與val...
Python查詢演算法之插補查詢演算法的實現
插補查詢演算法又稱為插值查詢,它是折半查詢演算法的改進版。插補查詢是按照資料的分布,利用公式 鍵值所在的位置,快速縮小鍵值所在序列的範圍,慢慢逼近,直到查詢到資料為止。根據描述來看,插值查詢類似於平常查英文本典的方法。例如,在查乙個以字母 d 開頭的英文單詞時,決不會用折半查詢法。根據英文詞典的查詢...
python 實現演算法 Python實現演算法 一
1.二分查詢 def binary search mylist,item low 0 high len mylist 1 while low high mid low high 2 如果 low high 2不是偶數,python自動將mid向下圓整。guess mylist mid if gues...