算法的时间复杂度分析

原创 2012年03月27日 01:29:37

1.算法耗费的时间、语句频度、输入规模

在实际中,一个算法所需耗费的时间  =  算法中所有语句的执行时间之和
           而,每条语句的执行时间         =  每条语句执行一次所需时间  *  每条语句的执行次数(语句频度)

因为每条语句执行一次所需时间取决于机器执行指令的性能、速度等难以确定的因素,而为了独立于机器的软、硬件系统来分析算法的时间耗费,
我们假设每条语句执行一次所需时间均为单位时间,那么,一个算法的时间规模就与其所有语句的频度之和相关。

 

输入规模:算法求解问题的输入量称为问题的规模,一般用一整数来表示:n = 1, 2, 3 ...k


那么,对于输入规模为 n 的算法,其语句频度之和可记作:T(n)

例:
(1) for(i=0; i<n;j++) n+1
(2) for (j=0;j<n;j++) { n(n+1)
(3)     C[i][j]=0; n2
(4)     for (k=0; k<n; k++) n2(n+1)
(5)       C[i][j]=C[i][j]+A[i][k]*B[k][j]; n3

分析:
    语句(1)的循环控制变量i要增加到n,测试到i=n成立才会终止。故它的频度是n+1。但是它的循环体却只能执行n次。
    语句(2)作为语句(1)循环体内的语句应该执行n次,但语句(2)本身要执行n+1次,所以语句(2)的频度是n(n+1)。
    同理可得语句(3),(4)和(5)的频度分别是n2,n2(n+1)和n3。
    该算法中所有语句的频度之和(即算法的时间耗费)为:   T(n)=2n3+3n2+2n+1 (1.1)

2. 时间复杂度

概念:
    如某算法的语句频度之和为 T(n),那么,当 n 趋于无穷大虹,若存在函数 f(n)使得 T(n)/f(n)的极限值为不等于0的常数,
    则称:  f(n) 是 T(n) 的同数量级函数,记作:T(n) = O(f(n))
      称:  O(f(n)) 为该算法的渐进时间复杂度,简称:时间复杂度

举例说明时间复杂度的求法:

交换i和j的内容。
    Temp=i;
    i=j;
    j=temp;
  以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。
注意:
       如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
 
变量计数之一:
(1) x=0;y=0;
(2) for(k-1;k<=n;k++)
(3)   x++;
(4) for(i=1;i<=n;i++)
(5)     for(j=1;j<=n;j++)
(6)       y++;
  一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分。
       因此,以上程序段中频度最大的语句是(6),其频度为f(n)=n2,所以该程序段的时间复杂度为T(n)=O(n2)。
  当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。

变量计数之二:
(1) x=1;
(2) for(i=1;i<=n;i++)
(3)     for(j=1;j<=i;j++)
(4)         for(k=1;k<=j;k++)
(5)             x++;
  该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,
        因此可以从内层循环向外层分析语句(5)的执行次数n3,得出该算法时间复杂度为T(n)=O(n3/6+低次项)=O(n3)。

注意: 
算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。

在数值A[0..n-1]中查找给定值K的算法大致如下:
(1)i=n-1;
(2)while(i>=0&&(A[i]!=k))
(3)   i--;
(4)return i;
       此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关:
①若A中没有与K相等的元素,则语句(3)的频度f(n)=n;
②若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。


3.最坏时间复杂度和平均时间复杂度
  最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。
    这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
    平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
 
常见的时间复杂度按数量级递增排列依次为:
常数阶         O(1)
对数阶         O(log2n)
线性阶         O(n)
线性对数阶  O(nlog2n)
平方阶         O(n2)
立方阶         O(n3)

k次方阶       O(nk)
指数阶        O(2n)

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

算法的时间复杂度和空间复杂度-总结

算法的时间复杂度和空间复杂度 1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法...
  • zolalad
  • zolalad
  • 2013年09月20日 16:01
  • 95167

时间复杂度——均摊分析

首先区分一下均摊分析和
  • huangwwu11
  • huangwwu11
  • 2014年05月31日 10:52
  • 3669

KMP算法的效率分析

上一节,我们研究了KMP算法的实现原理,这节,我们从分析的角度看看KMP算法的时间复杂度,通过分析证明,我们代码对算法的实现,是能保证线性复杂度的...
  • tyler_download
  • tyler_download
  • 2016年10月20日 12:55
  • 609

算法(一)时间复杂度

算法很重要,但是由于做移动开发并不经常用到,所以很多同学早就将算法打了个大礼包送还给了老师了,况且很多同学并没有学习过算法。这个系列就让对算法头疼的同学能快速的掌握基本的算法。过年放假阶段玩了会游戏N...
  • itachi85
  • itachi85
  • 2017年02月09日 11:48
  • 5118

巩固基础篇:算法复杂度的分析方法及其运用

巩固基础篇:算法复杂度的分析方法及其运用
  • CSDN568302203
  • CSDN568302203
  • 2016年07月12日 10:50
  • 501

递归算法的时间复杂度分析

递归算法的时间复杂度分析 在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而...
  • d2457638978
  • d2457638978
  • 2015年07月19日 21:57
  • 4143

分治法和二分法的时间复杂度简明分析

二分:通过O(1)的操作,将规模为 n 的问题变成了 n/2 的问题。即:T( n ) = T( n / 2 ) + O( 1 );分治:通过O(1)的操作,将规模为 n 的问题变成了2个 n/2 的...
  • qilei2010
  • qilei2010
  • 2016年05月08日 13:18
  • 4578

重拾算法(一):算法效率分析(空间复杂度和时间复杂度)

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间...
  • lishuzhai
  • lishuzhai
  • 2016年08月30日 20:14
  • 2095

欧几里得算法时间复杂度简单分析

前言这个问题是在《数据结构与算法C++描述(第三版中文)》所遇到的,文中给出的迭代次数O(logN)的结果就像是教授所说的“显然”一样高深莫测,有点云里雾里的感觉!在“网罗”了一些资料后,在这里找到了...
  • ZeroOnet
  • ZeroOnet
  • 2016年11月28日 20:27
  • 2273

递归算法的时间复杂度分析

这一段时间,我研究了一下算法的时间复杂度分析,感觉其中的递归分析挺有意思,就总结一下记录下来,以备以后随时复习查看。下面假设递归方程式已经给出了,仅仅说明如何计算递归方程的时间复杂度。...
  • qq_19528953
  • qq_19528953
  • 2017年02月06日 21:14
  • 726
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法的时间复杂度分析
举报原因:
原因补充:

(最多只允许输入30个字)