Content
- 实现过程
- 关键思路
- 最大最小比较次数
- Python实现
- ?线性查找法
1. 实现过程
Example:
在顺序表 [10,20,30,40,50,60,70]
中,用二分法查找关键码60。
数值 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 |
---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
以上8个数,从0到7编码,查找过程如下:
-
第一轮
mid =(left + right)/ 2 = (0 + 7) / 2 = 3 ,「向下取整」
-> 目标值60与下标为3的值40进行比较,40<60,则 left = mid + 1 = 4; -
第二轮
mid = (left + right)/ 2 = (4+7) /2 = 5,「向下取整」
-> 目标值60与下标为5的60比较,60=60,返回下标5,算法结束。
共比较了2次。
2. 关键思路
- 使用二分查找前,必须先保证数组有序;
- 每次二分按照
mid=(left + right)/ 2
向下取整; - 目标值与下标为mid的值比较,若目标值较大(小),则
left = mid + 1
(right = mid - 1
); - 直至成功找到目标值,停止。
3. 最大最小比较次数
-
最小比较次数为1,例如
[1,2,3]
二分查找2。 -
最大比较次数为
log2(n) + 1
向下取整,
对有序表,根据二分查找法定义,每次比较之后问题规模都会减小一半,所以2^k=N
,解得k=log2(n)
。又因为最后只剩一个元素时,也要执行查找过程,所以+1。
4. Python实现
def BinarySearch(arr, key):
left = 0
right = len(arr)-1
while left <= right:
mid = (left + right)//2
if key == arr[mid]:
return mid
elif (key < arr[mid]):
right = mid - 1
else:
left = mid + 1
- 输出:
5. vs 线性查找
在无序的数组中查找一指定值,必须遍历整个数组,直至查找成功。
- 最小查找次数为1,即第一个值即为目标值;
- 最大查找次数为n,即最后一个值才是目标值;
- 平均查找次数为(n+1)/2,即(1+2+3+……+n)/n 。
6. 参考
- https://blog.csdn.net/u010992313/article/details/89373480
- https://blog.csdn.net/iteye_3748/article/details/82677136
- https://blog.csdn.net/picc_lu/article/details/97247031
- https://www.baidu.com/link?url=dG930Wgj8gRWERgRMXzzoKxPItF2QochfTZlqSR2kqZFdbUavWeSwOqNw8ckQfQB&wd=&eqid=ba0f797b000cb42a000000065d774886