计算机研究生复试常见面试题——数据结构

目录

绪论部分

线性表

栈和队列 

 树与二叉树

图 

查找 

排序

补充问题 


说明:此文章是在阅读了一些面试相关资料之后对于一些常见问题的整理,主要针对的是计算机研究生入学考试中复试的专业问答。部分答案参考网络以及结合自己的理解总结而出,若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源,若有参考到您的回答请联系我,我会将其补上,最后希望各位都能够一战成硕!

复试相关内容:

计算机研究生复试常见面试题——计算机网络部分

 计算机研究生复试常见面试题——操作系统_三工言吾的博客-CSDN博客_计算机专业考研面试题

计算机研究生复试常见面试题——计算机组成原理_三工言吾的博客-CSDN博客


绪论部分

  • 数据结构的存储结构和对应存储模式

 集合、线性表、树、图

其中线性表是一对一, 树是一对多,图是多对多的

  • 时间复杂度 

整个算法的执行时间于基本操作重复执行次数成正比,一般情况下我们以最深层次的语句所描述的操作作为基本操作

线性表

  • 线性存储和链式存储优缺点的比较
线性表 链表
存取方式 可以顺序存储,可以随机存储 只能从表头顺序存储
逻辑结构和物理结构

逻辑上相邻的元素

物理位置也相邻

逻辑上相邻的元素

物理上不一定相邻

查找,插入和删除操作

查找更快

插入删除操作需要移动元素

查找更复杂

插入删除操作修改指针域即可

空间分配 存储空间利用率高,存储密度大,但是易造成空间管理困难 存储密度小,但是只要内存有空间就可以分配,操作灵活高效

  • 链表的插入删除操作 

插入操作:当查找到需插入的前一个节点位置*p时,令新节点*s的指针指向*p的后继节点,再令*p的指针域指向新插入的节点*s

删除操作: 先查找删除位置的合法性,后查找表中第i-1个结点,即被删除结点的前驱结点,再将其删除

  •  链式存储都有哪些形式

单链表,双链表,循环链表,静态链表(借助数组实现)

栈和队列 

  • 区分栈和队列的定义

栈:只允许在一端进行插入或删除操作的线性表

队列:也是一种操作受限的线性表,只允许在一端进行插入,而在表的另一端进行山删除

  •  循环队列的顺序表中,为什么要空一个位置?

这是为了用来区分队空与队满的情况,如果不空一个位置,那么判断队空和队满的条件是一样的。

  • 栈和队列的应用都有哪些
  1. 栈在括号匹配中的应用
  2. 栈在表达式求值中的应用
  3. 栈在递归中的应用
  4. 队列在层次遍历中的应用
  5. 队列在计算机系统中的应用 

 树与二叉树

  • 二叉树的定义

其特点是每个结点之多只有两棵子树,并且二叉树的子树有左右之分,其次序不能颠倒。

  •  二叉树和度为2的树的区别

度不同:度为2的树最多只能有两棵子树,至少有一棵。而二叉树可以为空,1棵或两棵

分支不同:度为2的树没有左右之分,二叉树有左右之分

次序不同:度为2的树无序,二叉树有序

  • 几个特殊的二叉树

 满二叉树:叶子结点集中在二叉树的最下一层,并且除了叶子结点之外的每个结点度数为2

其中需注意,满二叉树的结点个数(n层):2^n  - 1

完全二叉树:当且仅当其每个结点都与高度为h的满二叉树中编号1~n的结点一一对应时,成为完全二叉树

二叉排序树:左子树上所有结点的关键字小于根节点的关键字;右子树的所有结点的关键字均大于根节点的关键字;左子树和右子树又各是一棵二叉排序树。中序遍历能够得动递增序列。

平衡二叉树:是一种特殊的二叉排序树,保证任意结点的左、右子树的高度差的绝对值不能超过1。其中调整涉及到LL平衡旋转、RR平衡旋转、LR平衡旋转、RL平衡旋转。

红黑树:一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能

  • 线索二叉树 

传统的二叉树只能体现父子关系,不能直接体现前驱后继关系。因此引入线索二叉树就是为了加快结点前驱和后继的速度。线索二叉树的存储结构包括数据元素、左右孩子指针、左右线索标志。

  • 树的存储结构
  1. 双亲表示法
  2. 孩子表示法
  3. 孩子兄弟表示法

哈夫曼树和哈夫曼编码

 定义:给定n个权值作为n个叶子结点,构建一棵二叉树,若带权路径长度达到最小,则称之为哈夫曼树。

