详解来源html
(1)、O(1)算法
Temp=i; i=j; j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记做T(n)=O(1)。注意:若是算法的执行时间不随着问题规模n的增长而增加,即便算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
(2)、O(n2)code
2.1. 交换i和j的内容htm
sum=0; (一次) for(i=1;i<=n;i++) (n+1次) for(j=1;j<=n;j++) (n2次) sum++; (n2次)
解:由于Θ(2n2+n+1)=n2(Θ即:去低阶项,去掉常数项,去掉高阶项的常参获得),因此T(n)= =O(n2);
2.2.blog
for (i=1;i<n;i++) { y=y+1; ① for (j=0;j<=(2*n);j++) x++; ② }
解:
语句1的频度是n-1
语句2的频度是(n-1)*(2n+1)=2n2-n-1
f(n)=2n2-n-1+(n-1)=2n2-2;
又Θ(2n2-2)=n2
该程序的时间复杂度T(n)=O(n2).get
通常状况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加一、终值判别、控制转移等成分,当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。循环
(3)、O(n)程序
a=0; b=1; ① for (i=1;i<=n;i++) ② { s=a+b; ③ b=a; ④ a=s; ⑤ }
解:
语句1的频度:2,
语句2的频度: n,
语句3的频度: n-1,
语句4的频度:n-1,
语句5的频度:n-1,
T(n)=2+n+3(n-1)=4n-1=O(n).时间
(4)、O(log2n)co
i=1; ① hile (i<=n) i=i*2; ②
解:
语句1的频度是1,
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)=log2n,
T(n)=O(log2n )
(5)、O(n3)
for(i=0;i<n;i++) { for(j=0;j<i;j++) { for(k=0;k<j;k++) x=x+2; } }
解:当i=m, j=k的时候,内层循环的次数为k当i=m时, j 能够取 0,1,...,m-1 , 因此这里最内循环共进行了0+1+...+m-1=(m-1)m/2次因此,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6因此时间复杂度为O(n3).