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

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

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

编程之美子数组的最大乘积

哈希表题目:数的平方等于两数乘积的方法数

编程之法:面试和算法心得(最大连续乘积子串)

Python数据结构与算法(1.7)——算法分析

Python数据结构与算法(1.7)——算法分析

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