Python查找算法之插補(bǔ)查找算法的實(shí)現(xiàn)
一、插補(bǔ)查找算法
插補(bǔ)查找算法又稱為插值查找,它是折半查找算法的改進(jìn)版。插補(bǔ)查找是按照數(shù)據(jù)的分布,利用公式預(yù)測(cè)鍵值所在的位置,快速縮小鍵值所在序列的范圍,慢慢逼近,直到查找到數(shù)據(jù)為止。根據(jù)描述來看,插值查找類似于平常查英文字典的方法。例如,在查一個(gè)以字母 D 開頭的英文單詞時(shí),決不會(huì)用折半查找法。根據(jù)英文詞典的查找順序可知,D 開頭的單詞應(yīng)該在字典較前的部分,因此可以從字典前部的某處開始查找。鍵值的索引計(jì)算,公式如下:
middle=left+(target-data[left])/(data[right]-data[left])*(right-left)
參數(shù)說明:
- middle:所求的邊界索引。
- left:最左側(cè)數(shù)據(jù)的索引。
- target:鍵值(目標(biāo)數(shù)據(jù))。
- data[left]:最左側(cè)數(shù)據(jù)值。
- data[right]:最右側(cè)數(shù)據(jù)值。
- right:最右側(cè)數(shù)據(jù)的索引。
例如,已經(jīng)有排序好的數(shù)列:34、53、57、68、72、81、89、93、99。要查找的數(shù)據(jù)是 53,使用插補(bǔ)查找法步驟如下:
步驟1:將數(shù)據(jù)列出來并利用公式找到邊界值,計(jì)算過程如下:
將各項(xiàng)數(shù)據(jù)帶入公式:

將數(shù)據(jù)取整,因此所求索引是 2,對(duì)應(yīng)的數(shù)據(jù)是 57,將查找目標(biāo)數(shù)據(jù) 53 與 57 進(jìn)行比較,如下圖所示。

步驟2:將 53 與 57 進(jìn)行比較,結(jié)果是 53 小于 57,所以查找 57 的左半邊數(shù)據(jù),不用考慮右半邊的數(shù)據(jù),索引范圍縮小到 0 和 2 之間,公式帶入:

取整之后索引是 1,對(duì)應(yīng)的數(shù)據(jù)是 53,將查找目標(biāo)數(shù)據(jù) 53 與 53 進(jìn)行比較,如下圖所示:

步驟3:將 53 與 53 進(jìn)行比較,所得結(jié)果相等,查找完成。說明:如果多次分割之后沒有找到相等的值,表示這個(gè)鍵值沒有在這個(gè)數(shù)列中。
通過上述的步驟1就能看出,插補(bǔ)查找算法比折半查找算法的取值范圍更小,因此它的速度要比折半法查找快,這就是插補(bǔ)查找算法的優(yōu)點(diǎn)。
二、實(shí)例:利用插補(bǔ)查找用戶輸入的數(shù)據(jù)
用戶可以隨意輸入一組數(shù)據(jù),例如本實(shí)例輸入一組數(shù)據(jù):34、53、57、68、72、81、89、93、99。在這組數(shù)據(jù)中用插補(bǔ)查找法分別查找數(shù)據(jù) 57、53、93、89、100,且顯示每次查找的過程。用 Python 代碼實(shí)現(xiàn)此過程,具體代碼如下:
def insert_search(data, num):
"""
自定義查找函數(shù):該函數(shù)使用的是插補(bǔ)查找算法
:param data: 原數(shù)列data
:param num: 鍵值num
:return:
"""
# 計(jì)算
left_index = 0 # 最左側(cè)數(shù)據(jù)的索引
right_index = len(data) - 1 # 最右側(cè)數(shù)據(jù)的索引
print("正在查找.......") # 提示
while left_index <= right_index:
# 使用公式計(jì)算出索引值
middle = left_index + (num - data[left_index]) / (data[right_index] - data[left_index]) * (
right_index - left_index)
# 取整
middle = int(middle)
# print(middle)
if num == data[middle]:
return middle # 如果鍵值等于邊界值,返回邊界位置
elif num < data[middle]:
# 輸出位置在數(shù)列中的左半邊
print(f"{num} 介于位置{left_index + 1}[{data[left_index]}]和邊界值{middle + 1}[{data[middle]}]之間,找左半邊......")
right_index = middle - 1 # 如果鍵值小于邊界值,最右邊數(shù)據(jù)索引等于邊界位置減1
else:
# 輸出位置在數(shù)列中的左半邊
print(f"{num} 介于位置{middle + 1}[{data[middle]}]和邊界值{right_index + 1}[{data[right_index]}]之間,找右半邊......")
left_index = middle + 1 # 如果鍵值大于邊界值,最左邊數(shù)據(jù)索引等于邊界位置加1
return -1 # 自定義函數(shù)到此結(jié)束
inp_num = 0 # 定義變量,用來輸入鍵值
num_list = [34, 53, 57, 68, 72, 81, 89, 93, 99] # 定義數(shù)列
print("數(shù)據(jù)內(nèi)容是:")
for index, ele in enumerate(num_list):
print(f" {index + 1}[{ele}]", end="") # 輸出數(shù)列
print("")
flag = True # 開關(guān),用來管控是否多次查找
while flag: # 循環(huán)查找
inp_num = int(input("請(qǐng)輸入要查找的鍵值:").strip()) # 輸入查找鍵值
result = insert_search(num_list, inp_num) # 調(diào)用自定義的查找函數(shù)——insert_search()函數(shù)
if result == -1: # 判斷查找結(jié)果是否是-1
print(f"沒有找到[{inp_num}]") # 若為-1,提示沒有找到值
else:
# 若不為-1,提示查找位置
print(f"在{result + 1}個(gè)位置找到[{inp_num}]")
char = input("本次查找結(jié)束,是否繼續(xù)查找,請(qǐng)輸入 y(Y) 或 n(N):").strip()
if char.upper() == "N":
flag = False
程序執(zhí)行結(jié)果如下圖所示:

