软件工程复试问题 | 第二篇 数据结构

复试问题 | 第二篇 数据结构

    • 1.什么是时间复杂度,空间复杂度?
    • 2.循环队列的顺序表中,为什么要空一个位置?
    • 3.如何实现循环队列?有何好处?
    • 4. 什么是二叉排序树?.二叉查找树查找的时间复杂度以及中序遍历后得到什么样的序列
      • 折半查找,以及其适用范围和时间复杂度
      • 什么是堆?有什么作用?
    • 5.什么是平衡二叉树?
    • 6.什么是完全二叉树?
    • 7. 二叉树的存储
    • 8.什么是哈夫曼树?
    • 9.M 阶 B-树和 M 阶 B+树的主要区别
    • 10. 图的相关概念
    • 11.什么是哈希冲突?以及如何解决。
    • 12.图的存储方式
    • 13.深度优先搜索遍历和广度优先搜索遍历的过程
    • 14.迪杰斯特拉算法的过程
    • 15. 最小生成树的概念
    • 16.各种排序算法:

第二天了,继续写写,也不知道有没有人看,就当自己巩固知识点了。

1.什么是时间复杂度,空间复杂度?

算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。)

时间复杂度是指执行算法所需要的计算工作量,因为整个算法的执行时间与基本操作重复执行的次数成正比,所以将算法中基本操作的次数作为算法时间复杂度的度量,一般情况下,按照基本操作次数最多的输入来计算时间复杂度,并且多数情况下我们去最深层循环内的语句所描述的操作作为基本操作。
例:链表查找某个元素,平均的时间复杂度是多少?
答:O(n) 链表是顺序存储,故(1+n)/2。

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

如果不空出一个位置,队列判空和判满的条件是一样的。为了区分队空还是队满,需空出一个位置。
如果不空出,还有其他的解决方式:设置一个flag参数,队列在增加元素时,flag=1。用flag=1/0来判断队空还是队满。

3.如何实现循环队列?有何好处?

如何实现:把数组弄成一个环,让 rear 和 front 指针沿着环走,这样就可以产生循环队列/把链表尾指针指向链表的头,构成循环链表。
好处:循环队列是顺序队列的改进,在顺序队列中,在元素进队的时候,rear 要向后移动,元素出队的时候,front 也要向后移动,这样经过一系列的出队和入队操作之后,两个指针最后会达到数组的末端,此时虽然队中已经没有元素了,但是还是不能让元素入队,即出现了“假溢出”的现象。循环队列就能避免出现“假溢出”现象。

4. 什么是二叉排序树?.二叉查找树查找的时间复杂度以及中序遍历后得到什么样的序列

1.二叉排序树又称二叉查找树,满足以下性质的二叉树:
① 若左子树不空,则左子树上所有结点的值均小于根节点的值;
② 若右子树不空,则右子树上所有结点的值均大于根节点的值;
③ 左右子树也分别是二叉排序树。
原理步骤:
若根结点的关键字值等于查找的关键字,成功。
否则,若小于根结点的关键字值,递归查左子树。
若大于根结点的关键字值,递归查右子树。
若子树为空,查找不成功。
误区:一个选择题的选项:若左子树不空,则左子树的值小于根节点的值;❌
2.递增有序数列。

折半查找,以及其适用范围和时间复杂度

又称二分查找,基本思路:
在当前的查找区间[low…high]中,首先确定 mid=(low+high)/2,然后拿关键字与 mid 比较,若相等则查找成功,返回该位置,否则确定新的查找区间, mid>K,[low…mid-1] mid 直至查找自区间长度小于 1 时查找结束。
适用范围:顺序结构存储并按照关键字大小有序排列。
时间复杂度:O(log2N)

什么是堆?有什么作用?

堆是一种数据结构,可以把堆看成一个完全二叉树,并且这个完全二叉树满足:任何一个非叶节点的值都不大于(或不小于)其左右子树的结点的值。若父亲大孩子小,则为大顶堆,若父亲肖孩子大,则为小顶堆。
作用:应用于堆排序。

5.什么是平衡二叉树?

平衡二叉树又称 AVL 树,是一种特殊的二叉排序树,其左右子树都是平衡二叉树,且左右子树的高度差的绝对值不超过 1.
平衡因子: 左子树高度减去右子树高度的差。
平衡调整: 先找到失去平衡的最小子树,即以距离插入结点最近,且平衡因子绝对值大于 1 的结点最为根节点的子树,分为 LL,LR,RL,RR 四中调节方式。

6.什么是完全二叉树?

若一棵二叉树至多只有最下面的两层上的结点的度数可以小于 2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。
完全二叉树特点:
叶子结点只可能在最大的两层上出现, 对任意结点, 若其右分支下的子孙最大层次为 L,则其左分支下的子孙的最大层次必为 L 或 L+1;
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。满二叉树的结点个数(n 层):2 的 n 次方减一(2^n-1)
完全二叉树的结点编号和满二叉树的编号重合。

7. 二叉树的存储

① 顺序存储结构:用一个数组来存储一颗二叉树,二叉树中的结点值按照编号依次存入一个一维数组中。适用于完全二叉树,若用于一般的二叉树则会浪 费大量存储空间。
② 链式存储结构:二叉树中的每一个结点用一个链结点来存放。Lchild Data Rchild

8.什么是哈夫曼树?

定义:给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。

