数据结构考研笔试——时间复杂度

21 篇文章 0 订阅
1 篇文章 0 订阅

时间复杂度

时间复杂度是只考虑次数,不考虑常数的,这点可以与微积分的无穷大类比,当 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 22k==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(n0)阶乘的算法如下,其时间复杂度是

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 1n,时间复杂度为 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 10次,去掉常数为 n \sqrt n n ,选择B项。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L_Hygen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值