时间复杂度的理解

时间复杂度:

可以理解为程序的运算步骤
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)

扩展:

 
posted @ 2018-05-22 20:06  阿谋  阅读(757)  评论(0编辑  收藏  举报