数据结构与算法.复杂度分析
Posted qq_51102350
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法.复杂度分析相关的知识,希望对你有一定的参考价值。
复杂度分析
一,大O复杂度表示法
前提:假设每行代码执行时间一样,都为unit time
公式:T(n)=O(f(n))
二,时间复杂度分析
准则:
1,只关注循环次数最多的那一段代码
2,加法准则:总复杂度等于量级最大的代码段的复杂度
3,乘法准则:嵌套代码的复杂度等于嵌套代码内外复杂度的乘积
几种常见的时间复杂度:
1,O(1)
2,O(log(n)),O(nlog(n))
案例:
int i=1;
while(i<=n)
i=i*2;
当程序结束,2^x=n,x=log2(n),x为执行次数
称为对数阶复杂度
3,O(m+n),O(m*n)
int m,n;
//此时复杂度为O(m+n)
for(int i=1; i<m;i++);
for(int i=1; i<n;i++);
//此时复杂度为O(m*n)
for(int i=1; i<m;i++)
for(int i=1; i<n;i++);
三,空间复杂度分析
四,最好、最坏时间复杂度
int find(int[] array,int n,int x)
int pos=-1;
for(int i=0;i<n;i++)
if(array[i]==x)
pos=i;
break;
return pos;
如该段代码,其时间复杂度最好为O(1),最差为O(n)
五、平均时间复杂度
int find(int[] array,int n,int x)
int pos=-1;
for(int i=0;i<n;i++)
if(array[i]==x)
pos=i;
break;
return pos;
上述代码,要查找的变量x在数组中的位置,有n+1中情况:在数组中有0~n-1个位置和不在数组中,我们把每种情况下,查找需要遍历的元素个数累加起来,然后再除以n+1,就可以得到需要遍历的元素个数的平均值,即:
此时,由大O计数法,其时间复杂度为O(n)
六、均摊时间复杂度
//n表示数组array的长度
//array.length=n
int count=0;
int[] array=new int[n];
void insert(int val)
if(count==array.length)
int sum=0;
for(int i=0;i<array.length;++i)
sum=sum+array[i];
array[0]=sum;
count=1;
array[count]=val;
++count;
大部分情况时间复杂度为O(1),少部分为O(n)时,可以将O(n)的时间均摊到其它的O(1)上,则总的时间复杂度为O(1)。
以上是关于数据结构与算法.复杂度分析的主要内容,如果未能解决你的问题,请参考以下文章