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

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)。

以上是关于数据结构与算法.复杂度分析的主要内容,如果未能解决你的问题,请参考以下文章

复杂度分析-算法学习的精髓

《图解数据结构与算法》(Java代码实现注释解析算法分析)

数据结构与算法系列二(复杂度分析)

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

以下代码片段的算法复杂度

极简教程:算法与数据结构