Time complexity analysis of algorithms

简介: 时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少。设一个程序P所占用的时间为T,则        T(P)=编译时间+运行时间。 编译时间与实例特征是无关的,且可假设一个编译过的程序可以运行多次而无需再编译。

时间复杂性的计算
一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少。设一个程序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=0;
for(int i=1;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=0;
count++; //对应于tsum=0的执行步数
for(int i=0;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

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

 

 

相关文章
|
14天前
|
算法 数据挖掘 数据处理
文献解读-Sentieon DNAscope LongRead – A highly Accurate, Fast, and Efficient Pipeline for Germline Variant Calling from PacBio HiFi reads
PacBio® HiFi 测序是第一种提供经济、高精度长读数测序的技术,其平均读数长度超过 10kb,平均碱基准确率达到 99.8% 。在该研究中,研究者介绍了一种准确、高效的 DNAscope LongRead 管道,用于从 PacBio® HiFi 读数中调用胚系变异。DNAscope LongRead 是对 Sentieon 的 DNAscope 工具的修改和扩展,该工具曾获美国食品药品管理局(FDA)精密变异调用奖。
23 2
文献解读-Sentieon DNAscope LongRead – A highly Accurate, Fast, and Efficient Pipeline for Germline Variant Calling from PacBio HiFi reads
|
6月前
|
缓存 监控 前端开发
Performance Optimization
Performance Optimization
89 2
|
机器学习/深度学习
Time Complexity -mycodeschool
Time Complexity - why should we care? How to analyze Time Complexity? Time Complexity analysis - asymptotic notations. Time Complexity analysis -some general rules.
111 0
|
机器学习/深度学习 算法 流计算
【读书笔记】Algorithms for Decision Making(6)
对于较大状态空间的问题,计算精确解需要极大的内存量,因而考虑近似解的方法。常使用approximate dynamic programming的方法去寻求近似解,进而使用在线方法实现实时计算。
157 0
【读书笔记】Algorithms for Decision Making(6)
|
机器学习/深度学习 自然语言处理 PyTorch
Re6:读论文 LeSICiN: A Heterogeneous Graph-based Approach for Automatic Legal Statute Identification fro
Re6:读论文 LeSICiN: A Heterogeneous Graph-based Approach for Automatic Legal Statute Identification fro
Re6:读论文 LeSICiN: A Heterogeneous Graph-based Approach for Automatic Legal Statute Identification fro
PAT (Advanced Level) Practice - 1096 Consecutive Factors(20 分)
PAT (Advanced Level) Practice - 1096 Consecutive Factors(20 分)
144 0
|
SQL 移动开发 算法
New Dynamic Programming Algorithm for the Generation of Optimal Bushy Join Trees
MySQL无疑是现在开源关系型数据库系统的霸主,在DBEngine的最新排名中仍然稳居第2位,与第3位SQL Server的积分差距并不算小,可以说是最受欢迎,使用度最高的数据库系统,这一点看看有多少新型数据库要兼容MySQL的协议和语法就知道了。
315 0
New Dynamic Programming Algorithm for the Generation of Optimal Bushy Join Trees
|
SQL 编译器 API
Efficiently Compiling Efficient Query Plans for Modern Hardware 论文解读
这应该是SQL查询编译的一篇经典文章了,作者是著名的Thomas Neumann,主要讲解了TUM的HyPer数据库中对于CodeGen的应用。 在morsel-driven那篇paper 中,介绍了HyPer的整个执行框架,会以task为单位处理一个morsel的数据,而执行的处理逻辑(一个pipeline job)就被编译为一个函数。这篇paper则具体讲如何实现动态编译。
438 0
Efficiently Compiling Efficient Query Plans for Modern Hardware 论文解读
|
算法 关系型数据库 MySQL
Fundamental Techniques for Order Optimization
这是一篇1996年的老paper了,主要讲解了IBM DB2如何针对query当中的有序性进行优化。但对于后续physical property的优化有较为深远的影响,由于DB2的优化器起源于System-R以及其后续演进的starburst,因此延续了system-R中的interesting order和order property的概念。关于system-R的介绍请看之前的文章。 order这种physical property并不只限于order by算子,基于有序的group by/distinct等,都会利用到数据的排序操作,而排序本身就是比较昂贵的计算,因此应该对其做尽可能的优化
224 0
Fundamental Techniques for Order Optimization
Basic Concepts of Genetic Data Analysis
Basic Concepts of Genetic Data Analysis
905 0