【考研】时间复杂度与空间复杂度习题练习(含真题)

前言

题目主要是选取自408考研真题、《数据结构(C语言版)》严蔚敏编著的教材课后习题、王道习题等。

如有错误,请在评论区讨论指正。

目录

前言

一、时间复杂度

二、空间复杂度


一、时间复杂度

1、试分析下列各算法的时间复杂度。

// (1)
x = 90; y = 100;
while(y > 0){
    if(x > 100){
        x = x - 10;
        y--;
    }else{
        x++;
    }
}

(1)解:运行程序,有 x < 100, x = 91 ...... x = 101时,有 x = 91, y = 99,每循环11次y的值减1,所以总循环次数有11 * 100 = 1100。

所以,时间复杂度:O(1) ,因为程序的执行次数为常数阶。

//(2)
for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
         a[i][j] = 0;

(2)解:语句 a[i][j] = 0; 执行次数有  \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} 1 =\sum_{i=0}^{n-1}(m-1) ,可推出执行次数为 m * n 次。

所以时间复杂度为 O(m*n)。

// (3)
s = 0;
for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
         s += B[i][j];
sum = s;

 (3)解:语句 s += B[i][j]; 的执行次数为 n * n 。

所以,时间复杂度为 O(n^2) 。

//(4)
i = 1;
while(i <= n)
    i = i*3;
 
/* //推导可知:
i = 1;
while(i <= n)
    i = i*2;
//时间复杂度为O(logn),底数为2。
*/

(4)解: i 的值为:1,3,9, 27,...

用 i(x) 表示第 x 次循环时i的值,则 i(x) = 3^x , x初始值为0。

语句 i = i*3; 的执行次数为 3^x \leq n,有 x \leq log_3n

所以,时间复杂度为 O(log_3n) 。

//(5)
x = 2;
while(x < n/2)
    x = x * 2;

(5)解:x 的取值是首项为4,公比为2的等比数列,

设执行次数为 t,则有  2^{t+1}<\frac{n}{2},即 t<log_2{\frac{n}{2}}-1

所以,时间复杂度为 O(log_2n) 。

//(6)
x = 0;
for(i = 1; i < n; i++)
    for (j = 1; j <= n-i; j++)
        x++;

(6)解: 语句x++; 的执行次数为 \sum_{i=1}^{n-1}\sum_{j=1}^{n-i} 1 =\sum_{i=1}^{n-1}(n-i) = (n-1)+(n-2)+(n-3)+...+2 + 1 = \frac{(n-1)n}{2}

所以,时间复杂度为 O(n^2)

//(7)
x = 0;
for(k = 1; k <= n; k*=2)
    for (j = 1; j <= n; j++)
        x++;

(7)解:此题不同于(6)小题,内层循环条件 j <= n 与外层循环变量无关。

每执行一次 j 自增一,每次内层循环都执行 n 次,所以内层的时间复杂度为 O(n)。

对于外层,设循环次数 t 满足 k=2^t\leq n, 所以,t\leq log_2n

所以,内层的时间复杂度*外层的时间复杂度即为 O(n)*O(log_2n)=O(nlog_2n)

 所以,时间复杂度为 O(nlog_2n) 。

//(8)
int fact(int n){
    if(n <= 1)
        return 1;
    return n*fact(n-1);
}

(8)解:本题是求 n 的阶乘,即 n(n-1)(n-2)*...*2*1,

每次递归调用时 fact() 的参数减一,递归出口为 fact(1),一共执行 n 次递归调用 fact(),

所以,时间复杂度为 O(n) 。

//(9)
x = n;     //n>1
y = 0;
while(x ≥ (y+1) * (y+1))
    y++;
   

(9)解:语句 y++; 的执行次数为 n \geq (y+1) * (y+1)),有 y \leq n^{\frac{^{1}}{2}}-1

 所以,时间复杂度为 O(n^{\frac{1}{2}})

