时间复杂度的理解
时间复杂度:
可以理解为程序的运算步骤
n为项目的规模, 时间复杂度表示为T(n)
渐进函数:
时间复杂度一般都为项目所有的运算步骤的渐进函数
渐进函数特征:忽略常数项
ex:
k为常数项
T(n) = n ^ 3 * k
g(n) = n ^ 3
T(n) = k * n ^ 3
g(n)就是T(n)的渐进函数
大O表示法:
就是一个函数忽略常数项,只保留最核心,最特征的部分
描述:
- 如果算法A需要的时间与f(n)成正比,则算法A称为f(n)阶,表示为O(f(n))。
- 函数f(n)称为算法A的增率函数(growth-rate function)。
- 该表示法使用大写字母O来表示(order),故称大O表示法。
- 若规模为n的问题需要的时间与n成正比,则问题表示为O(n),即n阶。
- 若需要的时间与n^2成正比,则表示为O(n^2),以此类推。
1)可忽略算法增率函数的低阶项。
2)可忽略算法增率函数中高阶项的倍数常量。
3)O(f(n))+O(g(n))=O(f(n)+g(n))可组合增率函数。
时间复杂度:
分析算法时, 存在几种可能的考虑:
1. 算法完成工作最少需要多少基本操作, 即最优时间复杂度
2. 算法完成工作最多需要多少基本操作, 即最坏时间复杂度
3. 算法完成工作平均需要多少基本操作, 即平均时间复杂度
对于最优时间复杂度, 其价值不大, 因为它反映的知识最乐观最理想的情况, 没有参考价值
最坏时间复杂度:
对于最坏时间复杂度, 提供了一种保障, 表明算法在此种程序中一定能完成工作
平均时间复杂度:
对于平均时间复杂度, 是对算法的一个全面评价, 因为它完整全面的反映了这个算法的性质, 但另一方面, 这种衡量并没有保障, 不是每个计算都能在这个基本操作内完成, 而且, 对于平均情况的计算, 也会因为应用算法的实例分布可能并不均匀难以计算
因此, 我们主要关注算法的最坏情况, 即最坏时间复杂度
时间复杂度的基本计算规则
1. 基本操作:
- 只含有常数项,认为其时间复杂度为O(1)
2. 顺序操作:
- 时间复杂度按加法进行计算
3. 循环操作
- 时间复杂度,按乘法进行计算
4. 分支结构
- 时间复杂度取最大值
- (每个分支都有自己的运算步骤,取出里面运算步骤最多的分支,当作分支结构的步骤)
判断一个算法的效率时,往往只需要关注操作数量的最高次项,其他次要项,常数项可以忽略不计
通常我们所讲的时间复杂度是项目的最坏时间复杂度
控制程序的基本流程
顺序
条件
循环
这三项可以组合所有的算法,项目
时间复杂度的计算时间复杂度的计算
包含顺序,循环,条件三个流程
ex:
for a in range(0, n): for b in range(0, n): c = n - a -b if a ^ 2 + b ^ 2 = c ^ 2: print(a,b,c)
代码分析
for a in range(0, n): (循环用乘法计算) 这句代码的运行步骤是:O(n) for b in range(0, n): (循环用乘法计算) 这句代码的运行步骤是:O(n) c = n - a -b (基本操作语句为1) 运行步骤为:O(1) if a ^ 2 + b ^ 2 = c ^ 2: print(a,b,c) 进入判断语句, 有两个分支 (当碰到分支语句的时候,取分支步骤最多的) 分支1执行print(a,b,c) 步骤为1 分支2是判断条件失败,直接跳过了 步骤为0
根据大O计算法则,计算后的结果为:
T(n) = O(n * n * (1+1))
T(n) = O(n ^ 2 * 2)
常数项忽略: T(n) = O(n ^ 2)
扩展: