📅  最后修改于: 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编程语言使用数组进行二进制搜索的实现,请单击此处。