`

算法的时间复杂度 -- basic1

 
阅读更多

http://www.cppblog.com/85940806/archive/2011/03/12/141672.html

 

求解算法的时间复杂度的具体步骤是:

  ⑴ 找出算法中的基本语句;

  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  ⑵ 计算基本语句的执行次数的数量级;

  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

  ⑶ 用大Ο记号表示算法的时间性能。

  将基本语句执行次数的数量级放入大Ο记号中。

  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:

  for (i=1; i<=n; i++)
  x++;

  for (i=1; i<=n; i++)
  for (j=1; j<=n; j++)
  x++;

  第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。

  常见的算法时间复杂度由小到大依次为:

  Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

  Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)。Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者是有效算法,把这类问题称 为P类问题,而把后者称为NP问题。

O(1)

Temp=i;i=j;j=temp;                    

以 上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时 间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

O(n^2)

2.1. 交换i和j的内容
     sum=0;                 (一次)
     for(i=1;i<=n;i++)       (n次 )
        for(j=1;j<=n;j++) (n^2次 )
         sum++;       (n^2次 )
解:T(n)=2n^2+n+1 =O(n^2)

2.2.  
    for (i=1;i<n;i++)
    {
        y=y+1;         ①  
        for (j=0;j<=(2*n);j++)   
           x++;        ②     
    }         
解: 语句1的频度是n-1
          语句2的频度是(n-1)*(2n+1)=2n^2-n-1
          f(n)=2n^2-n-1+(n-1)=2n^2-2
          该程序的时间复杂度T(n)=O(n^2).        

O(n)     
                                                      
2.3.
    a=0;
    b=1;                      ①
    for (i=1;i<=n;i++) ②
    { 
       s=a+b;    ③
       b=a;     ④ 
       a=s;     ⑤
    }
解: 语句1的频度:2,       
           语句2的频度: n,       
          语句3的频度: n-1,       
          语句4的频度:n-1,   
          语句5的频度:n-1,                                 
          T(n)=2+n+3(n-1)=4n-1=O(n).
                                                                                                 
O(log2n)

2.4.
     i=1;       ①
    while (i<=n)
       i=i*2; ②
解: 语句1的频度是1, 
          设语句2的频度是f(n),   则:2^f(n)<=n;f(n)<=log2n   
          取最大值f(n)= log2n,
          T(n)=O(log2n )

O(n^3)

2.5.
    for(i=0;i<n;i++)
    { 
       for(j=0;j<i;j++) 
       {
          for(k=0;k<j;k++)
             x=x+2; 
       }
    }
解: 当i=m, j=k的时候,内层循环的次数为k当i=m时, j 可以取 0,1,...,m-1 , 所以这里最内循环共进行了0+1+...+m-1=(m-1)m/2次所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以时间复杂度为O(n^3).

一个经验规则

有如下复杂度关系

c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!

其中c是一个常量,如果一个算法的复杂度为c 、 log2N 、n 、 n*log2N ,那么这个算法时间效率比较高 ,如果是 2^n , 3^n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。


本文来自CSDN博客,转载请标明出处:http://www.cppblog.com/85940806/archive/2011/03/12/141672.html

分享到:
评论

相关推荐

    HY-MOTOR-Basic-1.00.rar

    《HY-MOTOR-Basic-1.00.rar》是一个压缩包文件,主要涉及电机控制技术,特别是针对永磁同步电机(PSM)和无刷直流电机(BLDC)的高效控制策略。源程序的设计旨在实现数据与电机的精确配合,以优化电机性能,并在实际...

    VisualBasic-使用visualbasic实现的插值排序算法.zip

    插值排序是一种线性时间复杂度的排序算法,尤其适用于部分有序的数据集。在本项目"VisualBasic-使用visualbasic实现的插值排序算法.zip"中,我们将深入探讨插值排序的原理、其在Visual Basic中的实现以及如何利用...

    python-algorithms-mastering-basic-algorithms-in-the-python-langu

    1. **算法分析**:学习如何分析算法的时间复杂度和空间复杂度,了解它们对程序性能的影响,以及如何优化算法以提高效率。 2. **数据结构**:介绍Python中的基本数据结构,如列表、元组、字典、集合等,以及更高级的...

    Programming-games-in-Visual-Basic-State-Universi.pptx

    1. **插入排序(Insertion Sort)**:插入排序是一种基础的排序算法,它工作原理类似于手动整理一副扑克牌。在VB中,你可以创建一个子程序来实现插入排序,比较当前元素并将其插入到已排序的部分。最佳情况的时间...

    Visual-Basic常用数值算法集

    《Visual-Basic常用数值算法集》是一本专为VB(Visual Basic)编程者设计的实用指南,由知名教育家何光渝老师编写,由科学出版社出版。这本书详细介绍了在VB环境中实现的一系列重要数值计算算法,并附带了完整的源...

    自适应基本单元级率控制算法_JVT-G012.pdf

    - **组1 可变位率(VBR)** - **目的**: 验证算法在可变位率场景下的有效性。 - **结果**: 实际产生的位数与预定位率曲线非常接近,缓冲区未出现溢出现象。 - **组2 恒定位率(CBR)** - **目的**: 比较本文提出的...

    deep-dive-massive-mimo-basic-principle

    为解决这一问题,研究者开发了一系列低复杂度的算法,如最小均方误差(MMSE)预编码、匹配滤波器预编码等,以实现在保持性能的同时降低硬件成本。 7. **能源效率** 大规模MIMO不仅提高了频谱效率,还通过利用阵列...

    VisualBasic程序设计形考1-5全答案.zip

    - 程序调试与优化:理解并改进冒泡排序的时间复杂度。 3. **实验4:菜单设计** 学生会接触到VB的菜单系统,创建一个具有多级菜单的程序。主要知识点包括: - 菜单条(MenuStrip)控件:用于添加和组织菜单项。 ...

    如何实现排序算法小程序Visual Basic6.0源程序,VB6.0源代码

    7. 计数排序、桶排序和基数排序:这些是线性时间复杂度的非比较排序算法,适用于特定类型的输入数据。 在VB6.0中实现这些排序算法,你需要理解每种算法的基本思想,并能用VB6.0的语言特性来编写相应的代码。例如,...

    deep-dive-massive-mimo-basic-principle_mimo_DeepDive!_dive_massi

    为此,研究者们提出了一系列低复杂度的算法,如最小均方误差(MMSE)预编码、零强迫(ZF)预编码等,以平衡性能与计算需求。 六、硬件实现与挑战 大规模MIMO的硬件实现涉及到天线集成、功耗控制以及实时处理能力。...

    最短路径算法--vb源码

    - **Bellman-Ford算法**:能处理含有负权边的图,但时间复杂度比Dijkstra高,为O(V * E),其中V是顶点数量,E是边的数量。 - **Floyd-Warshall算法**:用于求解所有顶点对之间的最短路径,对于稠密图效率较高,...

    Python Algorithms - Mastering Basic Algorithms in the Python Language

    这部分涵盖了算法的基本概念,包括时间复杂度、空间复杂度等。同时介绍了Python内置的数据结构如列表、字典、集合等,为后续的学习打下坚实的基础。 ##### 计数基础 这一章节重点讨论了计数的基本原理及其在算法...

    数据结构与算法C#描述

    - 案例研究:比较不同排序算法的时间复杂度。 - **案例研究** - 结合实际项目,分析数据结构与算法的应用场景。 - 例如:电子商务网站中的商品推荐系统设计。 #### 三、特色与优势 - **面向C#开发者** - 本书...

    VB.rar_VB_basic 算法_vb 算法

    在学习VB Basic算法时,理解每种算法的工作原理、时间复杂度和空间复杂度至关重要。同时,通过编写和调试代码来实践这些算法,能够加深对算法的理解,并提升编程能力。VB Basic算法的掌握将有助于开发者构建更高效、...

    VB程序设计常用算法

    在VB(Visual Basic)程序设计中,算法是解决问题的核心,它们是编程的灵魂,使得计算机能够按照特定步骤执行任务。本文将深入探讨VB程序设计中的一些常用算法,旨在帮助开发者更好地理解和应用这些算法。 1. 排序...

    用vb实现DES加解密算法(三)--解密

    - `KeyPC_1`:存储经过PC-1置换后的56位密钥。 - `BinCode`:存储64位待解密的密文。 - `CodeIP`:存储经过初始置换(Initial Permutation)后的密文。 以及多个`L`和`R`变量对,分别代表明文或密文中左半部分...

    vb常用算法大全

    【VB常用算法大全】是一个集合了多种在Visual Basic(VB)编程中常用算法的资源库。这个压缩包可能包含了各种类型的代码示例、教程或笔记,帮助开发者掌握和运用VB编程中的核心算法。以下是一些可能包含的重要算法及...

    算法设计技巧与分析课件(英文版):ch1 Basic Concepts in Algorithmic Analysis.ppt

    "算法设计技巧与分析课件(英文版):ch1 Basic Concepts in Algorithmic Analysis.ppt" 提供了对这一主题的深入探讨,旨在帮助学生掌握算法的核心特性,理解分析算法的基本方法,并通过实例学习如何设计算法。...

    dna相似性算法分析

    此外,除了基本的比对算法,还涉及到多种优化策略和改进方法,如使用哈希表预计算得分、引入 gap penalty(插入缺失罚分)以处理不完全匹配的情况、以及使用启发式搜索算法如BLAST(Basic Local Alignment Search ...

    suanfa.rar_basic 算法

    《Visual Basic下的算法图形设计详解》 在编程领域,算法是解决问题的核心,它是指令的有序集合,用于解决特定问题或执行特定任务。而在Visual Basic(VB)这种面向对象的编程环境中,我们可以利用其丰富的图形界面...

Global site tag (gtag.js) - Google Analytics