派大汤的数据结构错题本
数据结构错题本
- 数据结构的基本概念
- 时间、空间复杂度计算
- 栈
- 队列
数据结构的基本概念
1.抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。
即抽象数据类型=存储结构+运算操作
时间、空间复杂度计算
1.已知两个长度分别为m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是(D)。
A.O(n)
B.O(m+n)
C.O(min(m ,n))
D.O(max(m,n))
解答:
核心代码为:
//循环两两比较,小的存入结果
int i=0,j=0;
LinkList L;
InitList(L);
int *q=A->next; //长为m的表A
int *p=B->next; //长为n的表B
int *r=L->next; //长为m+n的升序表L
while(p->next!=NULL && q->next!=NULL){if(q->data<p->data)r->data=p;p=p->next;elser->data=q;q=q->next;r=r->next;
}
//还剩一个没有比较完的顺序表
while(p->next!=NULL) {r.data=p->data;r=r->next;p=p->next;
}
while(q->next!=NULL)){r.data=q->data;r=r->next;q=q->next;
}
最多比较次数,m+n-1 ()
最少比较次数,min(m,n) (将短表比较完)
根据年计算时间复杂度的原则:
只需找循环中的一个基本操作,分析它的执行次数与n的关系即可,其它的操作影响n的系数。
所以最长的while循环为将长表比较完,不需要管剩下的短表,即O(max(m,n))。
2.一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度级别(或阶)。
T(n)={1n=12T(n/2)+nn>1T(n)= \begin{cases} 1& \text{n=1}\\ 2T(n /2)+n& \text{n>1} \end{cases}T(n)={12T(n/2)+nn=1n>1
上式中,n是问题规模,为简单期间,设n是2的整数次幂。
分析:递归的时间复杂度题目一般使用公式递推出第n个式子与第一个式子之间的关系。
解答:
设n=2k2^k2k(k>0),根据题目所给定义有
T(202^020)=1
T(212^121)=2T(202^020)+212^121
T(222^222)=2T(212^121)+222^222=222^222T(202^020)+2*222^222
T(232^323)=2T(222^222)+232^323=232^323T(202^020)+3*232^323
…
T(2k2^k2k)=2k2^k2kT(202^020)+k*2k2^k2k
又上述递推关系可得:
T(n)=2log2n2^{\log_{2}{n}}2log2n+n*log2n\log_{2}nlog2n=O(n*log2n\log_{2}nlog2n)
栈
1 . 假设链表不带头结点且所有操作在表头进行,则下列最不适合作为链栈的是(C)。
A.只有表头结点指针,没有表尾指针的双向循环链表。
B.只有表尾结点指针,没有表头指针的双向循环链表。
C.只有表头结点指针,没有表尾指针的单向循环链表。
D.只有表尾结点指针,没有表头指针的单向循环链表。
解答:考虑最为复杂的删除操作,因为删除操作需要被删除结点以及被删除结点的前驱结点。
A、B:对于双向循环链表,无论表头指针还是表尾指针都可以方便地找到表头结点,在表头进行插入删除操作。
C、D:对于单向循环链表,因为表尾指针是表头指针的前驱,所以可以进行删除表头的操作。但是相反,如果只有表头指针则在寻找表尾指针的时候需要O(n)的复杂度,所以最不适合作为链栈使用。
2.一个栈的入栈序列为1,2,3…n出栈序列为P1,P2,P3…Pn。若P2=3,则P3可能取值的个数为(n-1)。
解答:
当P2为3时,P1可以取的值为1、2、4。
当P1=1时,P3可以取2、4…n。
当P1=2时,P3可以取1、4…n。
当P1=4时,P3可以取2、5…n。
所以综上所述,P3除3外均可取得,为n-1个。
(多选)3.下列关于栈的叙述中错误的是(A、C、D)。
A.采用非递归方式重写递归程序时必须使用栈。
B.函数调用时,必须使用栈保留必要的信息。
C.只要确定入栈序列就可以确定出栈序列。
D.栈是一种操作受限的线性表,允许在表的两端操作。
解答:
A.当计算1到n的和时,可以采用递归程序实现,但是采用非递归方式实现时,不一定需要使用栈。
B.当程序执行时,需要有一个栈来保存函数的执行顺序(下一步要做什么),当某一函数执行完成,则将这个函数返回它的值并从栈中Pop,然后再执行后面的函数。
4.向一个栈顶指针为top的链栈中插入一个x结点,则执行(C)。
A.top->next=x;
B.x->next=top->next;top->next=x;
C.x->next=top;top=x;
D:x->next=top;top=top->next;
解答:
链栈----什么是链栈?用链表实现的栈,物理结构是单链表形式。
单链表的指针方向是如何指示的?由栈顶指向栈底还是栈底指向栈顶?
分析一哈:
第一种情况:由栈底指向栈顶,当元素出栈时,则需要top指针的前驱结点,而由栈底指向栈顶是无法找到这个前驱结点的,所以不是由栈底指向栈顶。
第二种情况:由栈顶指向栈底,可以找到top的后继结点,并置为top,所以是由栈顶指向栈底的。
所以,top可以看做单链表(链栈)的头指针,即使用头插法插入x结点,让x指向top,并让x称为top结点。
x->next=top;x=top;选择 C。
思考:如果链栈的top指针指向栈顶元素的下一个存储空间呢?如何进行插入操作?
我们可以将这个问题转化为带有头结点的链表的插入操作,在头结点之后插入一个结点x,所以操作为
x->next=top->next;top->next=x;
队列
1 . 已知循环队列的存储空间为数组A[21],front 指向队头元素的前一个位置,rear指向队尾元素,假设当前front和rear的值分别为8和3,则该队列的长度为(16)。
解答:求取队列中元素个数问题
- 当front与rear指针都分别指向队头、队尾元素时
队列长度=(rear+1-fornt+maxsie)%maxsize; - 当front与rear指针都分别指向队头、队尾元素下一个位置时
队列长度=(rear-fornt+maxsie)%maxsize; - 当front与rear指针都分别指向队头元素的上一个位置、队尾元素时
队列长度=(rear-fornt+maxsie)%maxsize;
注意题干描述:rear指向队尾元素,front指向队头元素的前一个位置。这种情况等价于rear指向队尾元素的下一个元素,front指向队头元素。计算都为:(rear - front + maxsize)%maxsize = 16。
2.已知循环队列存储在一维数组A[0…n-1]中,且队列非空时front与rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时front与rear的值分别是(0,n-1)。
解答:这个题目考察反推能力。第一个进入的元素既是队列的队头元素又是队尾元素,此时队头指针和队尾指针指向同一个位置,即为0。元素入队的时候front不变,所以front在队列为空时也指向0,而rear会+1,所以rear在队列为空时会指向0的前一个位置 n-1。
3.循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置,假设队列两端都可以进行入队和出队的操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是(A)。
A.队空:end1 == end2; 队满:end1 == (end2+1)mod M
B.队空:end1 == end2; 队满:end2 == (end1+1)mod (M-1)
C.队空:end2 == (end1+1)mod M; 队满:end1 == (end2+1)mod M
D.队空:end1 == (end2+1)mod M; 队满:end2 == (end1+1)mod (M-1)
解答:
先分析队满的情况:一般情况下,end2+1==end1 就可以表示队列已满。但是当end2在队列尾部,end1在队列头部时,要用 mod M(有M个空间) 的方法让end2 回到 队头。所以判断队满的方式为:end1 == (end2+1)mod M。
再分析队空的情况: 当队中只有一个元素时,发现cd选项的判别方法可以认为是队空的条件,也可以是队中只有一个元素的条件。
派大汤的数据结构错题本相关推荐
- 【考研】830 + 848 暨大2012-2022真题易混易错题总结(二)
前言 以下题目,均源自于暨南大学 2012 - 2022 年的 830 + 848 真题.主要是对真题中易混易错题进行记录和总结. 分为三篇博文,此乃第二篇,真题是 2018 - 2020 年的,即 ...
- 一战上岸北京211 初试+复试 408错题笔记
趁着现在还记着点复试的内容我先把复试的内容捋一遍 先是政治问题:(都是大概意思) 假如导师给你分配的事情比较多,你心情会发生什么样的变化 怎么看待近两年中国的抗疫历程 我国把人民生命健康放在第一位说明 ...
- 43. 盘点那些必问的数据结构算法题之二叉树基础
盘点那些必问的数据结构算法题之二叉树基础 0 概述 1 定义 2 基本操作 1) 创建结点 2) BST 插入结点 3) BST 删除结点 4) BST 查找结点 5)BST 最小值结点和最大值结点 ...
- 【初赛】初赛提纲 错题本(to be countinue)
目录: 前言: 1.计算机发展代别划分 2.计算机硬件设备 3.进制之间的转换 4.信息编码表示 5.关于各种排序 6.计算机网络: 7.原码 补码 反码 8.逻辑运算 9.栈 10.队列 11.树 ...
- java高级面试题(易错题)
5. // point X public class Foo {public static void main(String[] args) throws Exception {PrintWriter ...
- 敏捷ACP.知识总结.错题回顾
第一部分 知识点集锦1 1. 极限编程(XP)是一项以编程人员为中心的敏捷架构,注重小而迅速的发布.XP 极限编程强调以下原则: 结对编程 可持续速度 不断自动测试 有效沟通 简单性 反馈 勇气 集体 ...
- 2017考研计算机真题错题本
2017考研计算机真题错题本 折半查找判定树 二叉判定树是用于描述解决问题的思路,比如可以使用判定树描述N个数的比较过程, 它也可以用于描述折半查找即二分查找的过程. 描述折半查找的二叉判定树,我们也 ...
- PMP备考-错题集(第6版)
这是我自己备考过程中,记录的错题集. 1. [单选] 作为你们公司项目办公室的经理,你必须经常判定哪些项目应该得到额外的资源.你还要建议哪些项目应该启动.继续进行或取消.有利于你做出这些决策的一个方法 ...
- 中级软件设计师错题整理
目录 19年上半年真题错题: 18年下半年真题错题: 18年上半年真题错题: 19年上半年真题错题: 1.DMA控制方式是在(内存与外设)之间直接建立数据通路进行数据的交换处理.(第2题) 2.CPU ...
最新文章
- gitlab如何克隆项目到本地进行开发,如何让webstorm项目右键菜单出现Git子菜单,右下角出现Matser分支
- 使用SQL Server 2008 Extended Events SSMS Addin轻松管理XEvents
- 如果我要....(生活版)
- spark的流失计算模型_使用spark对sparkify的流失预测
- linux VPS上装FTP
- 【Vue案例一】实现跑马灯效果
- 高德地图iOS SDK使用
- java add方法实例_java.util.TreeSet.add()方法实例
- .net工具类 获取枚举类型的描述
- 电阻电导传输线的归一化转移矩阵[a](必背)
- Android使用MediaRecorder和Camera实现视频录制及播放功能整理
- 26. Element nodeName 属性
- matlab prn文件,教你妙用PRN文件 实现文档的换机打印
- Keil用ST-LINK下载STM32程序后不自动运行
- 苏宁易购财报看点:加码线上业务布局,注册会员增至6.23亿人
- Pohlig-Hellman算法解决DLP问题
- [电脑]电脑面前的自我保护
- 如何用手机访问本地页面?
- emplace_back() 和 push_back 的区别
- 从一笔金币充值去思考分布式事务