Python实现二分查找
为什么需要二分查找
-
如果查找1-100内任意一个数字?
-
顺序查找(简单查找)
从1开始或者100倒着来进行查找
最快只需要一次,但是最慢则需要一百次,差距相当大
大O表示法为 O(n)
-
二分查找
每次从中间进行查找,先从50,再判断大还是小,再从75或者25进行查找,依次类推
由于每次都会排除一般的数字,所以最慢也只需要7次,log2 n次
大O表示法为O(log n)
要求:必须是有序的情况
-
从上面的例子可以看出来,在有序的情况下,二分查找的效率是很高的
大O表示法
大O表示法是一种比较特殊的表示法,指出了算法的消耗时间速度,主要可以表示两种算法之间时间消耗的不同增速
小明要准备去北京玩,为了更好的准备,小明提前准备了100套线路方案,然后准备用程序验证那种方案更加方便省时间,如果使用简单查找的话进行验证,假设一套方案需要一秒钟,那么100套就需要100毫秒(O(n),而使用二分查找的话只需要7毫秒(O(log n),这就整整差了十多倍的时间,这仅仅只是100套,如果是一亿套方案呢,简单查找时间就会更久, 由此我们可以根据大O表示法比较两个算法直接的时间增量速度以此判断哪个算法更加便捷
python代码实现二分查找
def BinarySearch(list1, num):
min = 0 # 最小的下标
max = len(list1) - 1 # 最大的下标
i = 0
while True:
i += 1
mid = (max + min) // 2 # 中间的下标每次向下取整
if num > list1[mid] :
min = mid + 1 # 小于需要的猜的数,则将最小下标变为中间的,又因为中间的已经猜过,所以要加1
elif num == list1[mid] :
print("找到数据")
print("一共查找%d次"%i)
break
else :
max = mid - 1 # 大于需要的猜的数,则将最大下标变为中间的,又因为中间的已经猜过,所以要减1
if __name__ == "__main__":
list1 = [i for i in range(0,100)]
num = 5
BinarySearch(list1, num)