算法是一种完成任务的指令。
本章的主要内容:
第一种查找算法——二分查找
讨论算法的运行时间——大O表示法
一种常用的算法设计方法——递归方法
二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则,返回NULL。
对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。
在这本书中使用大O表示法讨论运行时间时,log指的都是log2。
仅当列表是有序的时候,二分查找才管用。
二分查找的Python3代码如下:
def binary_search(list, item):
low = 0 #列表中第一个数字的索引为0
high = len(list) - 1 #列表中最后一个数字的索引为列表的长度减1
while low <= high: #二分查找从中间的位置开始查找
mid = int((low + high) / 2) #列表中心位置的索引
guess = list[mid] #guess为中心位置对应的数字
if guess == item:
return mid #如果中心位置对应的数字即为item,则返回中心位置的索引
if guess > item:
high = mid #如果真实值item小于我们猜测的数字,则向前缩小范围
else:
low = mid + 1 #如果真实值item大于我们猜测的数字,则向后缩小范围
return None #如果查找的数字不在列表中,则返回None
if __name__ == "__main__": #测试
list = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
index = binary_search(list, 17)
print('查找的索引为{0}, 对应的数字为{1}'.format(index, list[index]))
运行时间
线性时间(linear time):最多的需要猜测的次数与列表长度相同。
对数时间(log时间):二分查找的运行时间。
大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
设列表包含n个元素,简单查找需要检查每个元素,因此需要执行n次操作,使用大大O表示法,这个运行时间为O(n)。
大O表示法并不是以秒为单位的速度,它能够让我们比较操作数,大O表示法指出了算法运行时间的增速。
检查长度为n的列表,二分查找需要执行logn次操作,用大O表示法表示它的运行时间是O(logn)。
一些常见的大O运行时间:
O(logn):对数时间,这样的算法包括二分查找。
O(n):线性时间,这样的算法包括简单查找。
O(n*logn):这样的算法包括快速排序(速度较快的排序算法)。
O(n2):这样的算法包括选择排序(速度较慢的排序算法)。
O(n!):这样的算法包括旅行商的解决方案(速度非常慢的排序算法)。
算法启示:
算法速度并非时间,而是操作数的增速;
说到算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加;
算法的运行时间用大O表示法表示;
O(logn)比O(n)快,当需要搜索的元素越多是,前者比后者快得多。
旅行商问题:
一个旅行者要去5个城市,共有120种不同的排列方法;推广到n个城市,需要执行n!次操作,因此运行时间为O(n!)。
小结
二分查找的速度比简单查找快得多;
O(logn)比O(n)快,当需要搜索的元素越多,前者比后者快得越多;
算法运行时间不以秒为单位;
算法运行时间是从其增速的角度度量的;
算法运行时间用大O表示法表示。
希望大家多多批评指正
祝好
Violet HE
2019.2.27 18:25