//(10)
int func(int n){
    int i = 0, sum = 0;
    while(sum < n)
        sum += ++i;
    return i;
}

(10)解:i 与 sum 的取值变化如下:

isum
10+1
20+1+2
30+1+3
......
0+1+2+3+...+t = \frac{t(1+t)}{2}

所以,有  \frac{t(1+t)}{2}<n\Rightarrow \frac{t^2}{2}<n\Rightarrow t<\sqrt{2n}

 所以,时间复杂度为 O(n^{\frac{1}{2}})

//(11)
for(int i= n-1; i > 1; i--)
	for (int j = 1; j < i; j++) 
		if(A[j] > A[j+1])
			A[j]与A[j+1]对换;

(11)解:最后一行语句频度在最坏情况下是 O(n^2) 。

当所有相邻元素都为逆序时,则最后一行的语句每次都会执行。

则有 \sum_{i=2}^{n-1}\sum_{j=1}^{i-1}1=\sum_{i=2}^{n-1}(i-1)=\frac{(n-2)(n-1)}{2}

 所以,时间复杂度为 O(n^2)

2、已知两个长度分别为 m 和 n 的升序链表,若将它们合并为长度为 m + n 的一个降序链表,则最坏情况下的时间复杂度是 O(max(m,n))


解:两个升序链表合并,两两比较表中元素,每比较一次,确定一个元素的链接位置(取较小元素)。当一个链表比较结束后,将另一个链表的剩余元素插入即可。

最坏的情况是两个链表中的元素依次进行比较,因为2 max(m,n) >= m + n,所以时间复杂度为O(max(m,n))。

二、空间复杂度

1、试分析以下算法的空间复杂度。
// (1)
int j = 0;
for (int i = 0; i < n; i++) {
    j++;
}

(1)解:随着 n 的变化,所需开辟的内存空间并不会随着 n 的变化而变化,

所以,空间复杂度 O(1)。

//(2)
int fun(int n){
    int x = 100;
    if(n == x)
        return n;
    else
        return fun(++n);
}

(2)解:此题是递归调用fun函数,随着 n 的变化,所需开辟的内存空间会随着 n 的变化而变化,所以,空间复杂度 O(n)。

  • 12
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
数据结构》(c语言版) 是由严蔚敏等人编著的一本关于数据结构的教材。该书主要介绍了各种数据结构,如线性表、链表、栈、队列、树、图等,并针对每种数据结构详细介绍了其定义、基本操作以及应用。同时,书中还提供了丰富的习题考研真题,供学生练习巩固所学知识。 该书的第一部分是对数据结构基础的介绍,包括算法分析与设计、线性表、栈和队列等。其中,算法分析与设计部分主要讨论了算法时间复杂度空间复杂度分析方法,为后续章节奠定了基础。线性表部分介绍了顺序表和链表的定义、基本操作以及应用,而栈和队列部分则详细介绍了栈和队列的定义、基本操作以及常见应用。 第二部分主要介绍了树和二叉树,包括二叉树的定义、二叉树的遍历、树的存储结构和线索二叉树等。此外,还介绍了树的应用,如赫夫曼树和二叉排序树,以及B树和B+树等高级树结构。 第三部分则介绍了图的基本概念、图的存储结构以及图的遍历算法。此外,还讨论了最小生成树和最短路径等重要算法。 该书尤其重视习题的设计,每章都设置了大量的习题,包括填空题、选择题和编程题等,旨在帮助学生巩固所学知识并提升解决实际问题的能力。此外,书中还附有考研真题和详细解析,为考研学生提供实战练习的机会。 总而言之,严蔚敏《数据结构》(c语言版) 笔记和习题(含考研真题)详解 把数据结构的基础知识讲解得深入浅出,习题设计丰富,适合作为数据结构教材或考研复习资料使用。通过学习该书,读者可以建立起扎实的数据结构知识基础,并熟练掌握各种数据结构的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

住在阳光的心里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值