构造方法:
假设有 n 个权值,则构造出的哈夫曼树有 n 个叶子结点。 n 个权值分别设为 w1、w2、…、wn,则哈夫
曼树的构造规则为:
(1) 将 w1、w2、…,wn 看成是有 n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

特点:
① 权值越大的结点,距离根节点越近;
② 树中没有度为一的结点。
应用:哈夫曼编码,减少编码的长度。哈夫曼编码就是长度最短的前缀编码。

9.M 阶 B-树和 M 阶 B+树的主要区别

① B+树所有有效数据全在叶子节点,而 B-树所有节点分散在树中,B-树中的关键字不重复。
② B+树有几个关键字就有几个子树,B-树中具有 n 个关键字的节点含有(n+1)棵子树。
③ B+树有两个指针,根指针和只想最小节点的指针,叶子节点连接成一个不定长的线性链表
④ B+树中,每个节点(除根节点外)中的关键字个数 n 的取值范围是⌈m/2⌉<=n<=m,根节点 n 的取值范围是 2<=n<=m。B-树中,每个节点(除根节点外的所有最底层非叶子节点)中的关键字取值范围是 ⌈m/2⌉-1<=n<=m-1,根节点 n 的取值范围是 1<=n<[m-1]。
⑤ B+树中的所有非叶子节点仅仅起到索引的作用,节点中的每个索引项只包含对应子树的最大关键字和
指向该子树的指针,不含有该关键字对应记录的存储地址。而在 B-树中,每个关键字对应记录的存储地址。

10. 图的相关概念

图:由结点的有穷集合 V 和边的集合 E 组成。
类别:有向图和无向图。
顶点的度:出度和入度。
有向完全图和无向完全图: 若有向图有 n 个顶点,则最多有 n(n-1)条边,则称为有向完全图;若无向图有 n 个顶点,则最多有 n(n-1)/2 条边,则称为无向完全图。
路径:相邻顶点序偶所构成的序列。
简单路径:序列中的顶点和路径不重复出现的路径。
回路:路径中第一个顶点和最后一个顶点相同的路径。
连通: 无向图中,如果 Vi 到 Vj 有路径,则称这两个顶点连通。如果图中任意两个顶点之间都连通,则称改图为连通图。
有向图中,如果 Vi 到 Vj 有路径,则称这两个顶点连通。如果图中每一对顶点 Vi 和 Vj,从 Vi 到Vj 和 Vj 到 Vi 都有路径,则称改图为强连通图。

11.什么是哈希冲突?以及如何解决。

散列(哈希)表:根据关键码值而直接进行访问的数据结构。根据给定的关键字来计算出关键字在表中的地址,以加快查找的速度。
冲突:指的是多个关键字映射同一个地址的情况。
解决办法:
(1) 开放定址法
① 线性探查法(产生堆积问题);
② 平方探查法(不能探查到哈希表上所有的地址,但至少能探查到一半的地址)
(2) 链地址法
把所有的同义词用单链表连接起来。
补充(常见的哈希函数构造方法)直接定址法,数字分析法,平方取中法,除留余数法。

12.图的存储方式

① 邻接矩阵:是图的顺序存储结构,用两个数组分别存储数据元素(顶点)信息和数据元素之间的关系(边/弧)的信息。图的邻接矩阵表示是唯一的,无向图的邻接矩阵是对称的。
② 邻接表:是图的链式存储结构,由单链表的表头形成的顶点表和单链表其余结点所形成的边表两部分组成。
③ 十字链表:有向图的另一种链式存储结构。
④ 邻接多重表:无向图的链式存储结构。

13.深度优先搜索遍历和广度优先搜索遍历的过程

深度优先搜索遍历
基本思想:首先访问出发点 V,并将其标记为已访问;然后选取与 V 邻接的未被访问的邻接顶点 W,访问W;再选取与 W 邻接的未被访问的顶点访问,以此类推。当一个顶点所有的邻接顶点都被访问过时,则依次退回最近被访问过的顶点,若该顶点还有其他邻接顶点未被访问,则从这些顶点中去一个顶点进行上述的过程,直至图中所有顶点都被访问过为止。
图的深度遍历不一定是不唯一。我们可以取图中任一顶点进行深度遍历。
广度优先搜索遍历
基本思想:首先访问起始顶点 V,然后选取与 V 邻接的全部顶点 w1,w2,….,wn 进行访问,再一次访问与 w1,w2,… ,wn 邻接的全部顶点(不包括已访问过的顶点),以此类推,直至所有顶点都被访问过为止。

14.迪杰斯特拉算法的过程

该算法可以求得某一顶点到其余各顶点的最短路径。
算法思想:设有两个顶点集合 S 和 T,其中集合 S 中存放的是图中已找到最短路径的顶点,集合 T 中存放的是图中的剩余顶点。初始状态时,集合 S 中只包含源点 V0,然后不断从集合 T 中选取到顶点 V0 路径最短的顶点 Vu 并加入集合 S 中。集合 S 每加入一个新的顶点 Vu,都要修改 V0 到集合 T 中各个顶点的最短路径的长度值。不断重复这个过程,直至集合 T 中的顶点全部并入到 S 中为止。

15. 最小生成树的概念

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图联通的最少的边。如果在最小生成树中添加一条边,必定成一个环。
相关算法:
① 普里姆算法
② 克鲁斯卡尔算法
N 个结点的最小生成树有几个结点,几条边:n 个结点,n-1 条边。

16.各种排序算法:

太多了,( •̀ ω •́ )

你可能感兴趣的:(考研复试面试问题,二叉树,数据结构,队列)