Time complexity analysis of algorithms
时间复杂性的计算
一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少。设一个程序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的更多相关文章
- 算法分析 Analysis of Algorithms -------GeekforGeeker 翻译
算法分析 Analysis of Algorithms 为什么要做性能分析?Why performance analysis? 在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性 ...
- 6.046 Design and Analysis of Algorithms
课程信息 6.046 Design and Analysis of Algorithms
- "Mathematical Analysis of Algorithms" 阅读心得
"Mathematical Analysis of Algorithms" 阅读心得 "Mathematical Analysis of Algorithms" ...
- 《Mathematical Analysis of Algorithms》中有关“选择第t大的数”的算法分析
开头废话 这个问题是Donald.E.Knuth在他发表的论文Mathematical Analysis of Algorithms中提到的,这里对他的算法分析过程给出了更详细的解释. 问题描述: 给 ...
- [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 ...
- 612.1.002 ALGS4 | Analysis of Algorithms
我们生活在大数的时代 培养数量级的敏感! Tip:见招拆招 作为工程师,你先要能实现出来. 充实基础,没有什么不好意思 哪怕不完美.但是有时候完成比完美更重要. 之后再去想优化 P.S.作者Rober ...
- Analysis of Algorithms
算法分析 Introduction 有各种原因要求我们分析算法,像预测算法性能,比较不同算法优劣等,其中很实际的一条原因是为了避免性能错误,要对自己算法的性能有个概念. 科学方法(scientific ...
- Analysis of algorithms: observation
例子: 3-Sum 给定N个整数,这里面有多少个三元组,使其三个整数相加为0,如上面的例子为有4个三元组. 这个问题是许多问题如计算机几何,图形学等的基础. 用简单粗暴的方式来解决3-Sum问题 通过 ...
- AlgorithmsI Exercises: Analysis of Algorithms
Question 1 Suppose that you time a program as a function of N and producethe following table. N seco ...
随机推荐
- IGT一道笔试题
1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521 432 431 421 321 当前长度为i,每个位上的取之范围为 ...
- php支持rewrite 时创建.htaccess文件
1.win+r 快捷键 运行中输入cmd 2.进入dos界面:输入copy con .htaccess 3.回车后可以输入内容,再次回车即可产生文件
- 【OpenGL】入门
根据OpenGL蓝宝书(OpenGL超级宝典)来入门,写的比较细,易懂,这里给我贴代码和记录零碎的事儿用 第一个代码 #include <gl/glut.h> void RenderSce ...
- java基础程序设计学习
java使用System.out来表示标准输出设备,使用System.in来表示标准输入设备.java并不直接支持控制台输入,但是可以使用Scanner类创建它的对象,以读取来自System.in的输 ...
- 拉格朗日对偶(Lagrange duality)
拉格朗日对偶(Lagrange duality) 存在等式约束的极值问题求法,比如下面的最优化问题: 目标函数是f(w),下面是等式约束.通常解法是引入拉格朗日算子,这里使用 ...
- C++&OpenCV中读取灰度图像到数组的两种
如标题所言,此处是对于灰度图像而言 ///method 1 read the image data one by one for (int row = 0, i = 0;row < imgDst ...
- The usage method of reference with bibtex in Latex【latex中参考文献的使用方法】
如何在latex中以Bibtex文件方式引用参考文献? 以IEEEtran模板为例: 1.制作bibtex参考文献库.方法如下: ①建立myreference.bib文件: ②在Google scho ...
- 删除TreeView节点以及其子节点
//1.删除TreeView节点以及其子节点procedure TForm2.Button1Click(Sender: TObject);var TreeNode:TTreeNode;begin i ...
- 使用list和tuple
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...
- iOS block的用法
本章学习目标: 1. 了解何谓block. 2. 了解block的使用方法. Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容 ...