折半查找法,又称二分查找法,是一种基于有序数组的查找算法。这种算法通过将数组一分为二,然后确定目标值可能在哪个子数组中进行查找。如果目标值小于子数组中的中间值,则在左子数组中继续查找;否则,在右子数组中继续查找,直到找到目标值。 这么做的目的是快速缩小查找范围,降低查找时间复杂度。
折半查找法的基本思想是:将查找范围一分为二,每次查找时舍弃一半的数据,直到找到目标值或查找范围缩小到只剩一个元素。
在实际应用场景中,折半查找算法广泛用于对于有序数组或链表的查找。其主要应用于数据元素随机分布、表长较大的查找表中。
下面从多个角度对折半查找法进行分析。
一、算法实现
折半查找法的实现需要分别定义查找范围的首尾指针,然后计算中间位置的指针,不断缩小查找范围,直到查找成功或查找范围为空。具体实现代码如下:
```python
def binary_search(arr, x):
low = 0
high = len(arr) - 1
mid = 0
while low <= high:
mid = (high + low) // 2
if arr[mid] < x:
low = mid + 1
elif arr[mid] > x:
high = mid - 1
else:
return mid
return -1
```
二、时间复杂度
折半查找算法的时间复杂度为 $O(log_2n)$,其中n为数组长度。由于每次查找都将整个查找区间折半,因此时间复杂度与查找区间的长度有关,与数据规模无关。查找时间复杂度优于线性查找($O(n)$),因为线性查找算法的查找时间复杂度随着数据规模增大而线性增长。
三、空间复杂度
折半查找算法的空间复杂度为 $O(1)$,安排一个常量来代替mid等指针。
四、优点
(1) 折半查找法相对于其他查找算法的大优点在于可以将查找范围快速收缩到足够小的范围,从而使时间复杂度降低很多。
(2) 折半查找法的实现比较简单,适用于大多数程序语言,且用于有序数组查找时效率最高。
五、缺点
(1) 折半查找需要有序表的支持,因此在刚开始建表的时候就需要先排序,这增加了建表的成本。
(2) 折半查找法只适用于静态查找表,即查找表的内容没有发生变化。如果查找表内容经常变动,采用折半查找法就不太适用。
六、实例说明
折半查找法的实例包括在有序数组中查找目标数据、查找目标数据第一次出现的位置和最后一次出现的位置等。
当在有序数组[1, 3, 4, 7, 9, 12, 15, 19, 21]中查找15时,折半查找法的查找过程如下所示:
第一步:找到中间位置mid为7,与要查找的元素15进行比较,15在mid右边,舍弃左边的数列;
第二步:右边序列[15, 19, 21]开头为15,查找成功。
实验结果表明,折半查找法的执行时间受有序表的建立时间影响较大,如果处理数据量较小,不如顺序查找较好。
扫码咨询 领取资料