📜  数据结构-插值搜索

📅  最后修改于: 2021-01-11 10:19:15             🧑  作者: Mango


插值搜索是二进制搜索的改进变体。该搜索算法在所需值的探测位置上起作用。为了使该算法正常工作,数据收集应采用排序形式并平均分配。

与线性搜索相比,二进制搜索具有时间复杂性的巨大优势。线性搜索的最坏情况复杂度为Ο(n),而二进制搜索的复杂度为Ο(log n)。

在某些情况下,可能会事先知道目标数据的位置。例如,在电话号码簿的情况下,如果我们要搜索Morphius的电话号码。在这里,线性搜索甚至二进制搜索似乎都很慢,因为我们可以直接跳转到名称以“ M”开头的存储空间。

二进制搜索中的定位

在二进制搜索中,如果找不到所需的数据,则列表的其余部分分为上下两个部分。搜索在其中一个中进行。

BST第一步BST第二步BST步骤三BST第四步

即使对数据进行了排序,二进制搜索也无法利用它来探测所需数据的位置。

插值搜索中的位置探测

插值搜索通过计算探针位置来找到特定项目。最初,探针位置是集合中最中间一项的位置。

插值第一步插值第二步

如果发生匹配,则返回该项目的索引。要将列表分为两部分,我们使用以下方法-

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编程语言实现插值搜索的实现,请单击此处