插值查找
一種基于二分查找的優(yōu)化算法,與二分查找相比,插值查找更加適用于數(shù)據(jù)分布較為均勻的有序數(shù)組。
插值查找算法基本思想
根據(jù)要查找的值與數(shù)組中最小值和最大值的比較,估算出要查找的值在數(shù)組中的大致位置,然后按照二分查找的方式進(jìn)行查找。
插值查找算法的具體實(shí)現(xiàn)步驟如下:
在要查找的有序數(shù)組中,確定要查找的值的范圍,即最小值和最大值;
根據(jù)要查找的值與最小值和最大值的比較,估算要查找的值在數(shù)組中的位置,計(jì)算出中間值;
將中間值與要查找的值進(jìn)行比較,如果相等,則返回中間值所在的位置;
如果中間值大于要查找的值,則在左側(cè)范圍內(nèi)繼續(xù)查找,將最大值更新為中間值減一;
如果中間值小于要查找的值,則在右側(cè)范圍內(nèi)繼續(xù)查找,將最小值更新為中間值加一;
如果要查找的值在數(shù)組中不存在,則返回查找失敗的結(jié)果。
與二分查找相比,插值查找算法的優(yōu)點(diǎn)在于對于數(shù)據(jù)分布較為均勻的有序數(shù)組,查找速度更快,而且時間復(fù)雜度也能達(dá)到O(log log n)級別。但是,對于數(shù)據(jù)分布不均勻的數(shù)組,插值查找算法的性能可能會劣于二分查找。
下面是插值查找算法的Python實(shí)現(xiàn)代碼:
def interpolation_search(arr, low, high, x):
"""
插值查找算法
:param arr: 要查找的有序數(shù)組
:param low: 查找范圍的最小值
:param high: 查找范圍的最大值
:param x: 要查找的值
:return: 查找結(jié)果,如果找到,則返回元素的下標(biāo),否則返回-1
"""
while low <= high and arr[low] <= x <= arr[high]:
mid = low + (x - arr[low]) * (high - low) // (arr[high] - arr[low])
if arr[mid] == x:
return mid
elif arr[mid] < x:
low = mid + 1
else:
high = mid - 1
return -1
斐波那契查找
一種基于斐波那契數(shù)列的查找算法,與二分查找類似,只是每次將數(shù)組分成比例不同的兩部分,而不是像二分查找一樣分成相等的兩部分。
斐波那契查找的思路如下:
使用斐波那契數(shù)列作為分割點(diǎn)的數(shù)組下標(biāo)。
將目標(biāo)值與斐波那契數(shù)列上的元素比較,根據(jù)比較結(jié)果向左或向右查找。
如果目標(biāo)值在左半邊,則將區(qū)間范圍縮小到左半邊,重新計(jì)算斐波那契數(shù)列上的分割點(diǎn);如果目標(biāo)值在右半邊,則將區(qū)間范圍縮小到右半邊,重新計(jì)算斐波那契數(shù)列上的分割點(diǎn);如果目標(biāo)值等于當(dāng)前查找的元素,則返回該元素的下標(biāo)。
斐波那契查找的優(yōu)點(diǎn)是能夠在數(shù)組長度較大時,更快地找到目標(biāo)元素,但其缺點(diǎn)是需要在查找前計(jì)算斐波那契數(shù)列,時間復(fù)雜度較高。文章來源:http://www.zghlxwxcb.cn/news/detail-421603.html
以下是使用Python實(shí)現(xiàn)的斐波那契查找的代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-421603.html
def fib_search(arr, target):
# 計(jì)算斐波那契數(shù)列
fib = [0, 1]
while fib[-1] < len(arr):
fib.append(fib[-1] + fib[-2])
# 初始化左右邊界和斐波那契分割點(diǎn)
left, right = 0, len(arr) - 1
k = len(fib) - 1
# 在斐波那契分割點(diǎn)附近查找
while k > 0:
# 計(jì)算新的左右邊界和斐波那契分割點(diǎn)
idx = min(left + fib[k - 1], len(arr) - 1)
if target < arr[idx]:
k -= 1
right = idx - 1
elif target > arr[idx]:
k -= 2
left = idx + 1
else:
return idx
# 沒有找到目標(biāo)元素
return -1
到了這里,關(guān)于插值查找和斐波那契查找的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!