#时间复杂度
定义:算法中基本操作的执行次数作为时间复杂度的度量
步骤:
1.找到算法中的基本操作
2.计算基本操作重复执行的次数m,即求一个执行次数为 n(n<=输入规模)的函数f(n)= m
3.取出f(n)中随n增大而增大最快的项(指数最大的项),然后将其系数置为1,T(n) = O(f(n))
######这里解释一下为什么是计算函数f(n),和将系数置为1
算法的渐近分析不是从时间上度量算法的运行效率,而是度量算法运行时间的增长趋势
即,在输入规模充分大时,算法的基本语句执行次数在渐近意义下的阶
换句话说就是在输入规模大于n0时,执行次数的上界
对于任意n>=n0,都有T(n)<=cf(n),则T(n) = O(f(n))
根据上图可知,对于输入规模大于n0,只要T(n)无限接近cf(n)就行,c是系数,f(n)不唯一,
但对T(n)影响较大的就是f(n)的最高阶
常见复杂度
举个栗子:
void func(int n){
int i = 1,j = 100;
while(i < n){
++j;
i+=2;
}
}
1.基本操作:++j,i+=2。大多数情况下最深的循环内的语句是基本操作
2.确定输入规模n
3.确定f(n),
假设循环执行m次,i = 1 + 2m,由于循环结束时i>n,所以设1+2m+x = n,f(n) = m =(n-1-x)/2
所以T(n)=O(n)
for(i=1;i<=n;i++)//循环了(n+n-1+n-2+...+1)≈(n^2)/2=>O(n^2)
for(j=i;j<=n;j++)
s++;
for(i=1;i<=n;i++)//循环了(1+2+3+...+n)≈(n^2)/2,当然也是O(n^2)
for(j=1;j<=i;j++)
s++;
###递归算法的时间复杂度分析
$T(n)=
$$2 , n=0\brace T(n-1)+2,n>0
$, 当n=2^k,T(n)=?
T(n) = T(n-1) +2
= (T(n-2)+2)+2
= ((T(n-3)+2)+2)+2
...
=T(n-n) + 2+2+...+2 (n个2)
=T(0)+2n
=2+2n
=O(n)
必须化为n的函数,不要有k