计算机科学与技术考研 数据结构可能会问到的问题
总结了 涉及 计网 操作系统 数据结构 数据库 软件工程 程序语言等课程
个人觉得可能会问到的问题 部分问题过于简单或抽象就不写答案了
自己总结 漏洞疏忽可能比较多 口述答案
有错告知会改正 勿喷
数据结构
- 数据结构的三要素 :物理结构 逻辑结构 运算
- 数据结构的逻辑结构与物理结构分为
逻辑结构:顺序存储 链式存储 索引存储 散列存储
物理结构:集合 线性 树 图
- 算法的五大特征 :有穷性 确定性 可行性 输入 输出
- 时间复杂度和空间复杂度是什么 :语句执行频度 占用内存空间
- 什么时候用链表 什么时候用数组
- 栈和队列的定义 循环队列的优点 利用率高 没有假溢出
- 树的定义 二叉树 满二叉树 完全二叉树 存储结构
最多只有2个结点的树 除了叶子结点外都有2个结点 和满二叉树的序号一致
顺序存储 链式存储
- 二叉树的非递归遍历
非递归先序遍历:1. 沿着根的左孩子,先访问,再入栈,直到左为空
2. 栈顶出栈,有又子树,1。
非递归中序遍历:
一直左入栈,出栈看右孩,有则1 无则2
1. 沿着根的左孩子依次入栈,直到左孩子为空
2. 栈顶元素出栈并访问,右孩子为空继续执行,若右孩子为空,接着入栈左孩子。
非递归后序遍历:
1. 从根节点开始,入栈,沿着左子树搜索,直到没有左孩子。
2. 如果有右子树,按同样的方法访问。
3. 栈顶元素为空,要么右子树为空,要么右子树刚被访问完。(左子树已经被访问)
- 层次遍历:借助队列 根节点,左右节点依次入队。
- 线索二叉树 : 解决方便寻找某种序列的前驱
- 哈弗曼树 最优二叉树 带权路径最小的二叉树
- 树的表示方法 树和森林的遍历
双亲表示法 孩子表示法 孩子兄弟表示法
二森先中树先后
- 二叉排序树 删除二叉排序树
左<根节点<右 中序遍历是升序
删除:
叶节点直接删
有一个孩子直接代替
有俩孩子 用直接前驱或者后继
- 图的组成 图的分类 什么是连通 边集和结点集
- 图的存储方法
邻接表法 邻接矩阵法 十字链表法(有) 邻接多重表(无)
- 图的深度优先遍历和广度优先遍历 栈/队列
- 最小生成树(详细阐述)[贪心算法]
Prim算法:从某个顶点开始,依次加入当前结点集中路径最短的结点到结点集中,直到把所有的结点都加入进去。不依赖与边 时间复杂度O(V²) 适合稠密图
Kruskal算法:从最短的边开始,依次选择最短符合条件的边,直到所有的点都连通
不依赖与点 适合稀疏图 时间复杂度O(Elog2E)
- 最短路径(详细阐述)
迪杰斯特卡算法:引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)
(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。
(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
弗洛伊德算法[动态规划]:通过图的权值矩阵,逐步将各点作为中间结点,看是否会比之前的路径更短。
- 拓扑排序
由某个集合上的一个偏序得到该集合上的一个全序
应用于工程 或者 判断有向图是否有回路
- 说一下堆 删除 插入 建堆
优先队列:取出的元素顺序是按照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。
优先队列的实现
数组、有序数组
链表、有序链表
堆:必须是完全二叉树 且任意一节点是其子树的最大值或者最小值
3. 堆的操作
* 插入:插入到最后一个元素,然后与父节点(parent/2)作比较,大则交换
* 删除:把最后一个元素替补根的位置,
找出较大的孩子(2parent)(2parent+1)换位置。
* 建堆:1. 顺序存入形成完全二叉树
2. 从最小的子树开始调整位置,使其左右子树都变成堆
- 折半查找与分块查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列 O(log2n)
分块查找
- B树与B+树,区别
B树:多路平衡查找树 m路 (5)
除了根节点外,任何节点至少有m/2个分叉 且关键字数要在[m/2-1,m-1] [2,4]
所有子树的高度都相同 所有的叶节点都出现在同一层次
B树的操作
1. 插入:满了后 从中间裂开,把中间元素提到父节点,剩下元素放左右
2. 删除:
* 删非终端节点:把直接前驱或直接后继替代该元素
* 删终端节点且左/右兄弟充足 用前驱/后继和的填补空缺
* 当兄弟不够了 合并
- B+树 :类似于分块查找和b树的结合 根节点指向放的是叶子节点的最大值
- 哈希函数的构造方法 哈西函数解决冲突的方法 (Java HashSet?)
哈希表:关键字与存储地址直接相关
冲突的处理方法:
1. 拉链法
2. 线性探测法
3. 平方探测法0 1 -1 4 -4 9 -9…
4. 再散列法 多个哈希函数
- 排序有哪些 时空复杂度是多少
计算机科学与技术考研 数据结构可能会问到的问题 - 什么是分治算法 动态规划 贪心算法 回溯算法
分治算法:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破
分治的技术问题:子问题相互独立
分治算法的步骤:
1. 划分
2. 递归求解
3. 合并
应用:
1. 二分查找
2. 快速排序
3. 归并排序
动态规划:把原始的问题划分成一系列子问题,每求解一个子问题,将其结果存放在一个表中,以后用到的时候直接存取,不重复计算,自底向上的计算。[子问题的解要被重复利用] 自底向上
动态规划的条件:
1. 优化子结构:一个问题的优化解包含了子问题的优化解,缩小问题的集合
2. 重叠子问题
应用:
1. 矩阵乘法
2. 最长公共子序列
3. 弗洛伊德Floyd算法
贪心算法:做出当前看来最好的选择,希望通过做出局部优化达到全局优化
未必产生最优解 是自顶向下
贪心算法的条件:具有贪心选择性 优化子结构
应用:
1. 克鲁斯卡尔 Kruskal 每次选择一条权值最小的边,直到所有的点都连通
2. Prim算法: 从某个顶点开始,每次选择代价最小的新顶点纳入
3. 任务安排问题
4. 哈夫曼编码
回溯算法:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
应用:
1. 背包问题
2. 旅行售货员问题
3. 迷宫问题
- 递归和非递归的优缺点
递归的好处:代码相对非递归来说,更为简洁,并且思路清晰。
递归的坏处:由于递归需要系统堆栈,所以消耗空间要比非递归大很多。并且,如果递归深度太深,可能会导致系统奔溃。
非递归的优点:效率高,执行时间只会因为循环的次数增加而增加,没什么额外开销,也不会占用额外空间。
非递归的缺点:并不太容易理解,编写复杂问题时比较困难。
- 自底向上和自顶向下
↑ 自底向上的分析,是从具体到抽象;
↓ 自顶向下的分析,是从抽象到具体