数据结构复试问题笔记

目录:点我

1. 什么是最小生成树?

答:连通图的生成树是包含图中全部顶点的一个极小连通子图。若图中有 n 个顶点,则它的生成树含有 n - 1 条边。如果在一棵生成树上添加一条边,必定构成一个环。最小生成树可以用 kruskal(克鲁斯卡尔)算法或 prim(普里姆)算法求出。

2. 什么是二叉排序树?什么是平衡二叉树?如何调整?

答:

  • 二叉排序树:二叉排序树是一种具有用中序遍历为递增有序的树。查找,插入和删除的时间复杂度均为 O ( log ⁡ N ) O(\log N) O(logN)
  • 平衡二叉树:左右子树的高度之差绝对值不超过 1 的树。

平衡二叉树在插入过程中会因插入一个结点而导致出现不平衡的现象,因此需要在每一次插入新结点后进行判断调整,调整方法分为四种类型:

  • 右单旋转( LL ):结点左孩子的左子树上插入了新的结点导致不平衡,此时需要进行一次右旋操作恢复平衡。
  • 左单旋转( RR ):结点右孩子的右子树上插入了新的结点导致不平衡,此时需要进行一次左旋操作恢复平衡。
  • 先左后右双旋转( LR ):结点的左孩子的右子树上插入了新的结点导致不平衡,此时需要先进行一次左旋转操作,再进行一次右旋转操作恢复平衡。
  • 先右后左双旋转( RL ):结点的右孩子的左子树上插入了新的结点导致不平衡,此时需要先进行一次右旋转操作,再进行一次左旋转操作恢复平衡。

3. 简述各种排序的过程

答:详见此文章

4. 简述二分查找的过程

答:详见此文章

5. 栈和队列有什么区别?

答:

  • 栈是只可以一端插入或删除的线性表。增删的一端为栈顶。先进后出。分为顺序栈和链式栈。
  • 队列是一端插入和一端删除的线性表,队尾插入,队头删除。先进先出。分为循环队列和链队。

6. 生活中有哪些常见栈和队列的应用?

  • 栈:往桶里装东西、括号匹配、字符串转置等
  • 队列:排队买票、共享打印机队列、先进先出算法等

7. 采用什么数据结构能使通过学号查找姓名的速度最快?

答:采用Hash表,查找的速度最快能到 O ( 1 ) O(1) O(1)

8. 使用折半查找时若对数据进行删除和插入,需要移动位置,有什么更高效率的方式么。

答:折半查找实际上是构建了一颗二叉排序树,因此我们可以直接使用二叉排序树来存储该序列,这样增加删除的时候会方便很多。为了提高查找的效率,还可以更进一步使用二叉平衡树,保证查找效率最大化。

9. 矩阵相加,行优先和列优先遍历有什么区别?

答:由于计算机中 Cache 的特性,根据局部性原理,当使用行优先方式遍历矩阵时,计算机每次调页会将目标元素相邻的元素一次性调入 Cache 中,减少了 IO 的次数,使得遍历速度更快。而使用列优先遍历则不能很好的应用局部性原理,导致计算机访问每一个元素时可能都会进行 IO 处理,因此速度更慢。

10. 一场考试中,考生有50万人,如何对成绩排序?

答:对成绩使用基数排序即可。

11. 承接上一题,现在给你一个足够好的电脑,该如何排序?

答:从平均效率的角度考虑,应该使用堆排序、归并排序或快速排序。考虑到如此庞大的数据量,也许使用归并排序更好。

12. 承接上题,如果让你自己设计呢?

答:把这个问题简化,分段进行处理,考虑到成绩的正态分布,中间的段密集一点,两边的段疏松一点,分段之后再对每个段进行排序,然后汇总。

13. 如何在数组中找出最大值?

答:建立一个大根堆。

14. 如何在一组无序数中确定某个值是否存在?

答:建立 Hash 表,用除留余数与拉链法建表。算法时间复杂度平均来看应该是 O ( 1 ) O(1) O(1)

