268.和算法执行时间相关的因素

1.决定因素

1.1算法选用的策略

1.2问题的规模

1.3编写程序的语言

1.4编译程序产生的机器代码的质量

1.5计算机执行指令的速度

2.其他影响元素

3.问题的规模(时间复杂度)

3.1定义

  一个特定算法的“运行工作量”的大小,?只依赖于问题的规模(通常用整数量n表示),?或者说,它是问题规模的函数。??

  假如,随着问题规模 n 的增长,算法执行时间的增长率和 f(n) 的增长率相同,?则可记作:T (n) = O(f(n)), 称T (n) 为算法的(渐近)时间复杂度。???

  一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,算法的运行时间取决于两者的综合效果。

3.2估算算法的时间复杂度

(Time Complexity)?

3.2.1定义

  从算法中选取一种对于所研究的问题来说是基本操作的原操作,?以该基本操作 在算法中重复执行的次数 作为算法运行时间的衡量准则。

  ?“基本操作” 指的是,该操作重复执行次数和算法的运行时间成正比。

  算法的执行时间=∑原操作(i)的执行次数×原操作(i)的执行时间

  详细?算法的执行时间与原操作执行次数之和成正比

  算法= 控制结构+ 原操作(固有数据类型的操作)

1两个矩阵相乘
??eg1:两个矩阵相乘?
void mult(inta[], int b[], int&c[] ) ?{
// 以二维数组存储矩阵元素,c为 a 和 b的乘积
    for (i=1; i<=n; ++i){?
        for(j=1; j<=n; ++j) ?{
            c[i,j] = 0;
            for(k=1; k<=n; ++k)
                c[i,j] += a[i,k]*b[k,j];
            }
    }
} 基本操作: 乘法操作时间复杂度:  O(n^3)    

2选择排序

3起泡排序

4有如下递归函数fact(n),分析其时间复杂度
int fact(int n){
?if(n<=1) return(1);                (1)
else return(n*fact(n-1));        (2)
}
解:设fact(n)的运行时间复杂函数是T(n),?
     该函数中语句(1)的运行时间是O(1),?
     语句(2)的运行时间为:T(n-1)+O(1),
     其中O(1)为基本运算时间,?
因此:  T(n) = O(1)+T(n-1)
            = O(1)+O(1)+T(n-2)
            = ……
            = (n-1)*O(1)+T(1)
            = n*O(1)
            = O(n)则fact(n)的时间复杂度为O(n)。??

3.2.2分析算法时间复杂度的一般步骤

3.2.3渐进符号

  设n为算法中的问题规模,通常用大O、大Ω和Θ等三种渐进符号表示算法的执行时间与n之间的一种增长关系。

3.2.3.1 大O符号

定义

  定义1(大O符号),f(n)=O(g(n))(读作“f(n)是g(n)的大O”)当且仅当存在正常量c和n0,使当n≥n0时,f(n)≤cg(n),即g(n)为f(n)的上界。

 如3n+2=O(n),因为当n≥2时,3n+2≤4n。
 10n2+4n+2=O(n4),因为当n≥2时,10n2+4n+2≤10n4。

  大O符号用来描述增长率的上界,表示f(n)的增长最多像g(n) 增长的那样快,也就是说,当输入规模为n时,算法消耗时间的最大值。这个上界的阶越低,结果就越有价值,所以,对于10n2+4n+2,O(n2)比O(n4) 有价值。

  一个算法的时间用大O符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑上界”或“紧确上界”。

  一般地,如果

常用的几种时间复杂度的关系

说明:

1.在难以精确计算基本操作执行次数(或语句频度)的情况下,只需求出它关于n的增长率或阶即可2.一个算法的时间复杂度可以具体分为最好、最差(又称最坏)和平均三种情况讨论。?

除特别说明外,正常均指最坏情况下的时间复杂度。

例子

