算法的复杂度分为:时间复杂度和空间复杂度
1、时间复杂度实际就是一个函数,该函数计算的是执行基本操作的次数;本质就是在计算基本操作重复执行的次数 ,并且大多数情况下分析的是最坏情况的
例如:
voidTest(int n)
{
int iConut = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
iCount++;
}
}
for(int k = 0; k < 2*n; ++k)
{
iCount++;
}
int count = 10;//执行10次
while(count--)
{
iCount++;
}
}
语句总执行次数:f(n)= n^2+ 2*n + 10
然而算法存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数,通常最好情况不会出现(下界)
例如:在一个长度为N的线性表中搜索一个数据x
最好情况:1次比较
最坏情况:N次比较
平均情况:N/2次比较
在实际中通常关注的是算法的最坏运行情况,即:任意输入规模N,
算法的最长运行时间
计算机的两个准则:
1、 忽略掉那些常数
2、关注函数式中增长最快表达式
|
最差时间分析 |
平均时间复杂度 |
稳定度 |
空间复杂 |
冒泡排序 |
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、普通情况下的空间复杂度
空间复杂度就是函数中创建对象的个数关于问题规模函数表达式,一般情况用O的渐进表示法表示。
对于一个算法来说,空间复杂度和时间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。
有时我们可以用空间来换取时间以达到目的。