前言
算法是一组完成任务的指令,任何代码片段都可视为算法。
1.1 二分查找
二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null。
应用实例:在电话簿中找一个名字以K打头的人;登录Facebook时,Facebook必须核实你是否有其网站的账户,须在其数据库中查找你的用户名;以最少的次数猜到一个1~100之间的数字。
对于包含n个元素的列表,用二分查找最多需要
l
o
g
2
n
log_2^n
log2n步,而简单查找最多需要
n
n
n步。二分查找的Python代码如下:
def binary_search(list,item):
low=0
high=len(list)-1
while low <= high:
mid = (low + high) /2 #如果(low + high)不是偶数,Python自动将mid向下取整
guess = list[mid]
if guess == item: #找到了元素
return mid
if guess > item: #猜的数字大了
high = mid - 1
else: #猜的数字小了
low = mid + 1
return None #没有指定元素
1.2 大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地。
大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(
n
n
n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。
大O 表示法指出了最糟情况下的运行时间。
一些常见的大O运行时间
-
O( log n \log n logn),也叫对数时间,这样的算法包括二分查找。
-
O( n n n),也叫线性时间,这样的算法包括简单查找。
-
O( n ∗ l o g n n * log n n∗logn),这样的算法包括快速排序——一种速度较快的排序算法。
-
O( n 2 n^2 n2),这样的算法包括选择排序——一种速度较慢的排序算法。
-
O( n ! n! n!),这样的算法包括旅行商问题的解决方案——一种非常慢的算法。
-
算法的速度指的并非时间,而是操作数的增速。
-
谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
-
算法的运行时间用大O表示法表示。
-
O( l o g n log n logn)比O( n n n)快,当需要搜索的元素越多时,前者比后者快得越多。
-
大O表示法不考虑乘以、除以、加上或减去的数字。下面这些都不是正确的大O运行时间:O( n n n + 26)、O( n n n - 26)、O( n n n * 26)、O( n n n / 26),它们都应表示为O( n n n),通常不考虑常量。