1两个矩阵相乘
??eg1:两个矩阵相乘?
void mult(inta[], int b[], int&c[] ) ?{
// 以二维数组存储矩阵元素,c为 a 和 b的乘积
    for (i=1; i<=n; ++i){?
        for(j=1; j<=n; ++j) ?{
            c[i,j] = 0;
            for(k=1; k<=n; ++k)
                c[i,j] += a[i,k]*b[k,j];
            }
    }
} 基本操作: 乘法操作时间复杂度:  O(n^3)    

2选择排序

3起泡排序

4有如下递归函数fact(n),分析其时间复杂度
int fact(int n){
?if(n<=1) return(1);                (1)
else return(n*fact(n-1));        (2)
}
解:设fact(n)的运行时间复杂函数是T(n),?
     该函数中语句(1)的运行时间是O(1),?
     语句(2)的运行时间为:T(n-1)+O(1),
     其中O(1)为基本运算时间,?
因此:  T(n) = O(1)+T(n-1)
            = O(1)+O(1)+T(n-2)
            = ……
            = (n-1)*O(1)+T(1)
            = n*O(1)
            = O(n)则fact(n)的时间复杂度为O(n)。??

3.2.3.2 大Ω符号

  定义2(大Ω符号),f(n)= Ω(g(n))(读作“f(n)是g(n)的大Ω”)当且仅当存在正常量c和nθ,使当n≥n0时,f(n)≥cg(n),即g(n)为f(n)的下界。

  如3n+2=Ω(n),因为当n≥1时,3n+2≥3n。
  10n2+4n+2=Ω(n2),因为当n≥1时,10n2+4n+2≥n2。  

  大Ω符号用来描述增长率的下界,表示f(n)的增长最少像g(n) 增长的那样快,也就是说,当输入规模为n时,算法消耗时间的最小值。
与大O符号对称,这个下界的阶越高,结果就越有价值,所以,对于10n2+4n+2,Ω(n2)比Ω(n) 有价值。一个算法的时间用大Ω符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑下界”或“紧确下界”。

  一般地,如果,有