15. 简述 kmp 算法

答:详见此文章

16. 什么是满二叉树?

答:就是除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

17. 在有序的情况下进行快排的时间复杂度是多少?

答:是 O ( n 2 ) O(n^2) O(n2),因为他会形成一颗单支树。

18. 满 m 叉树有 n 层,请问总共有几个节点?

答: m n − 1 m − 1 \frac{m^n-1}{m-1} m1mn1

19. 数据结构是什么?

答:数据从来都不是孤立存在的,他们之间存在某种关系,这种数据元素互相之间的关系称为结构。数据结构是互相之间存在的一种或多种特定关系的数据元素的集合。数据结构包括三方面内容:逻辑结构,存储结构、数据的运算。算法的设计取决于所选定的逻辑结构,算法的实现依赖于所采用的存储结构。

20. B 树 B+ 树有什么区别?

答:

  • B 树:称多路平衡查找树,B 树中所有结点的孩子个数的最大值称为 B 树的阶,通常用 m 表示,满足以下条件:
    • 树中每个结点至多有 m 棵子树,即至多含有 m - 1 个关键字。
    • 若根结点不是终端结点,则至少有两棵子树。
    • 除根结点以外的所有非叶结点至少有 ⌈ m 2 ⌉ \left \lceil \frac{m}{2} \right \rceil 2m棵子树,即至少含有 ⌈ m 2 − 1 ⌉ \left \lceil \frac{m}{2}-1 \right \rceil 2m1个关键字。
    • 所有非叶结点的关键字之间通常有指向子结点的指针。
    • 所有的叶结点都出现在同一层次上,并且不带信息。
    • 所有结点的平衡因子均等于 0 。
  • B+ 树:应数据库需求所产生的一种 B 树的变形树,满足以下条件:
    • 每个分支结点最多有 m 棵子树。
    • 非根结点至少有两棵子树,其他每个分支结点至少有 ⌈ m 2 ⌉ \left \lceil \frac{m}{2} \right \rceil 2m棵子树。
    • 结点的子树个数与关键字个数相等。
    • 所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小排序排列,并且相邻叶结点按大小顺序相互链接起来。
    • 所有分支结点中仅包含它的各个子结点中关键字的最大值及指向其子结点的指针。
  • 区别:
    • 在 B+ 树中,具有 n 个关键字的结点只含有 n 棵子树,即每个关键字对应一棵子树;而在 B 树中,具有 n 个关键字的结点含有 n + 1 棵子树。
    • 在 B+ 树中,每个结点(非根内部结点)的关键字个数 n 的范围是 ⌈ m 2 ⌉ ≤ n ≤ m \left \lceil \frac{m}{2} \right \rceil\le n\le m 2mnm(根节点: 1 ≤ n ≤ m 1\le n\le m 1nm);在 B 树中,每个结点(非根内部结点)的关键字个数 n 的范围是 ⌈ m 2 ⌉ − 1 ≤ n ≤ m − 1 \left \lceil \frac{m}{2} \right \rceil-1\le n\le m-1 2m1nm1(根节点: 1 ≤ n ≤ m − 1 1\le n\le m-1 1nm1)。
    • 在 B+ 树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。
    • 在 B+ 树中,叶结点包含了全部关键字,即在非叶结点中出现的关键字也会出现在叶结点中;而在 B 树中,叶结点包含的关键字和其他结点包含的关键字是不重复的。

21. 数据结构在计算机网络和操作系统中有什么应用?

答:

  • 操作系统:进程调度应用栈和队列、文件管理应用树、图和排序、信息存储应用线性表和串。
  • 计算机网络:分组与转发用到队列和图、DNS 解析用到树状结构、信息表示用到线性表

22. 链表和数组有什么异同?

答:

  • 链表:是一种由上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素。
  • 数组:在内存中按顺序排列。
  • 区别:二者的物理结构不同,数组为连续存储,链表为离散存储。因此数组允许随机存取,而链表则不行。

