计算机考研408-数据结构笔记本之——第一章 绪论
1.2 算法和算法评价
1.2.2 算法效率的度量
算法效率的度量是通过时间复杂度和空间复杂度来描述的。
1.时间复杂度
时间复杂度T(n)是事前预估算法时间开销T(n)与问题规模 n 的关系(T 表示 “time”),通常将算法中基本运算的执行次数的数量级作为该算法的时间复杂度,记为:T(n) = O(f(n))
2.计算时间复杂度
以【算法表白——爱你n遍】举例。
算法1中,语句频度: ① ——1次 ② ——3001次 ③④ ——3000次 ⑤ ——1次 (注:一个语句的频度是指该语句在算法中被重复执行的次数),易得:问题规模 n = 3000,时间开销T(n) = 1 + 3001 + 3000 + 1 = 3n + 3
这样就简单计算出了算法1的T(n).
当遇到复杂的算法时,这样的粗暴计算难免会很麻烦,是否可以忽略表达式某些部分?
答:可以。如同上面提到的,只考虑阶数,用大O记法 O(f(n)) 来表示T(n) ,下图是一个简单的演示:
简单总结就是,只取最高阶项,并视最高阶项系数为1. 并遵循下列两个规则:
那么,如何知道哪一项是算式中的最高阶呢?请记住下表(可以用求极限的方法来判断,平常使用记住即可):(口诀:从小到大,常对幂指阶)
但是,如果有好几千行代码,难道依然要像算法1一样一行一行看,计算每一行的语句频度么?
答:当然不。只需考虑最深层循环的循环次数与 n 的关系即可。
如下图:
结论1:顺序执行的代码只会影响常数项,可以忽略
结论2:只需挑循环中的一个 基本操作分析它的执行次数与 n 的关系即可
结论3:如果有多层嵌套循环,只需关注最深层循环循环了几次
一眼不能看出最深层循环频度时,可像下图一样,设置一个x求时间复杂度
当时间复杂度如算法4一样受概率或其他因数影响大小时,我们将最坏情况时间复杂度视为该算法时间复杂度。
补充:三种时间复杂度