标签:
一 算法的时间复杂度分析
(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))为算法的渐进时间复杂度 ,简称时间复杂度。O是数量级的符号。
按数量级递增排列,常见的时间复杂度有:
c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!
二 计算时间复杂度
1 、非递归函数计算时间复杂度
2、递归函数计算时间复杂度
非递归函数计算时间复杂度
(1)确定关键操作
(2)计算关键操作的执行步骤
(3)计算复杂度O()
递归函数计算时间复杂度
(1)计算递归的结构
(2)列出递归方程
(3)解递归方程(比较简单的算法是带入迭代计算)
常用的算法的时间复杂度和空间复杂度:
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 |
冒泡 | O(n2 ) | O(n2 ) | 稳定 | O(1) | n较小时较好 |
交换 | O(n2 ) | O(n2 ) | 不稳定 | O(1) | n较小时较好 |
选择 | O(n2 ) | O(n2 ) | 不稳定 | O(1) | n较小时较好 |
插入 | O(n2 ) | O(n2 ) | 稳定 | O(1) | 大部分已排序时较好 |
基数 | O(logR B) | O(logR B) | 稳定 | O(n) |
B是真数(0-9), R是基数(个十百) |
Shell | O(nlogn) | O(ns ) 1<s<2 | 不稳定 | O(1) |
s是所选分组 |
快速 | O(nlogn) | O(n2 ) | 不稳定 | O(nlogn) | n较大时较好 |
归并 | O(nlogn) | O(nlogn) | 稳定 | O(1) | n较大时较好 |
堆 | O(nlogn) | O(nlogn) | 不稳定 | O(1) |
n较大时较好 |
三 空间复杂度
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。
标签:
原文地址:http://blog.csdn.net/a11211058/article/details/51364799