- 视频链接:https://www.bilibili.com/video/BV1VC4y1x7uv
- 章节:P9
算法时间度量指标-大O表示法
一个算法所实施的操作数量或步骤数可作为独立于具体程序/机器的度量指标。
-
赋值语句
赋值语句可以作为一种通用的基本操作来作为运行步骤的计量单位,一条赋值语句同时包含了(表达式)计算和(变量) 存储两个基本资源。
def sumOfN(n):
theSum = 0
for i in range(1, n + 1):
theSum = theSum + i
return theSum
分析SumOfN
的赋值语句执行次数,对于“问题规模”n
,赋值语句数量T(n)=1+n
。
-
问题规模
问题规模:影响算法执行时间的主要因素。
在前
n
个整数累计求和的算法中,需要累计的整数个数合适作为问题规模的指标前100,000个整数求和对比前1,000个整数求和,算是同一问题的更大规模
算法分析的目标:是要找出问题规模会怎么影响一个算法的执行时间。
-
数量函数
Order of Magnitude
基本操作数量函数
T(n)
的精确值不是特别重要,重要的是T(n)
中起决定性因素的主导部分。就是当问题规模増大的时候,
T(n)
中的一些部分会覆盖其它部分的贡献数量级函数描述了
T(n)
中随着n
増加而増加速度最快的主部分,称作“大O”表示法,记作O(f(n))
,其中f(n)
表示T(n)
中的主导部分。 -
确定运行时间数量级大O的方法
- 例1:
T(n)=1+n
当n
增大时,常数1在最终结果中显得越来越无足轻重,所以可以去掉1,保留n
作为主要部分,运行时间数量级就是O(n)
。 - 例2:
T(n)=5n^2+27n+1005
当n
越来越大,n
就越来越重要,其它两項结果的影响越来越小,n^2中的系数5,对于n的増长速度来也影响不大。所以可以在数量級中去掉27n+1005
,以及系数5的部分,确定为O(n^2)
。
- 例1:
-
影响算法运行时间的其它因素
有时决定运行时间的不仅是问题规模,某些具体数据也会影响算法运行时间,分为最好、最差和平均情况,
平均状况体现了算法的主流性能,对算法的分析要看主流,而不被某几种特定的运行状况所迷惑。
-
常见的大O数量级
-
从代码分析确定执行时间数量级函数
代码语句可以分为4个部分:
T(n) = 3+3n^2+2n+1 = 3n^2+2n+4
def func(n): # 3次赋值 a = 5 b = 6 c = 10 # 3 * n^2 for i in range(n): for j in range(n): x = i * i y = j * j z = 1 * j # 2 * n for k in range(n): w = a * k + 45 v = b * b # 1 d = 33
仅保留最高阶项
n^2
,去掉所有系数,数量级为O(n^2)
。 -
其他算法复杂度表示法