1、由二分查找引出时间概念
二分查找是一种算法,其输入是一个有序的元素列表(必须有序)。如果要查找的元素包含在列表中,二分查找返回其位置,否则返回NULL。
一般而言,对于包含n个元素的列表,用二分查找最多需要 log 2 n \log_2 n log2n步,而简单查找最多需要n步。
例如:如果列表包含8个元素,简单查找需要检查8个元素,二分查找只需要检查3个元素,因为 2 3 2^3 23=8。
1.1 python实现二分查找
def binary_search(list_demo, item):
low = 0
high = len(list_demo) - 1
while low <= high:
mid = (low + high) // 2
guess = list_demo[mid]
if guess == item:
return mid
if guess > item:
high = mid - 1
else:
low = mid + 1
return None
my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 3))
print(binary_search(my_list,-1))
由此可见,二分查找的运行时间为对数时间(或log时间)。
2、大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。
大O表示法能够比较操作数,它指出了算法运算时间的增速。同时,大O表示法指出了算法在最糟情况下的运算时间。
2.1 一些常见的大O运行时间
下面按从快到慢的顺序列出了常见的5种大O运行时间:
O(
l
o
g
n
log n
logn),也叫对数时间,这样的算法包括二分查找。
O(
n
n
n),也叫线性时间,这样的算法包括简单查找。
O(
n
l
o
g
n
nlogn
nlogn),这样的算法包括快速排序,一种速度较快的排序算法。
O(
n
2
n^2
n2),这样的算法包括选择排序,一种速度较慢的排序算法。
O(
n
!
n!
n!),这样的算法包括下面要介绍的旅行商问题的解决方案,一种非常慢的算法。
假设你要绘制一个包含16格的网格,且有5种不同的算法可供选择,这些算法的运行时间如图所示:
2.2 旅行商问题
有一个旅行商:
他需要前往5个城市。
这位旅行商要前往5个城市,同时确保旅程最短,为此,可考虑的城市顺序如下:
对于每种顺序,都需计算总旅程,再挑选最短的路线。5个城市有5!个排列方式,6个城市有6!个排列方式,以此类推,涉及
n
n
n个城市时,需要
n
!
n!
n!次操作才能计算出结果。
2.3 小结:
1)算法的速度指的并非时间,而是操作数的增速。
2)谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
3)算法的运行时间用大O表示法表示。
4)O(
l
o
g
n
logn
logn)比O(
n
n
n)快,当需要搜索的元素越多时,前者比后者快得越多。
5)算法运行时间并不以秒为单位。