二分法查找(算法图解笔记)

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

猜你喜欢

转载自blog.csdn.net/weixin_43705953/article/details/107759500