构建方法:将n结点看作n棵树的森林,从中选出两个根节点最小的树合并,作为一棵树的左右子树,并且将树的根节点作为左右两个子树的权值之和,从森林中删除选取的两棵树,并将新树加入森林之中,不断重复,直至只有一棵树为止,这棵树就是哈夫曼树。

特点:

1.权值越大的结点距离根节点越近

2.树种没有度为1的结点

应用:哈夫曼编码就是长度最短的前缀编码

图 

  • 图的存储方式
  1. 邻接矩阵:图的顺序存储结构
  2. 邻接表:图的链式存储结构
  3. 十字链表:有向图的另一种链式存储结构
  4. 邻接多重表:无向图的链式存储结构
  • 深度优先搜索和广度优先搜索

 深度优先搜索:首先访问图中的某一起始顶点v,然后由v出发,访问与v邻接却未被访问的任一顶点w1,再访问与w1邻接的未被访问的任一顶点w2……重复上述过程。当不能再向下访问时,依次退回到最初被访问的顶点,若它还有邻接顶点未被访问过,那么就从该点开始继续上述搜索过程,直至图中所有顶点都被访问过。

(深度优先算法的思想类似于先序遍历的思想)

广度优先搜索:类似于二叉树的层序遍历。Dijkstra单源点最短路径算法和Prim最小生成树算法用到了类似的思想。

  • 最小成本生成树的两种算法优缺点比较
Prim算法 Kruskal算法
核心思想 找最近 找最小
时间复杂度 O(|V|^2) O(|E|log|E|)
适合场景 适用于边稠密图 适用于边稀疏而顶点多的图
  •  两个最短路径算法有什么不同

Dijkstra算法求单源最短路径问题,即求途中某一顶点到其他各顶点之间的最短路径,不过其中不能存在负权值的边。

Floyd算法求各顶点之间的最短路径,Floyd算法允许图中带有负权值的便,但是不允许有包含负权值的边组成的回路。

  • 解释一下关键路径和关键活动

 从源点到汇点的所有路径中,具有最大路径长度的路径称为称为关键路径,而把关键路径上的活动称为关键活动。

查找 

  • 顺序查找,折半查找,分块查找

顺序查找分为无序线性表和有序线性表

折半查找:仅适用于有序的顺序表,首先会对于表中中间元素进行比较,若相等则查找成功,若不相等则只能在前半部分或后半部分(若key大于中间值,则所查找元素在后半部分,反之同理)

分块查找:吸取了以上两个查找的有点,块内元素可以是无序的,但块间是有序的,即第一块中的最大关键值小于第二块中的所有关键值。第一步是在索引表中确定待查记录所在的块,第二步在块内顺序查找。

  • B树和B+树的区别

 

B+树 B树

n个关键字n个子树

n个关键字n+1个子树

叶节点包含信息

非叶节点仅作为索引

叶节点代表查找失败的位置

叶节点包含所有关键字

关键字会重复

关键字不会重复
  • 哈希函数的定义和特点

定义:散列表建立了关键字和存储地址之间的一种直接映射关系 

特点:单向性和约束碰撞

  •  散列表的建立方法
  1. 直接定址法
  2. 除留余数法
  3. 数字分析法
  4. 平方取中法
  • 散列表处理冲突方法
  1. 开放定址法
  2. 拉链法

影响哈希表平均查找长度的因素

散列函数、装填因子、处理冲突方法

其中装填因子越大,表示装填记录越“满”,发生冲突的概率越大 

排序

  • 排序算法有哪些 ,及其时间复杂度

 此处提问的方法多样,最好将此表记清楚,并能够讲出各类排序的基本思想

补充问题 

  • 怎么确定是一个环

1.在有向图中选一个没有前驱的顶点且输出

2.从图中删除该顶点和所有以它为尾的弧

3.重复后若不存在无前驱的顶点则表示存在环

  • 简述一下背包问题

 总体思想:根据动态规划的步骤(问题抽象化,建立模型,寻找约束条件,判断是否满足最优性原理,找大问题与小问题之间的推进关系,填表,寻找解组成)

动态规划的原理:动态规划与分治法类似,但具有记忆性,通过填写表把所有已经解决的子问题的答案记录下来,在新问题中可直接利用,避免了重复计算。

猜你喜欢

转载自blog.csdn.net/weixin_45682319/article/details/123495154