1.二分查找是一种算法,其输入是一个有序的元素列表
2.对于包含n个元素的列表,用二分查找最多需要logn步,而简单查找最多需要n步
3.代码示例:
def binary_search(list, item): low = 0 # low 和 high 用于跟踪要在其中查找的列表部分 high = len(list)-1 while low <= high: # 只要范围没有缩小到只包含一个元素 mid = (low + high) # 就检查中间的元素 guess = list[mid] if guess == item: # 找到了元素 return mid elif guess > item: #猜的数字大了 high = mid - 1 else: # 猜的数字小了 low = mid + 1 return None # 没有指定的元素
测试:
1. my_list = [1, 3, 5, 7, 9] 2. print(binary_search(my_list, 3)) 3. print(binary_search(my_list, -1))
运行结果:
1 # 返回索引,索引从0开始,第二个位置索引为 1 None # None表示空,表示没有找到指定元素
4.练习
①假设有一个包含128个名字的有序列表,你要使用二分查找在其中查找一个名字,请问最多需要几步才能找到?
logn = 128 n = 7 7步
②列表长度翻倍后,最多需要几步才能找到?
logn = 128 * 2 n = 8 8步
5.运行时间
简单查找:最多需要猜测的次数与列表长度相同,这被称为线性时间
二分查找:运行时间为对数时间(或log时间)
6.大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快,仅知道算法需要多长时间才能运行完毕还不够,而需知道运行时间如何随列表增长而增加
大O表示法指出了算法有多快,它指的并非以秒为单位的速度,大O表示法让你能够比较操作数,它指出了算法运行时间的增速
* 例如:检查长度为n的列表,二分查找需要执行logn次操作,用大O表示法表示:O(logn)
基本形式: O(n) 指出了算法需要执行的操作数
7.常见的大O运行时间(从快到慢)
① O(logn) 对数时间,包括二分查找
② O(n) 线性时间,包括简单查找
③ O(n*logn) 快速排序 —— 一种速度较快的排序算法
④ O(n^2) 选择排序 —— 一种速度较慢的排序算法
⑤ O(n!) 旅行商问题的解决方案 —— 一种非常慢的算法
8.注意
①算法的速度指的并非时间,而是操作数的增速
②谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
③算法的运行时间用大O表示法表示
④O(logn)比O(n)快,当需要搜索到元素越多时,前者比后者快的越多
⑤大O表示法说的是最糟的情形,简单查找的运行时间不可能超过O(n),除最糟情况下的运行时间外,还应考虑平均情况的运行时间,这很重要