📜  数据结构和算法二进制搜索

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


二进制搜索是一种运行时间复杂度为O(log n)的快速搜索算法。这种搜索算法基于分而治之的原理。为了使该算法正常工作,数据收集应采用排序形式。

二进制搜索通过比较集合中最中间的项来查找特定项。如果发生匹配,则返回项目的索引。如果中间项目大于该项目,则在中间项目左侧的子数组中搜索该项目。否则,将在中间项目右侧的子数组中搜索该项目。该过程也将继续在子阵列上进行,直到子阵列的大小减小到零为止。

二进制搜索如何工作?

为了使二进制搜索有效,必须对目标数组进行排序。我们将通过一个图形示例来学习二进制搜索的过程。以下是我们的排序数组,让我们假设我们需要使用二进制搜索来搜索值31的位置。

二进制搜索

首先,我们将使用此公式确定数组的一半-

mid = low + (high - low) / 2

就是0+ (9-0)/ 2 = 4(4.5的整数值)。因此,4是数组的中间。

二进制搜索

现在,我们将存储在位置4的值与要搜索的值(即31)进行比较。我们发现位置4的值是27,这不是匹配项。由于该值大于27,并且我们有一个已排序的数组,因此我们也知道目标值必须在数组的上部。

二进制搜索

我们将低端更改为中端+ 1,然后再次找到新的中间值。

low = mid + 1
mid = low + (high - low) / 2

现在我们的新中数是7。我们将存储在位置7的值与目标值31进行比较。

二进制搜索

存储在位置7的值不是匹配项,而是比我们正在寻找的值更大的值。因此,该值必须位于此位置的下部。

二进制搜索

因此,我们再次计算中点。这次是5。

二进制搜索

我们将存储在位置5的值与目标值进行比较。我们发现这是一场比赛。

二进制搜索

我们得出结论,目标值31存储在位置5。

二进制搜索将可搜索的项目减半,从而将进行比较的次数减少到非常少的数目。

伪码

二进制搜索算法的伪代码应如下所示-

Procedure binary_search
   A ← sorted array
   n ← size of array
   x ← value to be searched

   Set lowerBound = 1
   Set upperBound = n 

   while x not found
      if upperBound < lowerBound 
         EXIT: x does not exists.
   
      set midPoint = lowerBound + ( upperBound - lowerBound ) / 2
      
      if A[midPoint] < x
         set lowerBound = midPoint + 1
         
      if A[midPoint] > x
         set upperBound = midPoint - 1 

      if A[midPoint] = x 
         EXIT: x found at location midPoint
   end while
   
end procedure

要了解使用C编程语言使用数组进行二进制搜索的实现,请单击此处