结合各种资料,整理出来两类形式
循环主题中的变量参与循环条件的判断
int i=1;
while(i<=n)
i=i*2;
i
=
i
∗
2
i=i*2
i=i∗2是语句执行主体,设执行的次数是t,则有
2
t
≤
n
2^t \leq n
2t≤n,可以得到结果
t
≤
log
2
n
t \leq \log_2^n
t≤log2n。
所以有
T
(
n
)
=
O
(
log
2
n
)
T(n)=O(\log_2^n)
T(n)=O(log2n)。
int y=5;
while((y+1)*(y+1)<n)
y=y+1;
y
=
y
+
1
y=y+1
y=y+1是语句执行主体,设执行的次数是t,则有
t
=
y
−
5
t=y-5
t=y−5,带入可以得到
(
t
+
5
+
1
)
∗
(
t
+
5
+
1
)
<
n
(t+5+1)*(t+5+1)<n
(t+5+1)∗(t+5+1)<n,可以得到结果
t
<
n
−
6
t < \sqrt n-6
t<n−6。
所以有
T
(
n
)
=
O
(
n
)
T(n)=O(\sqrt n)
T(n)=O(n)。
循环主题中的变量与循环条件无关
-
递归程序
一般转换成公式进行递推。
一个算法所需事件有下属递归方程式表示,试求出该算法的时间复杂度的级别,n是问题的规模。
T ( n ) = { 1 , n=1 2 T ( n / 2 ) + n , n>1 T(n)= \begin{cases} 1, &\text{n=1} \\ 2T(n/2)+n, &\text{n>1} \\ \end{cases} T(n)={1,2T(n/2)+n,n=1n>1
解: T ( 2 k ) = 2 k T ( 0 ) + k ∗ 2 k T(2^k)=2^kT(0)+k*2^k T(2k)=2kT(0)+k∗2k,化简得到 T ( n ) = n + n ∗ log 2 n T(n)=n+n*\log_2^n T(n)=n+n∗log2n,
得到结果 T ( n ) = O ( n ∗ log 2 n ) T(n)=O(n*\log_2^n) T(n)=O(n∗log2n) -
非递归程序
比较简单,可以直接累计次数。
int func(int n){
int i=0, sum=0;
while(sum<n) sum += ++i;
return i;
}
主体语句
s
u
m
+
=
+
+
i
;
sum += ++i;
sum+=++i;,设执行的次数是t,得到的
s
u
m
=
0
+
1
+
2
+
.
.
.
+
t
=
1
2
∗
i
∗
(
i
+
1
)
<
n
sum=0+1+2+...+t=\frac{1}{2}*i*(i+1)<n
sum=0+1+2+...+t=21∗i∗(i+1)<n.
所以有
T
(
n
)
=
O
(
n
)
T(n)=O(\sqrt n)
T(n)=O(n)。