(中国大学MOOC 数据结构与算法(Python版)学习笔记“https://www.icourse163.org/course/PKU-1206307812”)
一. 什么是算法分析:
程序和算法的区别:
算法是对问题解决的分步描述
程序则是采用某种编程语言实现的算法,同一个算法通过不同的程序员采用不同的编程语言,能产生很多程序
算法分析主要就是从计算资源消耗的角度来评判和比较
算法更高效利用计算资源,或者更少占用计算资源的算法,就是好算法
计算资源指标:
一种是算法解决问题过程中需要的存储空间或内存,但存储空间受到问题自身数据规模的变化影响,要区分哪些存储空间是问题本身描述所需,哪些是算法占用,不容易。
另一种是算法的执行时间,我们可以对程序进行实际运行测试,获得真实的运行时间。
但关于运行时间的实际检测,和编程语言和运行环境都有点关系。同一个算法,采用不同的编程语言编写,放在不同的机器上运行,得到的运行时间会不一样,有时候会大不一样:比如把非迭代算法放在老旧机器上跑,甚至可能慢过新机器上的迭代算法。
所以我们需要更好的方法来衡量算法运行时间,并且这个指标与具体的机器、程序、运行时段都无关。
二. 大O表示法:
一个算法所实施的操作数量或步骤数可作为独立于具体程序/机器的度量指标,所以需要一种通用的基本操作来作为运行步骤的计量单位。
赋值语句就是一个合适的选择,一条赋值语句同时包含了(表达式)计算和(变量)存储两个基本资源。仔细观察程序设计语言特性,除了与计算资源无关的定义语句外,主要就是三种控制流语句和赋值语句,而控制流仅仅起了组织语句的作用,并不实施处理。
计算赋值语句的执行次数:
例如,对于一个求和的函数:
def Sum(n):
theSum = 0
for i in range(1, n+1):
theSum = theSum + i
return theSum
当问题规模为
n
n
n时,赋值语句的执行次数为:
T
(
n
)
=
1
+
n
T(n)=1+n
T(n)=1+n,问题规模影响算法执行时间。问题规模:影响算法执行时间的主要因素。在上述程序中,需要累计的整数个数合适作为问题规模的指标。
算法分析的目标是要找出问题规模会怎么影响一个算法的执行时间。
基本操作数量函数
T
(
n
)
T(n)
T(n)的精确值并不是特别重要,重要的是
T
(
n
)
T(n)
T(n)中起决定性因素的主导部分,用动态的眼光看,就是当问题规模增大的时候,
T
(
n
)
T(n)
T(n)中的一些部分会盖过其它部分的贡献。
数量级函数描述了
T
(
n
)
T(n)
T(n)中随着n增加而增加速度最快的主导部分,称作“大O”表示法,记作
O
(
f
(
n
)
)
O(f(n))
O(f(n)),其中
f
(
n
)
f(n)
f(n)表示
T
(
n
)
T(n)
T(n)中的主导部分。
确定运行时间数量级大O的方法:
例1:
T
(
n
)
=
1
+
n
T(n)=1+n
T(n)=1+n当
n
n
n增大时,常数1在最终结果中显得越来越无足轻重所以可以去掉1,保留n作为主要部分,运行时间数量级就是
O
(
n
)
O(n)
O(n)
例2:
T
(
n
)
=
5
n
2
+
27
n
+
1005
T(n)=5n2+27n+1005
T(n)=5n2+27n+1005当
n
n
n很小时,常数1005其决定性作用但当
n
n
n越来越大,
n
2
n2
n2项就越来越重要,其它两项对结果的影响则越来越小同样,
n
2
n2
n2项中的系数5,对于
n
2
n2
n2的增长速度来说也影响不大所以可以在数量级中去掉
27
n
+
1005
27n+1005
27n+1005,以及系数5的部分,确定为
O
(
n
2
)
O(n2)
O(n2)
常见的大O数量级函数:
其它算法复杂度表示法:
大O表示法:表示了所有上限中最小的那个上限。
大𝛀表示法:表示了所有下限中最大的那个下限。
大𝚹表示法:如果上下限相同,那么就可以用大𝚹表示
三. Python数据类型的性能
Python官方的算法复杂度网站:https://wiki.python.org/moin/TimeComplexity