二分查找
二分查找也是一种在数组中查找数据的算法。和线性查找不同,它只能查找已经排好序的数据。二分查找通过比较数组中间的数据与目标数据的大小,可以得知目标数据是在数组的左边还是右边。因此,比较一次就可以把查找范围缩小一半。重复执行该操作就可以找到目标数据,或得出目标数据不存在的结论。
步骤:
01还是来试试查找数字6
02 首先找到数组中间的数字,此处为5。
03 将5和要查找的数字6进行比较。
04 把不需要的数字移出查找范围。
05 在剩下的数组中找到中间的数字,此处为7。
06 比较7和6。
07 把不需要的数字移出查找范围。
08 在剩下的数组中找到中间的数字,此处为6。
解说
二分查找利用已排好序的数组,每一次查找都可以将查找范围减半。查找范围内只剩一个数据时查找结束。
数据量为n的数组,将其长度减半log2n次后,其中便只剩一个数据了。也就是说,在二分查找中重复执行“将目标数据和数组中间的数据进行比较后将查找范围减半”的操作log2n次后,就能找到目标数据(若没找到则可以得出数据不存在的结论),因此它的时间复杂度为O(logn)。
补充说明
二分查找的时间复杂度为O(logn),与线性查找的O(n)相比速度上得到了指数倍提高(x=log2n,则n=2x)。
但是,二分查找必须建立在数据已经排好序的基础上才能使用,因此添加数据时必须加到合适的位置,这就需要额外耗费维护数组的时间。
而使用线性查找时,数组中的数据可以是无序的,因此添加数据时也无须顾虑位置,直接把它加在末尾即可,不需要耗费时间。
综上,具体使用哪种查找方法,可以根据查找和添加两个操作哪个更为频繁来决定。4
代码演示:
def binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return mid # 如果找到目标元素,返回元素的索引elif arr[mid] < target:left = mid + 1else:right = mid - 1return -1 # 如果数组中不存在目标元素,返回 -1# 测试二分查找算法
arr = [1, 2, 3, 6, 8, 9]
target = 8result = binary_search(arr, target)if result != -1:print(f"目标元素 {target} 在数组中的索引为 {result}")
else:print(f"目标元素 {target} 不存在于数组中")
结果:
目标元素 6 在数组中的索引为 5