📅  最后修改于: 2021-01-11 10:19:15             🧑  作者: Mango
插值搜索是二进制搜索的改进变体。该搜索算法在所需值的探测位置上起作用。为了使该算法正常工作,数据收集应采用排序形式并平均分配。
与线性搜索相比,二进制搜索具有时间复杂性的巨大优势。线性搜索的最坏情况复杂度为Ο(n),而二进制搜索的复杂度为Ο(log n)。
在某些情况下,可能会事先知道目标数据的位置。例如,在电话号码簿的情况下,如果我们要搜索Morphius的电话号码。在这里,线性搜索甚至二进制搜索似乎都很慢,因为我们可以直接跳转到名称以“ M”开头的存储空间。
在二进制搜索中,如果找不到所需的数据,则列表的其余部分分为上下两个部分。搜索在其中一个中进行。
即使对数据进行了排序,二进制搜索也无法利用它来探测所需数据的位置。
插值搜索通过计算探针位置来找到特定项目。最初,探针位置是集合中最中间一项的位置。
如果发生匹配,则返回该项目的索引。要将列表分为两部分,我们使用以下方法-
mid = Lo + ((Hi - Lo) / (A[Hi] - A[Lo])) * (X - A[Lo])
where −
A = list
Lo = Lowest index of the list
Hi = Highest index of the list
A[n] = Value stored at index n in the list
如果中间项目大于该项目,则再次在中间项目右侧的子数组中计算探针位置。否则,将在中间项目左侧的子数组中搜索该项目。该过程也将在子阵列上继续进行,直到子阵列的大小减小到零为止。
运行时插值搜索算法的复杂度为Ο(日志(log n)的)相比,BST的Ο(log n)的在有利的情况下。
由于这是对现有BST算法的一种改进,因此我们提到了使用位置探测来搜索“目标”数据值索引的步骤-
Step 1 − Start searching data from middle of the list.
Step 2 − If it is a match, return the index of the item, and exit.
Step 3 − If it is not a match, probe position.
Step 4 − Divide the list using probing formula and find the new midle.
Step 5 − If data is greater than middle, search in higher sub-list.
Step 6 − If data is smaller than middle, search in lower sub-list.
Step 7 − Repeat until match.
A → Array list
N → Size of A
X → Target Value
Procedure Interpolation_Search()
Set Lo → 0
Set Mid → -1
Set Hi → N-1
While X does not match
if Lo equals to Hi OR A[Lo] equals to A[Hi]
EXIT: Failure, Target not found
end if
Set Mid = Lo + ((Hi - Lo) / (A[Hi] - A[Lo])) * (X - A[Lo])
if A[Mid] = X
EXIT: Success, Target found at Mid
else
if A[Mid] < X
Set Lo to Mid+1
else if A[Mid] > X
Set Hi to Mid-1
end if
end if
End While
End Procedure
要了解用C编程语言实现插值搜索的实现,请单击此处。