曾经学的那些表示时间复杂度的公式怎么来的?

1. 常数阶
O(1)
Temp=i;
i=j;
j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
2. 线性阶
a=0  ①
b=1  ②
for(i=1;i<n;i++)  ③
{
    s=a+b;  ④
    b=a;  ⑤
    a=s;  ⑥
}
语句1的频度:1
语句2的频度:1
语句3的频度:n
语句4的频度:n-1
语句5的频度:n-1
语句6的频度:n-1
T(n)=O(f(n))=1+1+n+3(n-1)=4n-1=O(n)
3. 平方阶
# 交换i和j
sum=0;  # 1
for(i=1;i<=n;i++)  # n
{
    for(j=1,j<=n,j++)  # n^2
    {
        sum++;  # n^2
    }
}
T(n)=1+n+n^2+n^2=2n^2+n+1=O(n^2)   # 去掉常数,低阶,高阶的系数
4. 立方阶
for(i=0;i<n;i++)
{
    for(j=0;j<i;j++)
    {
        for(k=0;k<j;k++)
        {
            x=x+2;
        }       
    }
}
i,j,k 最大值均可以取到n-1,所以n-1的三次方为最大执行次数。所以时间复杂度为O(n^3)。
5. 对数阶
i=1;
while(i<=n)
    i=i*2;
假设i=n时刚好结束循环
第1次:i=1*2=2
第2次:i=2*2=2^2
   3: i=4*2=2^3
   4: i=8*2=2^4
  ...
   x: i=n=2^x
x=log2n
f(n)=log2n
T(n)=O(log2n)

在计算时间复杂度时,我们一般使用的大O表示法,其时间复杂度,从小到大的排序是:
(1) < (logn)< (n)< (nlogn)< (n^2)<...< (2^n)< (n!)

posted @ 2022-04-05 19:07  我是一言  阅读(59)  评论(0编辑  收藏  举报