插補查詢演算法又稱為插值查詢,它是折半查詢演算法的改進版。插補查詢是按照資料的分布,利用公式**鍵值所在的位置,快速縮小鍵值所在序列的範圍,慢慢逼近,直到查詢到資料為止。根據描述來看,插值查詢類似於平常查英文本典的方法。例如,在查乙個以字母 d 開頭的英文單詞時,決不會用折半查詢法。根據英文詞典的查詢順序可知,d 開頭的單詞應該在字典較前的部分,因此可以從字典前部的某處開始查詢。鍵值的索引計算,公式如下:
middle=left+(target-data[left])/(data[right]-data[left])*(right-left)
引數說明:
例如,已經有排序好的數列:34、53、57、68、72、81、89、93、99。要查詢的資料是 53,使用插補查詢法步驟如下:
步驟1:將資料列出來並利用公式找到邊界值,計算過程如下:
將各項資料帶入公式:
將資料取整,因此所求索引是 2,對應的資料是 57,將查詢目標資料 53 與 57 進行比較,如下圖所示。
步驟2:將 53 與 57 進行比較,結果是 53 小於 57,所以查詢 57 的左半邊資料,不用考慮右半邊的資料,索引範圍縮小到 0 和 2 之間,公式帶入:
取整之後索引是 1,對應的資料是 53,將查詢目標資料 53 與 53 進行比較,如下圖所示:
步驟3:將 53 與 53 進行比較,所得結果相等,查詢完成。說明:如果多次分割之後沒有找到相等的值,表示這個鍵值沒有在這個數列中。
通過上述的步驟1就能看出,插補查詢演算法比折半查詢演算法的取值範圍更小,因此它的速度要比折半法查詢快,這就是插補查詢演算法的優點。
使用者可以隨意輸入一組資料,例如本例項輸入一組資料:34、53、57、68、72、81、89、93、99。在這組資料中用插補查詢法分別查詢資料 57、53、93、89、100,且顯示每次查詢的過程。用 python **實現此過程,具體**如下:
def insert_search(data, num):
"""自定義查詢函式:該函式使用的是插補查詢演算法
:param data: 原數列data
:param num: 鍵值num
:return:
"""# 計算
left_index = 0 # 最左側資料的索引
right_index = len(data) - 1 # 最右側資料的索引
print("正在查詢.......") # 提示
while left_index <= right_index:
# 使用公式計算出索引值
程式設計客棧 middle = left_index + (num - data[left_index]) / (data[right_inde - data[left_index]) * (
right_index - left_index)
# 取整
middle = int(middle)
# print(middle)
if num == data[middle]:
return middle # 如果鍵值等於邊界值,返回邊界位置
elif num < data[middle]:
# 輸出位置在數列中的左半邊
print(f" 介於位置和邊界值之間,找左半邊......")
right_index = middle - 1 # 如果鍵值小於邊界值,最右邊資料索引等於邊界位置減1
else:
# 輸出位置在數列中的左半邊
print(f" 介於位置和邊界值之間,找右半邊......")
left_index = middle + 1 # 如果鍵值大於邊界值,最左邊資料索引等於邊界位置加1
return -1 # 自定義函式到此結束
inp_num = 0 # 定義變數,用來輸入鍵值
num_list = [34, 53, 57, 68, 72, 81, 89, 93, 99] # 定義數列
print("資料內容是:")
for index, ele in enumerate(num_list):
print(f" ", end="") # 輸出數列
print("")
flag = true # 開關,用來管控是否多次查詢
while flag: # 迴圈查詢
inp_num = int(input("請輸入要查詢的鍵值:").strip(dexun)) # 輸入程式設計客棧查詢鍵值
result = insert_search(num_list, inp_num) # 呼叫自定義的查詢函式——insert_search()函式
if result == -1: # 判斷查詢結果是否是-1
print(f"沒有找到") # 若為-1,提示沒有找到值
else:
# 若不為-1,提示查詢位置
print(f"在個位置找到")
char = input("本次查詢結束,是否繼續查詢,請輸入 y(y) 或 n(n):").strip()
if char.upper() == "n":
flag = false
程式執行結果如下圖所示:
查詢演算法之插值查詢
插值查詢相對於重複二分查詢,則進行了複雜的四則運算,是二分查詢法的優化。插值查詢 param string find 要查詢的值 param array array 要查詢的陣列 return bool string function interpolationsearch find array a...
我所知道查詢演算法之插值查詢
二分查詢演算法根據折半進行查詢,但是還能根據二分查詢進行優化嗎?假設我們現在有陣列arr 我們使用二分法查詢 1 那麼根據特性執行會執行幾次操作 先是找到中間值 二分 再進行二分.那麼能不能通過自適應的方案,快速定位到需要查詢的值呢?那麼就可以使用插值查詢演算法 插值查詢原理介紹 1.插值查詢演算法...
插值查詢演算法
插值查詢演算法是基於二分查詢演算法的,只是在查詢的過程中計算middle的方式有所改變,比如一組可以通過二分查詢演算法計算出的nmid索引的值,是這樣子計算的 nmid nlow nhigh 2,但是插值查詢演算法是根據比率算出的,nmid nlow key narr nlow narr nhigh...