标签:
衡量一个算法的好坏,需要从时间复杂度和空间复杂度去考虑。时间复杂度就是这个算法需要执行的基本指令的次数,空间复杂度就是这个算法需要占用的内存空间的大小。很明显,在完成同样工作的前提下,执行的指令次数越少,占用的内存空间越少,这个算法就越好。
时间复杂度
怎么算时间复杂度?
算法复杂度由2个函数复合而来。第一个是关于问题规模n的函数f(n),f(n)求得的就是这个算法执行的基本指令的次数。
问题规模:比如,一个算法第一次要计算1+2+3+......+10的和,第二次要计算1+2+3........+100的和,那么,这里的10和100就是问题规模。
int total = 0; //1次 int n = 100; //1次 for(int i=1;i<=n;++i) //n=100次 { total+=i; }
如上的例子,在问题规模n=100的情况下,f(n) =102,那么,通用表达式就是:f(n) = n+2
第二个函数就是n关于就O(f(n))的函数(又叫大O阶),所以,总体的公式就是 : O(f(n))
O(f(n))的推导过程:
1、先得出f(n)的通用表达式
2、去掉f(n)中的常数项和低次项,只保留最高次项。
3、去掉最高次项的系数, 得到的表达式就是O(f(n))的表达式
热身练习:
分别求出下面2个算法的时间复杂度
#include<stdio.h> /* T(n) = O(f(n)) = O(n) */ int main(void) { int total = 0; int n; scanf("%d",&n); for(int i=1;i<=n;++i) total+=i; printf("total = %d\n",total); return 0; }
#include<stdio.h> /* T(n) = O(f(n)) =O(1) */ int main(void) { int total = 0; int n; scanf("%d",&n); total = ((1+n)*(n)) / 2; //著名数学王子高斯的求和公式 printf("total = %d\n",total); return 0; }
附表1:常见的排序算法的时间复杂度
排序法 |
最差时间分析 | 平均时间复杂度 | 稳定度 | 空间复杂度 |
冒泡排序 | O(n2) | O(n2) | 稳定 | O(1) |
快速排序 | O(n2) | O(n*log2n) | 不稳定 | O(log2n)~O(n) |
选择排序 | O(n2) | O(n2) | 稳定 | O(1) |
二叉树排序 | O(n2) | O(n*log2n) | 不一顶 | O(n) |
插入排序 |
O(n2) | O(n2) | 稳定 | O(1) |
堆排序 | O(n*log2n) | O(n*log2n) | 不稳定 | O(1) |
希尔排序 | O | O | 不稳定 | O(1) |
附表2:时间复杂度大小顺序
Ο(1) < Ο(log2n) < Ο(n) < Ο(nlog2n) < Ο(n 2) < Ο(n3) < …<Ο(2n) < Ο(n!)
总结:算法的时间复杂度反应了一个算法,随着问题规模的变化,计算机需要执行的指令的次数的变化情况。
标签:
原文地址:http://www.cnblogs.com/lulipro/p/5297456.html