数据结构中复杂度问题
复杂度问题想必是很多人最头疼的问题,下面就对其进行一些总结
复杂度分为:时间复杂度与空间复杂度
空间复杂度:算法运行时,占用多少内存,包括指令空间、数据空间和环境栈空间;
时间复杂度:执行程序所使用的时间量级,包括编译时间和运行时间。
评价一个算法的好坏,一般两种复杂度呈现线性增长是最好的。
常见的时间复杂度:
常数阶:O(1)
对数阶:O(log2n)
线性阶:O(n)
线性对数阶:O(nlog2n)
平方阶,立方阶:O(n^2),O(n^3)
K次方阶:O(n^k)
指数阶:O(2^n)
时间复杂度的计算方法:
1.去掉运行时间中的所有加法常数。
2.只保留最高阶项。
3.如果最高阶项存在且不是1,去掉与这个最高阶相乘的常数得到时间复杂度
举个简单的例子:
int a=0
for(int i=1;i<n;i++){
a++;
}
该例子中共运行了n-1次,去掉加法常数-1(因为n取较大时,常数对时间复杂度影响较小),进而可得知时间复杂度为n,用O(n)表示
再举例,若一个程序的复杂度为n^2/2+3显然先去掉常数项3,再保留最高项n^2/2,去掉最高项想成的常数1/2就可得时间复杂度O(n^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) |
最后希望可以帮到大家~