1. 评价算法标题好坏的指标
1.1 计算资源指标
1.1.1 存储空间或内存
由于不好区分是数据本来就需要很大的空间,还是由于算法太垃圾占用了太多的空间。所以通常不用这个描述。
1.1.2 算法执行时间
通常用这个描述计算资源指标
在python中可以用time模块统计运行时间。
time.time()是系统的时间。
import time
start = time.time()
需要执行的程序
end = time.time()
print(end - start)
end - start 就是程序运行的时间。通常我们执行多次程序,避免单次执行程序的偏差。
2. 迭代算法和非迭代算法的对比
2.1 迭代算法
迭代算法就是说下一次的结果是基于上一次来的,一般会有个循环
如迭代的累加求和算法
import time
def sumOfN(n):
start = time.time()
theSum = 0
for i in range(1, n + 1):
theSum = theSum + i
end = time.time()
return theSum, end - start
print(sumOfN(10000000)) # 求 1-10000000的累加和并计算这个程序的运行时间
2.2 非迭代算法
非迭代算法直接一步到位计算,不需要循环
import time
def sumOfN(n):
start = time.time()
theSum = 0.5 * n * (n + 1)
end = time.time()
return theSum, end - start
print(sumOfN(10000000)) # 求 1-10000000的累加和并计算这个程序的运行时间
2.3 同一问题迭代和非迭代的对比
上面的第二个程序比第一个程序运行快太多了。所以第二种比较好,但是第二个公式可能比较难想出来。
3. 用执行时间衡量算法好坏的问题
不同的编程语言、平台、机器,跑同一算法的时间有很大区别。因此只用执行时间,是有失偏颇的。我们需要一种更好的方法(与具体的机器、程序、运行时段等都无关的方法)来评价算法的好坏。
4. 大O表示法: 算法复杂度
4.1 赋值语句的个数衡量算法
赋值语句如下:
a = b
表示把b的值赋给a,这个过程既包括计算又包括存储。
赋值语句是一个合适的算法度量指标,他在所有的平台上都是一样的。赋值语句多,执行时间长,反之短 。
对于上述的 s u m O f N ( n ) sumOfN(n) sumOfN(n)函数
# import time #1
def sumOfN(n): #2
# start = time.time() #3
theSum = 0 #4 执行一次
for i in range(1, n + 1): #5
theSum = theSum + i #6 执行n次
# end = time.time() #7
return theSum # end - start #8
print(sumOfN(10000000)) # 求 1-10000000的累加和并计算这个程序的运行时间 #9
n是问题规模,第 4,6行是赋值语句
因此
s
u
m
O
f
N
(
n
)
sumOfN(n)
sumOfN(n)的赋值语句数量是
T
(
n
)
=
n
+
1
T(n) =n+1
T(n)=n+1
4.2 问题规模
问题规模是影响算法执行时间的主要因素。对上述得累计求和算法,需要求和的n的个数就是问题规模。
如,求1000个整数的累计和比1000000个整数的累计和,是同一问题的小规模。
算法分析就是要找出问题规模怎么影响算法的执行时间
4.3 数量级函数
T ( n ) T(n) T(n)的精确值不重要,他的主导部分最重要,如 T ( n ) = n + 1 T(n) = n + 1 T(n)=n+1,n很大时,1就对算法的影响就忽略不计了。
大O表示法:数量级函数就是只取 T ( n ) T(n) T(n)中关于n的部分,记作 O ( f ( n ) ) O(f(n)) O(f(n)), f ( n ) f(n) f(n)是 T ( n ) T(n) T(n)中关于 n n n的部分
如
T
(
n
)
=
n
+
1
T(n) = n + 1
T(n)=n+1 是
O
(
n
)
O(n)
O(n)
T
(
n
)
=
5
n
2
+
27
n
+
1
T(n) = 5n^2 + 27n + 1
T(n)=5n2+27n+1 是
O
(
n
2
)
O(n^2)
O(n2)
4.4 影响算法执行时间的其他因素
有时不仅问题规模决定运行时间,一些具体的数据也可能会影响算法运行时间
如排序问题中,有的数据集已经只有个别的数没排好顺序,有的数据集有特别的多的数没排好顺序。
这时我们将各个数据集的情况求平均,用平均体现算法性能。
4.5 最常见的7种大O数量级函数


4.5 小练习
求这段代码的复杂度

解:
赋值语句包括四部分
T
(
n
)
=
3
+
3
n
2
+
2
n
+
1
−
>
O
(
n
2
)
T(n) = 3 + 3n^2 + 2n + 1 -> O(n^2)
T(n)=3+3n2+2n+1−>O(n2)

参考文献
本文的知识来源于B站视频 【慕课+课堂实录】数据结构与算法Python版-北京大学-陈斌-字幕校对-【完结!】,是对陈斌老师课程的复习总结。