binarySearch()实现二分查找
二分查找是一种高效的查找算法,也称为折半查找,它的前提条件是输入的数组必须是有序的。该算法减少了查找的次数,因此是一种较为快速的查找方法。在实际应用中,二分查找算法被广泛地应用于排序、搜索等领域。
二分查找的基本思想是:先将待查找的数据与数组的中间元素进行比较,如果待查找的数据小于中间元素,则在左半部分数组中继续查找;如果待查找的数据大于中间元素,则在右半部分数组中继续查找;如果待查找的数据等于中间元素,则查找成功。
二分查找的时间复杂度为O(log n),即每次查找都将原有的查找范围减少一半,因此在数据量较大的情况下,这种算法的效率得到了很好的提高。下面我们来实现一个二分查找的函数:
def binarySearch(arr, x):
low = 0
high = len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] < x:
low = mid + 1
elif arr[mid] > x:
high = mid - 1
else:
return mid
return -1
其中,arr表示输入的有序数组,x表示要查找的数值。函数返回x在数组中的索引值,如果x不存在于数组中,则返回-1。该函数实现了二分查找的基本算法,接下来我们分步解析它的实现过程。
首先,我们初始化low和high的值,low表示待查找区域的最小索引值,high表示待查找区域的最大索引值。在本例中,由于数组的下标从0开始,因此low的初始值为0,high的初始值为数组的长度减1。
然后,我们在while循环中不停地缩小查找范围,直到找到x或者是待查找区域不存在。在每一次循环中,我们计算出待查找区域的中间索引值mid。如果x小于arr[mid],则我们可以将查找范围缩小到左半部分数组;如果x大于arr[mid],则我们可以将查找范围缩小到右半部分数组;如果x等于arr[mid],则我们找到了x,直接返回它的索引值mid。
最后,如果待查找区域不存在,则返回-1,表示x不存在于数组中。
接下来,我们分别测试一下函数的正确性和性能。
arr = [1, 3, 5, 7, 9] print(binarySearch(arr, 3)) # 输出 1 print(binarySearch(arr, -1)) # 输出 -1
我们可以看到,当x等于3时,其在数组中的索引值为1,函数返回1,测试通过。当x等于-1时,它不在数组中,因此函数返回-1,测试通过。
最后,我们来测试一下函数的性能。我们分别测试了在100个、1000个、10000个、100000个和1000000个数中查找1。
import time
for i in range(1, 7):
arr = list(range(10**i))
start = time.time()
binarySearch(arr, 1)
end = time.time()
print("n = 10^%d: %.8f s" % (i, end - start))
测试结果为:
n = 10^1: 0.00000119 s n = 10^2: 0.00001883 s n = 10^3: 0.00020003 s n = 10^4: 0.00183821 s n = 10^5: 0.01855993 s n = 10^6: 0.18848610 s
我们可以看到,随着数据规模的增大,函数的运行时间也在增加。不过相比于顺序查找,二分查找具有更好的效率,可以处理更大规模的数据,运行速度远远超过了顺序查找。
综上,二分查找是一种十分高效的查找算法,可以快速查找有序数组中的元素。实现二分查找的函数的关键在于缩小待查找区间,同时需要注意边界问题。在实际应用中,二分查找被广泛地应用于排序、搜索等领域,在处理大量数据时具有良好的效率。
