1 二分查找每次能排除一半的量,那么显然 ,二分法的速率是O(logn)。 (2^logn = n)
2 二分法必须用于已排序的数据.
3 五种最常见的大O运行时间 (大O指一个算法最坏情况下的运行操作数,算法的速度指的并非时间,而是操作数的增速,谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。在近似情况下,操作数可以表示运行时间)
操作数 | 名称 | 常见算法 |
---|---|---|
O(logn) | 对数时间 | 二分法 |
O(n) | 线性时间 | 简单排序 |
O(nlogn) | / | 快速排序 |
O(n^2) | 平方时间 | 选择排序 |
O(N!) | / | 旅行商问题穷举法 |
二分法流程图
一般的二分法查找代码
list_test = [1,3,5,7,9,11,13]
def binary_search(List, x):
''' input a list and x ,output the index of item in the list
return -1 if it doesn't exist'''
Min = 0 ; Max = len(List)-1
while Min <= Max: # 只要包含一个数验证
mid =int( (Min+Max)/2 )
mid_value = List[mid]
print(Min,mid, Max)
if Min==mid: # mid 和 min 相等, 验证两边是否是要找的数 。 找不到跳出循环
Min = mid+1
elif x==mid_value:
return mid # mid 就是要找的数 ,返回mid
elif x> mid_value:
Min = mid # 猜小了, 修改min
elif x < mid_value:
Max = mid # 猜大了, 修改max
return -1
binary_search(list_test,11)
0 6
3 6
4 6
Out[103]: 5
binary_search(list_test,100)
0 6
3 6
4 6
5 6
6 6
Out[104]: -1
binary_search(range(10000000),99)
0 9999999
0 4999999
0 2499999
0 1249999
0 624999
0 312499
0 156249
0 78124
0 39062
0 19531
0 9765
0 4882
0 2441
0 1220
0 610
0 305
0 152
76 152
76 114
95 114
95 104
Out[102]: 99