23. 什么是结构体?

答:结构体是一种将多个数据结构组合起来的数据结构。

24. 二叉树和结点只有两个孩子的树有什么区别?

答:二叉树中每个元素的子树都是有序的,也就是说,可以用左、右子树来区别。树的两个孩子没有左右之分。

25. 递归算法如何求阶乘?

答:大数阶乘严格来说需要使用字符串处理,否则会爆 long long ,面试就怎么简单怎么来吧。

#include <bits/stdc++.h>
using namespace std;
int fact(int n)
{
    if(n == 1)
        return 1;
    return n * fact(n - 1);
}
int main()
{
    int n = 3; // n的阶乘,大数应该定义为long long型
    cout<<fact(n);
    return 0;
}

26. 如何对树进行层序遍历?

答:层序遍历需要用到队列。首先将树的根结点入队,然后出队时将出队结点的左右子节点入队。循环这个过程。

27. 数字数组排序应选择什么排序算法?

答:

  • 若 n 比较小,采用直接插入排序或者简单选择排序。
  • 若数组基本有序,采用直接插入或者冒泡排序。
  • 若 n 比较大,采用快速排序、堆排序和归并排序。
  • 若 n 很大,采用基数排序。

28. 哈夫曼树是什么?有什么用?

答:

  • 哈夫曼树:由 n 个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树
  • 哈夫曼编码:对一棵具有 n 个叶子的哈夫曼树,若对树中的每个左分支赋予 0 ,右分支赋予 1 ,则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。哈夫曼编码是最优前缀码,常用于数据压缩处理。

29. 图的存储结构有哪些?

答:邻接矩阵、邻接表、十字链表、邻接多重表。

  • 邻接矩阵:用于点个数较少的稠密图。
  • 邻接表:用于稀疏图。
  • 十字链表:有向图的链式存储结构。
  • 邻接多重表:无向图的链式存储结构。

30. 邻接矩阵是如何存储的?

答:邻接矩阵用一个矩阵来表示图,矩阵的行和列均为图的结点,这样矩阵中每个点就可以表示矩阵各点之间的连通性。

31. 有环图的定义是什么?

答:图中存在环路的图。

32. 单链表逆置如何实现?

答:用头插法重新建立链表。

33. 强连通图和连通图如何定义?非连通图如何遍历访问每一个节点?

答:

  • 连通图:无向图中任意两个顶点都连通的图。
  • 强连通图:是有向图中任意两个顶点都连通的图。
  • 非连通图遍历:用循环遍历每一个连通分量,连通分量内与连通图遍历方法相同。

34. 堆的存储结构是什么?

答:堆的物理存储结构是一维数组,逻辑存储结构是完全二叉树。

35. 为什么要有哈希?

答:hash 可以建立映射关系,用一个短的 key 值代替长的数据来进行查找。

36. 什么是哈希冲突?如何解决哈希冲突?

答:哈希冲突就不同值的映射关系相同的情况,哈希冲突可以通过开放定址法或拉链法处理:

  • 开放定址法:
    • 线性探测法:将冲突值存在后面的存储单元中。
    • 平方探测法:以冲突值的单元为中心,向两边按平方数的方式查找合适的存储单元。
    • 再散列法:建立第二个散列函数来处理。
  • 拉链法:利用指针将所有冲突值连接起来。

37. 满二叉树高度怎么算?

答:假设有 n 个结点,则高度为: log ⁡ 2 ( n + 1 ) \log_2{(n+1)} log2(n+1)

38. 描述迪杰斯特拉算法

答:迪杰斯特拉算法是用来求单源最短路径问题的,要求带权有向图中的路径没有负值,时间复杂度是 O ( V ² ) O(V^²) O(V²) V V V是顶点的个数。迪杰斯特拉算法基于贪心策略。从某个顶点开始,寻找到下一个顶点的权值最低的边,将这个顶点加入到集合中。在集合中继续遍历下一个可达的顶点,将权值最短的路径的顶点加入集合。循环这个过程。在 n - 1 次之后,就可以把所有的顶点包含在 S S S中。

