数据结构与算法——复杂度分析

可紊 提交于 2020-01-21 05:18:06

1、大O复杂度表示法

1.1、从维度划分

从维度划分可分为:时间复杂度、空间复杂度

1.1.1、时间复杂度

概念

代码执行时间随数据规模增长的变化趋势

多项式量级复杂度分析规则(非多项式量级不常见暂不考虑)

顺序相加,嵌套相乘,取最高阶

阶数排序

幂阶(n4>n3>n2n^4>n^3>n^2)>线性对数阶(nlognnlogn)>线性阶(nn)>对数阶(lognlogn)>常数阶(1)

举例

int a=0;
for(int i=0;i<n;i++){
	a=a+1;
	for(int j=0;j<n;j++){
		a=a+2;
	}
}
int b=1;
while(b <= n){
  b=b*10;
}

第一行:执行1次

第二行:循环执行n次

第三行:循环执行n次

第四行:循环执行n2n^2

第五行:循环执行n2n^2

第八行:循环执行lognlogn

总计:2n2+2n+logn+12n^2+2n+logn+1次,取最高阶T(n)=O(n2n^2)

1.1.2、空间复杂度

概念

算法的存储空间随数据规模增长的变化趋势

举例

int[] arr = new int[n];

空间复杂度T(n)=O(nn)

1.2、从分析角度划分(以时间复杂度为例)

从分析方面可分为:最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度

1.2.1、最好情况时间复杂度

概念

在最理想的情况下,执行算法的时间复杂度

1.2.2、最坏情况时间复杂度

概念

在最糟糕的情况下,执行算法的时间复杂度

###1.2.3、平均情况时间复杂度

概念

在所有情况下,执行算法的时间总和的平均值

1.2.4、均摊时间复杂度

概念

​ 大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上

举例

int a=0;
for(int i=0;i<n;i++){
	a=a+1;
  if(a == x){
    break;
  }
}

最好情况时间复杂度:循环第一次就能跳出循环,时间复杂度为O(1)

最坏情况时间复杂度:循环到最后一次才跳出循环,或者直到循环结束,时间复杂度为O(n)

平均情况时间复杂度:循环到中间某次就跳出循环,(1+2+3+...+n+n)(n+1)(1+2+3+...+n+n)\over(n+1)==n2n\over2+1+1-1(n+1)1\over(n+1),T(n)=O(n)

均摊时间复杂度:本例用不到(不太常用就不计算了哈哈)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!