`

时间复杂度和空间复杂度详解

 
阅读更多

http://blog.csdn.net/booirror/article/details/7707551


算法的时间复杂度和空间复杂度合称为算法的复杂度。
1.时间复杂度
(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
(2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
     时间频度不同,但时间复杂度可能相同。如:T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
    按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
(3)最坏时间复杂度和平均时间复杂度  最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
     在最坏情况下的时间复杂度为T(n)=0(n),它表示对于任何输入实例,该算法的运行时间不可能大于0(n)。 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
    指数阶0(2n),显然,时间复杂度为指数阶0(2n)的算法效率极低,当n值稍大时就无法应用。
(4)求时间复杂度
【1】如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
x=91; y=100;
while(y>0) if(x>100) {x=x-10;y--;} else x++;
解答: T(n)=O(1),
这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有?
没。这段程序的运行是和n无关的,
就算它再循环一万年,我们也不管他,只是一个常数阶的函数

【2】当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
x=1;
for(i=1;i<=n;i++)
        for(j=1;j<=i;j++)
           for(k=1;k<=j;k++)
               x++;   
该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,因此可以从内层循环向外层分析语句(5)的执行次数:  则该程序段的时间复杂度为T(n)=O(n3/6+低次项)=O(n3)

【3】算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。
在数值A[0..n-1]中查找给定值K的算法大致如下:  
i=n-1;           
while(i>=0&&(A[i]!=k))      
      i--;       
return i;       
此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关: ①若A中没有与K相等的元素,则语句(3)的频度f(n)=n; ②若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。
(5)时间复杂度评价性能
有两个算法A1和A2求解同一问题,时间复杂度分别是T1(n)=100n2,T2(n)=5n3。(1)当输入量n<20时,有T1(n)>T2(n),后者花费的时间较少。(2)随着问题规模n的增大,两个算法的时间开销之比5n3/100n2=n/20亦随着增大。即当问题规模较大时,算法A1比算法A2要有效地多。它们的渐近时间复杂度O(n2)和O(n3)从宏观上评价了这两个算法在时间方面的质量。在算法分析时,往往对算法的时间复杂度和渐近时间复杂度不予区分,而经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。

2.空间复杂度
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。  
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n))  其中n为问题的规模,S(n)表示空间复杂度。

分享到:
评论

相关推荐

    计算机等级考试二级公共基础知识120题详解篇

    计算机等级考试二级公共基础知识120题详解篇。如: (1) 下面叙述正确的是______。 A. 算法的执行效率与数据的存储结构无关 ...空间复杂度:实现算法所占用的空间为g(n)(也为n的函数)。 A应为有关。

    JS排序之选择排序详解

    本文为大家分享了JS选择排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个...时间复杂度,空间复杂度,稳定性 平均时间复杂度O(n*n) 最好情况O(n*n) 最差情况O(n*n) 空间复杂度O(1) 稳定性:

    JS排序之快速排序详解

    本文为大家分享了JS快速排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个算法执行所耗费的时间...时间复杂度,空间复杂度,稳定性 平均时间复杂度O(nlogn) 最好情况O(nlogn) 最差情况O(n*n) 空

    JS排序之冒泡排序详解

    本文为大家分享了JS冒泡排序的具体代码,供大家参考,具体内容如下 ...时间复杂度,空间复杂度,稳定性 平均时间复杂度O(n*n) 最好情况O(n) 最差情况O(n*n) 空间复杂度O(1) 稳定性:稳定 冒泡排序的写法 var ex

    Python实现括号匹配方法详解

    1.用一个栈【python中可以用List】就可以解决,时间和空间复杂度都是O(n) # -*- coding: utf8 -*- # 符号表 SYMBOLS = {'}': '{', ']': '[', ')': '(', '&gt;': '&lt;'} SYMBOLS_L, SYMBOLS_R = SYMBOLS.values(), ...

    大厂学院SVIP十门合集|完结无秘

    深入理解时间复杂度与空间复杂度 经典算法与数据结构解析 关于如何斩获大厂Offer 海量数据 核心框架 分布式 SCN/SCA组件选型 Eureka源码 Nacos源码 OpenFeign源码 Sentinel源码 Spring Cloud Gateway源码 Paxos算法 ...

    二级c语言试题集锦 带有解题思路 大家快看看吧

    空间复杂度:实现算法所占用的空间为g(n)(也为n的函数)。 A应为有关。 (2) 以下数据结构中不属于线性数据结构的是______。 A. 队列 B. 线性表 C. 二叉树 D. 栈 (2) [答案]C [考点]数据结构与算法 [评析]

    C++归并排序详解以及代码实现

    归并排序(Merge Sort)是一种采用分治法(Divide and Conquer)策略的排序算法。该算法首先将已有序的子序列合并,得到完全有序的...归并排序的空间复杂度是 O(n),因为在合并过程中需要额外的空间来存储临时变量。

    C++直接插入排序详解以及代码实现

    归并排序(Merge Sort)是一种采用分治法(Divide and Conquer)策略的排序算法。该算法首先将已有序的子序列合并,得到完全有序的...归并排序的空间复杂度是 O(n),因为在合并过程中需要额外的空间来存储临时变量。

    C++ 计数排序实例详解

    计数排序  计数排序是一种非比较的排序算法 优势:  计数排序在对于一定范围内的整数排序时,时间复杂度为O(N+K) (K为整数在范围)快于任何比较排序算法,因为基于比较...空间复杂度:  O(最大数-最小数) 性能:

    动态规划ppt详解

    动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种 状态,所以它的空间复杂度要大于其它的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却...

    C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip

    直接插入排序的空间复杂度为O(1),因为它不需要额外的存储空间。此外,直接插入排序是稳定的,即相等的元素在排序后保持原有的相对顺序。 直接插入排序适用于待排序序列较小或基本有序的情况,因为它在处理小规模...

    java删除指定字符串leetcode-Data-Structures-Algorithms:此存储库的唯一目的是提醒某些数据结构和算法如何在

    空间复杂度 创建一个空数组 O(1) 上) 在数组中插入一个值 O(1) O(1) 遍历给定数组 上) O(1) 访问给定的单元格编号 O(1) O(1) 搜索给定值 上) O(1) 删除单元格的值 O(1) O(1) 二维数组的时空复杂度 细节 时间...

    基于C++ map中key使用指针问题的详解

    C++实际开发的过程会经常使用...确定采用find方式查找数据后,我们需要考虑存储map的空间复杂度,对于基础数据类型的数据(int char等)这里就不做讨论。本文讨论的是map中存储的数据结构struct情况。1、如果map中的key

    NSGA2算法MATLAB程序

    NSGA-Ⅱ算法是 Srinivas 和 Deb 于 2000 年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的共享半径 ...

    考研-数据结构-殷人昆.zip

    1.2 算法的时间复杂度与空间复杂度分析基础 12 1.2.1 考研中的算法时间复杂度分析 12 1.2.2 例题选讲 12 1.2.3 考研中的算法空间复杂度分析 14 1.3 数据结构和算法的基本概念 14 1.3.1 数据结构的基本概念 14 1.3.2 ...

    C++ 算法之希尔排序详解及实例

    C++ 算法之希尔排序算法详解及实例 ...空间复杂度:  O(1) 性能:  希尔排序为不稳定算法(一次插入排序是稳定的,不会改变相同元素的相对顺序,但是在不同的插入排序中,相同的元素可能在各自的插

    详解字典树Trie结构及其Python代码实现

    它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关。Hash 表号称是 O(1) 的,但在计算 hash 的时候就肯定会是 O(k) ,而且还有碰撞之类的问题;Trie 的缺点是空间消耗很高...

    Floyd算法-java实现

    解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短...Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。 java代码实现。算法详解,参考技术文档 https://www.jianshu.com/p/db0df9197073

    Christofides算法

    Christofides算法 Christofides算法是一种算法,用于在距离形成度量空间(它们对称且服从三角形不等式)的情况下,... 使用M和T的边缘建立欧拉回路 通过跳过重复的顶点来建立哈密顿回路 Python实现 在文件christofid

Global site tag (gtag.js) - Google Analytics