39. 如何实现循环队列,有什么好处?

答:将存储队列元素的表从逻辑上看成一个环,称为循环队列。我们需要牺牲一个单元来区分队空和队满。好处是不会出现溢出的情况。

40. 如果找出出现次数最多的数?

答:建立合理的哈希映射关系,然后对其计数。

41. N 个节点的二叉树的最小的生成树有几条边?

答:N - 1 条边。

42. 拓扑排序的网是什么?什么图可以进行拓扑排序?

答:有向无环图,简称 DAG 网。

43. 网的结构特点?

答:图是由点集合与边集合组成的数据结构,结点之间可以通过边连接成一个网络。

44. 深度优先搜索形成的是什么?森林唯一么?

答:形成森林或树,不一定唯一。

45. 单链表怎么样快速找到中间的节点?

答:我们用两个指针分别指向单链表的头结点,其中一个快指针一次走两个结点,一个慢指针一次走一个结点。当快指针到了链尾时,慢指针就到了中间结点。

46. 人际关系的物理结构是什么?

答:用字典来表示,比方说 A 认为 B 是好朋友,那么二元组(A, B)的值就设为 1 ,表示朋友。

47. 深搜与宽搜的时间复杂度是多少?

答:

  • 宽搜:采用邻接表为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E),采用邻接矩阵为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)
  • 深搜:采用邻接表为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E),采用邻接矩阵为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)

48. log ⁡ ( 2 n ) \log{(2n)} log(2n) log ⁡ n \log n logn ln ⁡ n \ln n lnn,在时间复杂度上有什么区别?

答:小数据规模来看没什么差别,大数据规模上 log ⁡ n \log n logn时间最短, log ⁡ ( 2 n ) \log{(2n)} log(2n)时间最长。

49. 满二叉树有多少个结点?二叉查找树和数组实现的二分查找有什么区别?

答:满二叉树有 2 h − 1 2^h-1 2h1 个结点,其中 h h h 为二叉树的高度。二叉查找树实现的二分查找是动态的,方便进行增删;而数组实现的二分查找是静态的,不方便增删。

50. N 个元素里只有一个不同怎么通过少于 n-1 次比较找出来?

答:LeetCode 第 136 题,使用位运算即可。详见此文章

51. 二分查找链表复杂度是多少?

答:个人认为最差情况为 O ( n log ⁡ n ) O(n\log n) O(nlogn),最好情况为 O ( n ) O(n) O(n) ,平均情况为 O ( n log ⁡ n ) O(n\log n) O(nlogn) 。注:中间结点向后查找不需要从头开始。

52. 二分查找的时间复杂度?

答: O ( log ⁡ n ) O(\log n) O(logn)

53. n 个结点的无向连通图最多和最少边数是多少?

答:

  • 最多: n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)
  • 最少:n - 1。

54. 开放地址法如何删除关键字?

答:开放定址法不能随意删除关键字,只能使用一个标记从逻辑上进行删除,否则有可能将其他具有相同散列地址的元素截断。查找元素时若遇到被删除的元素,应当将其当作普通元素继续进行查找。

55. 什么是完全图?

答:每个点与其他点都有一条边连接起来的图。

56. BFS 和 DFS 遍历生成树的高度是多少?谁更高?

答:宽搜相当于层次遍历,深搜相当于先序遍历,宽搜的生成树不会比深搜的生成树更高。高度为多少这个问题脱离实际题目真的能答?

57. 二叉排序树如何增删?

答:

  • 插入:对要插入结点进行查找,最终位置即为插入的位置。
  • 删除:若删除结点为叶结点则直接删除;若删除节点只有一个子结点则用其代替;若删除结点有两个子结点,则用右孩子中序遍历的第一个结点代替。
  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BeZer0

打赏一杯奶茶支持一下作者吧~~

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

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

打赏作者

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

抵扣说明:

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

余额充值