时间复杂性的计算
一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少。设一个程序P所占用的时间为T,则
        T(P)=编译时间+运行时间。

编译时间与实例特征是无关的,且可假设一个编译过的程序可以运行多次而无需再编译。因此分析程序的时间特性就只需考虑程序的运行时间。

令程序P的运行时间为tp(n),其中n是所要求解问题的实例特征。由于编写程序时,影响tp的许多因素还是未知的,所以只能对tp进行估算。
由于代码P的主要操作通常包括加、减、乘、除、比较、读、写等,而这些操作的执行时间是可预知的,从而可用下面的公式计算程序P的运行时间:
        tp(n)=ca*ADD(n)+cs*SUB(n)+cm*MUL(n)+cd*DIV(n)+…
其中, ca,cs,cm,cd分别表示一个加、减、乘、除操作所需要的时间;函数ADD(n),SUB(n),MUL(n),DIV(n)分别表示程序P中所使用的加、减、乘、除操作的次数。

时间复杂性的计算

(1)操作计数

估算一个程序的时间复杂性的一种方式就是首先选择一种或多种操作(如+,×或比较等),然后确定这些操作分别执行的次数,就可以计算出该程序的执行时间。这种方法是否成功取决于识别关键操作(这些操作对时间复杂性的影响较大)的能力。例如:(求最大值)

int Max(int a[],int n){
//在a[0..n-1]中找最大的元素,假设数据元素都是整型数
int pos=;
for(int i=;i<n;i++)
if(a[pos]<a[i])
pos=i;
return pos;
}//Max

 我们可以选择元素间的比较操作作为关键操作。显然,a[pos]<a[i]的比较进行了n-1次。但除此之外,循环控制变量与循环终止条件之间也进行了n次比较。当然,初始化操作pos=0以及对循环变量的修改等操作也需要考虑,但这些操作通常只对操作计数的结果增加一个常量。

(2 )执行步数

  从关于操作计数的讨论可以看出,利用操作计数方法来估算程序的时间复杂性忽略了所选择操作之外的其它操作的开销,而这些开销的积累值有时较大,毫无疑问会影响到程序的执行时间。在统计执行步数的方法中,将会统计程序在执行过程中的所有时间开销。
  与操作计数法一样,执行步数也是实例特征的函数,尽管一个特定的程序可能会有若干个特征(如输入个数,输出个数,输入和输出的大小等),但可以将执行步数看成是其中一部分特征的函数。

定义[程序步]:程序步(program step)可定义为一个语法或语义意义上的程序片段,该片段的执行时间独立于实例特征。

  由一个程序步所表示的计算量可能与其他形式表示的计算量不同。
例如,下面这条完整语句:
return a+b+b*c+(a+b-c)/(a+b)+4;
  可以看成是一个程序步,只要它的执行时间独立于所选用的实例特征。也可以把如下语句看成为一个程序步:
x=y;
  显然,这两个程序步的计算量是不一样。

可以通过创建一个全局变量count(其初值为0)来确定一个程序或函数为完成其预定的任务所需要的执行步数。可以将count引入到程序执行语句之中,每当原始程序中的一条语句被执行时,就为count累加上该语句所需要的执行步数。当程序运行结束时所得到的count的值就是所需要的执行步数。例如:(把计算count引入到求n个数和的程序中)

Void Sum(datatype a[],int n)
{//求a[0..n-1]中元素之和
datatype tsum=;
count++; //对应于tsum=0的执行步数
for(int i=;i<n;i++) {
count++; //对应于for的执行步数
tsum+=a[i];
count++; //对应于赋值语句的执行步数
}
count++; //对应于for语句的最后一次执行
count++; //对应于return语句的执行步数
return tsum;
}//Sum 当程序运行结束时所得到的count的值就是求和程序的执行步数。可见,该程序的执行步数是2n+3。

计算平均执行步数

为了计算平均执行步数,假定x被插入到任何位置上的概率是一样的,由于共有n+1个可能的插入位置,所以概率为1/(n+1)。如果x最终被插入到j位置处
(j>=0),则执行步数为2n-2j+3,这是因为在j处插入x时,for语句的循环体执行了n-j次。所以平均执行步数为:
                              n                           n