3.2.3.3大Θ符号

  定义3(大Θ符号),f(n)= Θ(g(n))(读作“f(n)是g(n)的大Θ”)当且仅当存在正常量c1、c2和n0,使当n≥n0时,有c1g(n)≤f(n)≤c2g(n),即g(n)与f(n)的同阶。

  如3n+2=Θ (n),10n2+4n+2=Θ(n2)。

  一般地,如果,有f(n)=Θ(nm)。

  大Θ符号比大O符号和大Ω符号都精确,f(n)=Θ(g(n),当且仅当g(n)既是f(n)的上界又是f(n)的下界。

3.2.3.4关系

3.3算法的最好、最坏和平均情况

  设一个算法的输入规模为n,Dn是所有输入的集合,任一输入I∈Dn,P(I)是I出现的概率,有ΣP(I) =1,T(I)是算法在输入I下所执行的基本语句次数,则该算法的平均执行时间为:A(n)=。  

  也就是说算法的平均情况是指用各种特定输入下的基本语句执行次数的带权平均值。

  算法的最好情况为:G(n)=,是指算法在所有输入I下所执行基本语句的最少次数。

  算法的最坏情况为:W(n)=,是指算法在所有输入I下所执行基本语句的最大次数。

4.算法选用的策略

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

  对于非递归算法,分析其时间复杂度相对比较简单,关键是求出代表算法执行时间的表达式。
  通常是算法中基本语句的执行次数,是一个关于问题规模n的表达式,然后用渐进符号来表示这个表达式即得到算法的时间复杂度。

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

  递归算法是采用一种分而治之的方法,把一个“大问题”分解为若干个相似的“小问题”来求解。
  对递归算法时间复杂度的分析,关键是根据递归过程建立递推关系式,然后求解这个递推关系式,得到一个表示算法执行时间的表达式,最后用渐进符号来表示这个表达式即得到算法的时间复杂度。

原文地址:https://www.cnblogs.com/ZanderZhao/p/11490735.html

时间: 2024-10-04 10:51:38

268.和算法执行时间相关的因素的相关文章

一个基础而奇怪的问题:算法执行加法、乘法、除法性能无区别?

一个基础而奇怪的问题:算法执行加法.乘法.除法性能无区别? 计算机原理分析觉得:加法.乘法和除法的计算性能依次减少,但减少到什么程度? 编写C程序用30次百万数据计算来測试时间差异性,代码例如以下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0; i

:底座和奇怪的问题算法执行另外、乘法、不加区分除法性能?

底座和奇怪的问题:算法执行加法.乘法.不加区分除法性能? 计算机分析人士认为原则:加法.乘法和除法,以减少计算性能,然而,到什么程度降低? 写C使用程序30乘以一百万计算的数据来测试时间差,码,如以下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0;

插入排序算法执行步数浅析

插入排序算法的基本思路:对于给定的数组a[0...n](数组元素为n,下标从0开始,最大值为n-1),逐个地将后续元素插入到已经排好序的数组中. 插入排序的简单实现如下: 1 /* 2 * 插入排序算法 3 * a:带排序的数组:n:数组中元素的个数 4 */ 5 void insertSort ( int * a, int n ) { 6 int temp = 0; 7 int i = 0; 8 int j = 0; 9 for ( i = 1; i < n; i++ ) { 10 temp

C语言数据结构(二)

算法和算法的衡量 一.算法 算法是为了解决某类问题而规定的一个有限长的操作序列.一个算法必须满足以下五个重要特性: 1.有穷性   对于任意一组合法输入值,在执行又穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成: 2.确定性   对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义即如何执行.并且在任何条件下,算法都只有一条执行路径: 3.可行性   算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之: 4. 有输入

01 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间.所以,执行效率是算法一个非常重要的考量指标.那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间.空间复杂度分析.其实,只要讲到数据结构与算法,就一定离不开时间.空间复杂度分析. 而且,我个人认为,复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半.其实,只要讲到数据结构与算法,就一定离不开时间.空间复杂度分析. 复杂度分析实在太

复杂度分析(上):如何分析、统计算法的执行效率和资源消耗

复杂度分析是什么? 复杂度分析就是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程. 为什么要学习复杂度分析? 没有复杂度分析怎么得到算法执行的时间和占用的内存大小 把代码运行一遍,通过统计.监控,就能得到算法执行的时间和占用的内存大小. 该方法的缺点在于: 1.测试结果非常依赖测试环境 拿同样一段代码,在 Intel Core i9 处理器上运行的速度肯定要比 Intel Core i3 快得多.同一段代码,在不同机器上运行,也可能会有截然相反的结果. 2.测试结

复杂度分析(上)如何分析统计算法的执行效率和资源消耗

一.什么是复杂度分析? 数据结构和算法解决是“如何让计算机更快时间.更省空间的解决问题”. 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系. 二.为什么要进行复杂度分析? 2.1 事后统计法 2.2.1 概念 通过运行代码跑,统计.监控,得到算法执行的时间和占用的内存大小. 2.2.2 劣势 测试结果非常依赖测试环境.测试环境中硬件的不同会对测试结

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字,读完大约需要 6 分钟. 上一篇我们讲了垃圾标记的一些实现细节和经典算法,而本文将系统的讲解一下垃圾回收的经典算法,和Hotspot虚拟机执行垃圾回收的一些实现细节,比如安全点和安全区域等. 因为各个平台的虚拟机操作内存的方法各不相同,且牵扯大量的程序实现细节,所以本文不会过多的讨论算法的具体实现,只会介绍几种算法思想及发展过程. 垃圾回收算法 1.标记-清除算法 标记-清除算法是最基础的算法,像它的名字一样算法分为"标记"和"清除"两个阶段

算法设计与分析 - 李春葆 - 第二版 - pdf-&gt;word v3

1 1.1 第1章─概论 2 3 1.1.1 练习题 4 1. 下列关于算法的说法中正确的有( ). 5 Ⅰ.求解某一类问题的算法是唯一的 6 Ⅱ.算法必须在有限步操作之后停止 7 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 8 Ⅳ.算法执行后一定产生确定的结果 9 A. 1个 B.2个 C.3个 D.4个 10 2. T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是( ). 11 A.T(n)= T(n-1)+1,T(1)=1 B.T(n)= 2n2 12 C.T(n)