到此這篇關(guān)于Python查找算法之插補(bǔ)查找算法的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 插補(bǔ)查找算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python常用外部指令執(zhí)行代碼實(shí)例
- Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析
- 如何安裝并使用conda指令管理python環(huán)境
- python執(zhí)行CMD指令,并獲取返回的方法
- Python機(jī)器學(xué)習(xí)之KNN近鄰算法
- Python機(jī)器學(xué)習(xí)算法之決策樹算法的實(shí)現(xiàn)與優(yōu)缺點(diǎn)
- 用Python給圖像算法做個(gè)簡(jiǎn)單應(yīng)用界面
- Python實(shí)現(xiàn)七大查找算法的示例代碼
- python實(shí)現(xiàn)狄克斯特拉算法
- python使用ProjectQ生成量子算法指令集
相關(guān)文章
python 實(shí)現(xiàn)Harris角點(diǎn)檢測(cè)算法
這篇文章主要介紹了python 實(shí)現(xiàn)Harris角點(diǎn)檢測(cè)算法,幫助大家更好的利用python處理圖像,感興趣的朋友可以了解下2020-12-12
Python 字節(jié)流,字符串,十六進(jìn)制相互轉(zhuǎn)換實(shí)例(binascii,bytes)
這篇文章主要介紹了Python 字節(jié)流,字符串,十六進(jìn)制相互轉(zhuǎn)換實(shí)例(binascii,bytes),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python集成測(cè)試提高軟件質(zhì)量關(guān)鍵步驟探究
Python是一門強(qiáng)大的編程語言,提供了眾多工具和庫,用于執(zhí)行高效的集成測(cè)試,本文將深入介紹Python集成測(cè)試的概念、方法和最佳實(shí)踐,并通過豐富的示例代碼演示如何提高軟件質(zhì)量和減少潛在的缺陷2024-01-01
python將類似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例
今天小編就為大家分享一篇python將類似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python如何在一個(gè)py文件中獲取另一個(gè)py文件中的值(一個(gè)或多個(gè))
這篇文章主要介紹了python如何在一個(gè)py文件中獲取另一個(gè)py文件中的值(一個(gè)或多個(gè)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
LyScript實(shí)現(xiàn)繞過反調(diào)試保護(hù)的示例詳解
LyScript插件中內(nèi)置的方法可實(shí)現(xiàn)各類反調(diào)試以及屏蔽特定API函數(shù)的功能,這類功能在應(yīng)對(duì)病毒等惡意程序時(shí)非常有效。本文為大家提供了LyScript實(shí)現(xiàn)繞過反調(diào)試保護(hù)的示例代碼,感興趣的可以了解一下2022-08-08
Python實(shí)現(xiàn)簡(jiǎn)單石頭剪刀布小游戲的示例代碼
石頭剪刀布是一種簡(jiǎn)單而又經(jīng)典的游戲,常常用于決定勝負(fù)或者娛樂消遣,本文將使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的石頭剪刀布游戲,需要的可以參考一下2023-06-06