tavgInsert(n)= — Σ(2n-2j+3) = — (2Σk+3(n+1)) = n+3
           j=0         k=0

还有好多例子,说明了这个问题,不一一列举,需要多多锻炼,调试才能理解时间复杂度在算法中的具体位置。

Time complexity analysis of algorithms的更多相关文章

  1. 算法分析 Analysis of Algorithms -------GeekforGeeker 翻译

    算法分析 Analysis of Algorithms 为什么要做性能分析?Why performance analysis? 在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性 ...

  2. 6.046 Design and Analysis of Algorithms

    课程信息 6.046 Design and Analysis of Algorithms

  3. "Mathematical Analysis of Algorithms" 阅读心得

    "Mathematical Analysis of Algorithms" 阅读心得 "Mathematical Analysis of Algorithms" ...

  4. 《Mathematical Analysis of Algorithms》中有关“选择第t大的数”的算法分析

    开头废话 这个问题是Donald.E.Knuth在他发表的论文Mathematical Analysis of Algorithms中提到的,这里对他的算法分析过程给出了更详细的解释. 问题描述: 给 ...

  5. [Algorithm] Fibonacci Sequence - Anatomy of recursion and space complexity analysis

    For Fibonacci Sequence, the space complexity should be the O(logN), which is the height of tree. Che ...

  6. 612.1.002 ALGS4 | Analysis of Algorithms

    我们生活在大数的时代 培养数量级的敏感! Tip:见招拆招 作为工程师,你先要能实现出来. 充实基础,没有什么不好意思 哪怕不完美.但是有时候完成比完美更重要. 之后再去想优化 P.S.作者Rober ...

  7. Analysis of Algorithms

    算法分析 Introduction 有各种原因要求我们分析算法,像预测算法性能,比较不同算法优劣等,其中很实际的一条原因是为了避免性能错误,要对自己算法的性能有个概念. 科学方法(scientific ...

  8. Analysis of algorithms: observation

    例子: 3-Sum 给定N个整数,这里面有多少个三元组,使其三个整数相加为0,如上面的例子为有4个三元组. 这个问题是许多问题如计算机几何,图形学等的基础. 用简单粗暴的方式来解决3-Sum问题 通过 ...

  9. AlgorithmsI Exercises: Analysis of Algorithms

    Question 1 Suppose that you time a program as a function of N and producethe following table. N seco ...

随机推荐

  1. 【暑假】[深入动态规划]UVAlive 3983 Robotruck

     UVAlive 3983 Robotruck 题目: Robotruck   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format ...

  2. uva 11019 Matrix Matcher

    题意:给出一个n*m的字符矩阵T,你的任务是找出给定的x*y的字符矩阵P在T中出现了多少次. 思路:要想整个矩阵匹配,至少各行都得匹配.所以先把P的每行看做一个模式串构造出AC自动机,然后在T中的各行 ...

  3. 恒天云技术分享系列2 - vlan管理GUI开发

    恒天云:http://www.hengtianyun.com/download-show-id-10.html 在OpenStack G版本中quantum网络模式下,horizon提供了基于quan ...

  4. python 递归函数

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: f ...

  5. 射频识别技术漫谈(5)——防冲突【worldsing 笔记】

    正常情况下读写器某一时刻只能对磁场中的一张射频卡进行读写操作.但是当多张卡片同时进入读写器的射频场时,读写器怎么办呢?读写器需要选出唯一的一张卡片进行读写操作,这就是防冲突. 防冲突机制是非接触式智能 ...

  6. UITableView 详解 教程

    看TableView的资料其实已经蛮久了,一直想写点儿东西,却总是因为各种原因拖延,今天晚上有时间静下心来记录一些最近学习的TableView的知识.下面进入正题,UITableView堪称UIKit ...

  7. CSS文本与文字

    -255之间 14.2 CSS中的文字属性 属性名称                    属性值                       说明 font-style          norma ...

  8. 编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    package car; public class Vehicle { //定义成员变量 private int wheels; private double weight; public int g ...

  9. 使用教程sqlite

    访问地址: http://www.runoob.com/sqlite/sqlite-where-clause.html

  10. cocos2d-x 开发时的注意点

    转自:http://cjhworld.blog.163.com/blog/static/20707803620132693629307/ 1.       按照Cocos2d的编程风格,尽量少用构造函 ...