时间复杂度
时间复杂度是只考虑次数
,不考虑常数
的,这点可以与微积分的无穷大类比,当
n
−
>
∞
n->∞
n−>∞时,无论常数k
有多大,都可以将其省略。
常见时间复杂度:
O
(
1
)
O(1)
O(1),
O
(
n
)
O(n)
O(n),
O
(
n
2
)
O(n^2)
O(n2),
O
(
n
)
O(\sqrt n)
O(n),
O
(
l
o
g
n
)
O(logn)
O(logn),
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
历年时间复杂度相关题目
2011-1
题目
设 n n n是描述问题规模的非负整数,下面程序片段的时间复杂度是
x=2;
while(x<n/2)
x=2*x;
A. O ( l o g 2 n ) O(log_2n) O(log2n) B. O ( n ) O(n) O(n) C. O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) D. O ( n 2 ) O(n^2) O(n2)
解
分析题意我们知道每次x都会乘以2,直到
x
>
=
n
2
x>=\frac n 2
x>=2n为止。
所以有
2
∗
2
k
=
=
n
2
2*2^k == \frac n 2
2∗2k==2n
−
>
->
−>
2
k
=
=
n
4
2^k == \frac n 4
2k==4n
−
>
->
−>
k
=
l
o
g
2
n
4
k = log_2{\frac n 4}
k=log24n
因为时间复杂度只看次数,不看常数,所以
k
=
l
o
g
2
n
k = log_2n
k=log2n,选择A
项
2012-1
题目
求整数 n ( n ≥ 0 ) n(n≥0) n(n≥0)阶乘的算法如下,其时间复杂度是
int fact(int n){
if (n<=1) return 1;
return n*fact(n-1);
}
A. O ( l o g 2 n ) O(log_2n) O(log2n) B. O ( n ) O(n) O(n) C. O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) D. O ( n 2 ) O(n^2) O(n2)
解
分析题意我们知道这就是算
n
!
n!
n!,因此其时间复杂度为
O
(
n
)
O(n)
O(n),选择B
项
2013-1
题目
已知两个长度分别为
m
m
m和
n
n
n的升序链表,若将它们合并为一个长度为
m
+
n
m+n
m+n的降序链表,则
最坏情况下的时间复杂度是
A.
O
(
n
)
O(n)
O(n) B.
O
(
m
n
)
O(mn)
O(mn) C.
O
(
m
i
n
(
m
,
n
)
)
O(min(m,n))
O(min(m,n)) D.
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n))
解
两个升序链表合并的最坏情况是两个链表较长的链表每个元素都与较短的链表进行比较,因此最坏情况的时间复杂度是
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n)),选择D
项
2014-1
题目
下列程序段的时间复杂度是
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
A. O ( l o g 2 n ) O(log_2n) O(log2n) B. O ( n ) O(n) O(n) C. O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) D. O ( n 2 ) O(n^2) O(n2)
解
依题意,共有两层for循环,里面的为
1
∼
n
1\sim n
1∼n,时间复杂度为
O
(
n
)
O(n)
O(n)
外面的每次乘以2,易得时间复杂度为
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)
因此总的时间复杂度为
O
(
n
l
o
g
2
n
)
O(nlog_2n)
O(nlog2n),选择C
项
2017-1
题目
下列函数的时间复杂度是
int func ( int n)
{ int i=0, sum=0;
while(sum< n) sum += ++ i;
return i ;
}
A. O ( l o g n ) O(logn) O(logn) B. O ( n 1 2 ) O(n^{\frac 1 2}) O(n21) C. O ( n ) O(n) O(n) D. O ( n l o g n ) O(nlogn) O(nlogn)
解
此处需要注意,i是自增的,即
s
u
m
=
1
+
2
+
.
.
.
.
.
.
+
k
<
n
sum = 1 + 2 + ...... + k < n
sum=1+2+......+k<n,易得
k
(
k
+
1
)
2
<
n
\frac {k(k+1)} 2 < n
2k(k+1)<n,去掉常数得
k
2
<
n
k^2 < n
k2<n,
k
=
l
o
g
2
n
k = log_2n
k=log2n,因此选择A
项
2019-1
题目
设 n n n是描述问题规模的非负整数,下面程序片段的时间复杂度是
x = 0;
while(n >=(x + 1)*(x + 1))
x = x + 1
A. O ( l o g n ) O(logn) O(logn) B. O ( n 1 2 ) O(n^{\frac 1 2}) O(n21) C. O ( n ) O(n) O(n) D. O ( n 2 ) O(n^2) O(n2)
解
依题意,当
(
x
+
1
)
∗
(
x
+
1
)
>
=
n
(x + 1)*(x + 1) >= n
(x+1)∗(x+1)>=n时,一共运行了
k
=
n
−
1
−
0
k = \sqrt n - 1 - 0
k=n−1−0次,去掉常数为
n
\sqrt n
n,选择B
项。