Python查詢演算法之插補查詢演算法的實現

2022-09-25 22:27:15 字數 2522 閱讀 6871

插補查詢演算法又稱為插值查詢,它是折半查詢演算法的改進版。插補查詢是按照資料的分布,利用公式**鍵值所在的位置,快速縮小鍵值所在序列的範圍,慢慢逼近,直到查詢到資料為止。根據描述來看,插值查詢類似於平常查英文本典的方法。例如,在查乙個以字母 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...