《数据结构》期末考试测试题【下】
- 41.根据某二叉树的前、中序序列判断这棵二叉树为?
- 42.对某一序列使用快速排序则第一次的划分结果为?
- 43.构造图的最小生成树的方法主要为?
- 44. 快速排序在什么情况下最容易发挥其长处?
- 45.使用顺序查找法查找一个元素的平均查找长度为?
- 46.在AOE网中关键活动与工期的关系为?
- 47.数据结构中与计算机使用无关的结构为?
- 48.串的模式匹配为?
- 49.对某有向图进行拓扑排序的排序序列为?
- 50.关于AOE网的描述错误的为?
- 51.某森林中第一棵树的结点的个数为?
- 52.某平衡二叉树的结点个数为?
- 53.某序列元素依次插入到大根堆中则最终该堆为?
- 54.串的子串操作为?
- 55.为通信电文的字母设计的哈夫曼编码为?
- 56.根据某序列构造一个二叉排序树的过程为?
- 57.根据某哈希函数用线性探索法处理冲突来构造出的哈希表为?
- 58.排序算法中要求内存最大的算法为?
- 59.根据一组记录利用堆排序的方法建立的初始堆为?
- 60.堆排序是一种什么排序?
往期练习题回顾:
链接:
《数据结构》期末考试测试题【上】
41.根据某二叉树的前、中序序列判断这棵二叉树为?
答案:
二叉树与森林之间的转换规则:
当二叉树转换为森林时
加线规则:
若某节点是其双亲节点的左孩子,则把该节点的右孩子、右孩子的右孩子……都与该节点的双亲节点用线连起来。
- 例如:对于二叉树中的节点A,如果节点B是A的左孩子,C是B的右孩子,那么要将C与A连线。
删线规则:
删去二叉树中所有双亲节点与右孩子节点之间的连线。
- 例如:在上述例子中,删去B和C之间的连线。
层次调整规则:
将整理后的节点按层次排列,根节点在最上面,子节点在其下方相应层次,形成树结构。
42.对某一序列使用快速排序则第一次的划分结果为?
答案【C】
43.构造图的最小生成树的方法主要为?
构造图的最小生成树的方法主要有
普里姆(Prim)算法
和克鲁斯卡尔(Kruskal)算法
两种。
普里姆算法
:
- 首先:从图中的任意一个顶点开始,这个起始顶点是最小生成树的第一个顶点。
- 然后:在与这个顶点相连的边中,选择一条权值最小的边,将这条边连接的另一个顶点加入到最小生成树的顶点集合中。
例如: 有一个图 G = ( V , E ) G=(V, E) G=(V,E)
- 首先,设起始顶点为 v 0 , v_0, v0,在与 v 0 v_0 v0相连的边 ( v 0 , v i ) (v_0, v_i) (v0,vi)中找到权值最小的边,假设是 ( v 0 , v 1 ) , (v_0, v_1), (v0,v1),那么 v 1 v_1 v1就被加入到最小生成树的顶点集合中。
- 之后,不断重复这个过程,每次都在已加入最小生成树顶点集合的顶点与未加入的顶点之间的边中,选择权值最小的边,将对应的未加入顶点加入到最小生成树顶点集合中,直到所有顶点都被加入为止。
克鲁斯卡尔算法
:
首先:将图中所有边按照权值从小到大进行排序。
然后:每次选择权值最小的边,将其加入到最小生成树的边集合中,但要保证加入这条边不会形成环。
例如: 有一个图 G = ( V , E ) G=(V, E) G=(V,E)
- 首先,对边集 E E E中的边按照权值从小到大排序得到 e 1 , e 2 , ⋯ , e m e_1, e_2,\cdots, e_m e1,e2,⋯,em
- 之后,选择权值最小的边 e 1 e_1 e1加入到最小生成树的边集合中。
- 然后,依次考虑下一条边,在加入边的时候,要检查这条边是否会与已经加入的边形成环
- 如果不形成环就
加入
- 如果形成环就
跳过
- 直到加入了 n − 1 n - 1 n−1条边( n n n为图的顶点数),就得到了最小生成树。
普里姆(Prim)算法使用场景:
稠密图(边相对较多的图)优势明显:
- 当图是稠密图时,普里姆算法的时间复杂度相对更优。其时间复杂度为 O ( V 2 ) ( O(V^{2})( O(V2)(使用邻接矩阵存储图的情况下, V V V是顶点数 ) ) )
- 在稠密图中,边的数量接近 V ( V − 1 ) / 2 , V(V - 1)/2, V(V−1)/2,普里姆算法每次从已有的顶点集合向外扩展,不需要像克鲁斯卡尔算法那样对所有边进行排序,在这种情况下效率较高。
- 例如:在一个通信网络规划中,如果节点之间的连接比较紧密(边多),且需要构建一个连接所有节点的最小代价骨干网络。
- 普里姆算法可以快速地从一个节点开始,逐步构建出这个最小生成树。
从特定顶点开始构建树的情况适用:
- 如果已知
最小生成树需要从某个特定的顶点开始构建
,普里姆算法很合适。- 它从这个指定顶点出发,逐步将相邻的顶点和边纳入最小生成树的构建过程中。
- 例如:在一个城市的供电网络升级项目中,要以现有的一个大型发电站(作为起始顶点)为基础,用最小的电缆成本连接城市中的其他变电站。
- 普里姆算法可以有效地实现这个目标。
克鲁斯卡尔(Kruskal)算法使用场景:
稀疏图(边相对较少的图)更加高效:
- 对于稀疏图,克鲁斯卡尔算法的时间复杂度为 O ( E l o g E ) ( E O(ElogE)(E O(ElogE)(E是边数 ) ) )
- 当边的数量远小于顶点数量的平方 ( E ≪ V 2 ) (E\ll V^{2}) (E≪V2)时,克鲁斯卡尔算法通常比普里姆算法更有效。因为它主要操作是对边进行排序,在边数较少的情况下,排序的开销相对较小。
- 例如:在一个生态保护区规划徒步路线网络(图),各个景点(顶点)之间的直接连接(边)并不多。
- 克鲁斯卡尔算法可以通过选择最短的路径(边)来构建连接所有景点的最小生成树(徒步路线),避免了对大量不存在的边进行不必要的操作。
对边的权值分布敏感的情况适用:
- 如果图的边权值分布比较特殊,比如
有很多权值相同的边
,克鲁斯卡尔算法可以更方便地处理。- 因为它是基于边权值排序来选择边构建最小生成树的,在这种情况下可以很容易地选择权值小的边,并且能够很好地利用边权值相同的特点来简化计算。
- 例如,在一个物流配送网络中,有许多相同成本(权值相同)的运输路线(边)连接不同的仓库(顶点)
- 克鲁斯卡尔算法可以快速地挑选出成本最低的路线组合来构建高效的配送网络。
答案【普里姆算法 克鲁斯卡尔算法】
44. 快速排序在什么情况下最容易发挥其长处?
快速排序
:
- 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小。
- 然后分别对这两部分记录继续进行排序,以达到整个序列有序。
A选项:
如果被排序的数据中含有多个相同排序码时
,快速排序在处理过程中可能会做一些不必要的比较和交换操作。
- 因为相同排序码的元素相对顺序在排序前后应该保持不变,这会影响快速排序的效率。
B选项:
如果被排序的数据已基本有序时
,快速排序会退化为冒泡排序,时间复杂度会从平均的 O ( n l o g n ) O(nlogn) O(nlogn)变为 O ( n 2 ) O(n^2) O(n2)
- 因为每次划分得到的子序列规模不均匀。
C选项:
如果被排序的数据完全无序时
,快速排序每次划分都能将数据比较均匀地分成两部分,这样能充分发挥其分治的优势,时间复杂度接近 O ( n l o g n ) O(nlogn) O(nlogn)
D选项:
如果被排序的数据中的最大值和最小值相差悬殊时
,这对快速排序的影响不大。
- 因为快速排序主要关注的是数据的无序程度。
答案【C】
45.使用顺序查找法查找一个元素的平均查找长度为?
顺序查找:
是一种简单的线性查找方法。它从线性表的一端开始,逐个检查元素,直到找到目标元素或者检查完整个线性表。
计算平均查找长度(ASL)
- 假设线性表的长度为 n , n, n,且每个元素被查找的概率相等,都为 1 / n 1/n 1/n
- 查找第 1 1 1个元素时,比较次数为 1 1 1
- 查找第 2 2 2个元素时,比较次数为 2 2 2
- 以此类推,查找第 n n n个元素时,比较次数为 n n n
- 根据
平均查找长度的计算公式
: A S L = ∑ i = 1 n p i c i ASL=\sum_{i = 1}^{n}p_{i}c_{i} ASL=∑i=1npici
- p i p_{i} pi是查找第 i i i个元素的概率
- c i c_{i} ci是查找第 i i i个元素所需的比较次数
- 由于 p i = 1 / n , c i = i ,则 A S L = 1 n ∑ i = 1 n i p_{i}=1/n,c_{i}=i,则ASL=\frac{1}{n}\sum_{i = 1}^{n}i pi=1/n,ci=i,则ASL=n1∑i=1ni
- 根据等差数列求和公式 ∑ i = 1 n i = n ( n + 1 ) 2 , \sum_{i = 1}^{n}i=\frac{n(n + 1)}{2}, ∑i=1ni=2n(n+1),所以 A S L = n + 1 2 ASL=\frac{n + 1}{2} ASL=2n+1
例如:对于一个长度为 5 5 5的线性表,平均查找长度 A S L = 5 + 1 2 = 3 ASL=\frac{5+1}{2}=3 ASL=25+1=3这意味着在平均情况下,需要比较 3 3 3次才能找到目标元素。
答案【 n + 1 2 \frac{n + 1}{2} 2n+1】
46.在AOE网中关键活动与工期的关系为?
AOE网(Activity On Edge Network,边表示活动的网络)
:AOE网是一种有向无环图。
- 顶点表示
事件
- 有向边表示
活动
- 边上的权值表示
活动的持续时间(工期)
关键路径
:整个AOE网表示一个工程流程,从源点(入度为0的顶点)到汇点(出度为0的顶点)的最长路径长度称为关键路径。
关键活动
:关键路径上的活动称为关键活动。
工期决定关键活动:
活动的工期是判断其是否为关键活动的重要因素
在计算关键路径时,通过计算每个
事件
的最早发生时间 ( v e ) (ve) (ve)和最迟发生时间 ( v l ) (vl) (vl)来确定活动
的最早开始时间 ( e ) (e) (e)和最迟开始时间 ( l ) (l) (l)对于活动 a i , a_{i}, ai,其工期用 d u t ( < v j , v k > ) dut(<v_{j},v_{k}>) dut(<vj,vk>)表示(其中 v j v_{j} vj是活动的起点事件 , v k ,v_{k} ,vk是活动的终点事件)
- 活动的最早开始时间 e ( i ) = v e ( j ) , e(i)=ve(j), e(i)=ve(j),
- 活动的最迟开始时间 l ( i ) = v l ( k ) − d u t ( < v j , v k > ) l(i)=vl(k)-dut(<v_{j},v_{k}>) l(i)=vl(k)−dut(<vj,vk>)
当 e ( i ) = l ( i ) e(i)=l(i) e(i)=l(i)时,活动 a i a_{i} ai为关键活动。
- 也就是说:关键活动的工期安排使得其在整个工程流程中没有时间余量,它的任何延迟都会导致整个工程工期的延迟。
关键活动影响工期:
关键活动组成了关键路径,关键路径的长度(即关键活动工期之和)决定了整个工程的最短工期
- 如果关键活动的工期发生变化,那么关键路径的长度也会随之改变,从而导致整个工程工期的改变。
- 例如:一个工程的关键路径上有活动A、B、C,其工期分别为3天、4天、5天,那么整个工程的最短工期为3 + 4+5=12天。
- 如果活动C的工期延长到7天,那么整个工程的工期就会延长到3 + 4+7 = 14天。
答案【正确】
47.数据结构中与计算机使用无关的结构为?
逻辑结构
:指数据元素之间的逻辑关系,它是从具体问题抽象出来的数学模型,与计算机的硬件特性(如计算机的存储方式、内存大小、CPU性能等)无关。
- 例如:一个线性表的逻辑结构是数据元素之间的线性关系,不管是在大型机还是小型机上,这种逻辑关系都是一样的。
存储结构
:指数据结构在计算机中的表示(存储方式),它依赖于计算机的存储设备,如内存、硬盘等。不同的计算机可能有不同的存储容量、存储速度等,这些都会影响数据的存储结构。
- 例如:顺序存储结构需要连续的存储空间,在不同存储容量的计算机上实现顺序存储结构时,可能会受到存储空间大小的限制。
物理结构
:实际上就是存储结构,它与计算机的硬件特性密切相关,如计算机的存储介质(磁盘、磁带等)、存储设备的性能等都会影响数据的物理(存储)结构。
答案【A】
48.串的模式匹配为?
串的模式匹配
:指找某子串在主串中第一次出现的第一个字符的位置。A选项:
判断两个串是否相等
,是一种串的比较操作,但这不是模式匹配的定义。模式匹配重点在于在一个主串中查找特定的子串,而不是单纯判断两个串是否相等。B选项:
对两个串比较大小
,通常是按照字典序等规则比较串的大小关系,这与模式匹配的概念不同。模式匹配不是比较串的大小,而是查找子串在主串中的位置。
C选项:
找某字符在主串中第一次出现的位置
,这里强调的是字符。而模式匹配是找子串(由多个字符组成)在主串中的位置,不是单个字符。
答案【D】
49.对某有向图进行拓扑排序的排序序列为?
根据拓扑排序的方法对该有向图进行分析求解的过程:
步骤一:
- 观察此图可知,顶点3的入度为0,先输出顶点3,并删除从顶点3出发的有向边。
步骤二:
- 此时图中顶点1的入度变为0,接着输出顶点1,并删除从顶点1出发的有向边。
步骤三:
- 此时图中顶点4的入度变为0,接着输出顶点4,并删除从顶点4出发的有向边。
步骤四:
- 此时顶点2和顶点6的入度都变为0,有两种选择情况:
- 情况一: 若先选择顶点2,输出顶点2并删除从顶点2出发的有向边,此时顶点6的入度为0,输出顶点6,最后输出顶点5,得到拓扑序列3,1,4,2,6,5。
- 情况二: 若先选择顶点6,输出顶点6并删除从顶点6出发的有向边,此时顶点2的入度为0,输出顶点2,最后输出顶点5,得到拓扑序列3,1,4,6,2,5。
综上:该有向图的拓扑序列可能是3,1,4,2,6,5或者3,1,4,6,2,5
选项中只有D项3,1,4,2,6,5符合。
答案【D】
50.关于AOE网的描述错误的为?
A选项:
在AOE网中,如果关键活动不按期完成,那么关键路径的长度就会增加,必然会影响整个工程的完成时间
- 关键活动是位于关键路径上的活动。
- 关键路径是从源点到汇点的最长路径,它决定了整个工程的最短完成时间。
B选项:
在AOE网中,如果所有的关键活动都提前完成,那么关键路径的长度就会缩短,整个工程将会提前完成
- 因为关键路径的长度决定了整个工程的完成时间,所以整个工程将会提前完成。
C选项:
在AOE网中,由于网络结构的复杂性,可能存在多条关键路径
- 因为一个工程可能有不同的并行流程,这些并行流程中的最长路径可能有多条。
D选项:
在AOE网中,如果一个关键活动提前完成并不一定能使整个工程提前完成
- 因为可能存在多条关键路径,当只有一个关键活动提前完成,而其他关键路径上的关键活动没有提前完成时,整个工程的完成时间仍然取决于最长的关键路径。
答案【D】
51.某森林中第一棵树的结点的个数为?
二叉树与森林之间的转换关系:
当森林转换为二叉树时:
二叉树的根是第一棵树的根。
二叉树中根的左子树是第一棵树除去根节点后的子树森林转换而来。
二叉树中根的右子树是森林中除第一棵树外其他树转换而来。
答案【A】
52.某平衡二叉树的结点个数为?
平衡二叉树的相关性质:
与节点数
n n n和树的高度
h h h有关的公式: n = F h + 2 − 1 n=F_{h + 2}-1 n=Fh+2−1
这里 F i F_i Fi是斐波那契数列的第 i i i项。
斐波那契数列的定义为 F 1 = 1 , F 2 = 1 , F n = F n − 1 + F n − 2 ( n ⩾ 3 ) F_1 = 1,F_2 = 1,F_n=F_{n - 1}+F_{n - 2}(n\geqslant3) F1=1,F2=1,Fn=Fn−1+Fn−2(n⩾3)
已知平衡二叉树的高度 h = 6 h = 6 h=6
根据上述公式,我们需要求 F h + 2 = F 8 F_{h+2}=F_{8} Fh+2=F8
按照斐波那契数列的递推公式计算:
- F 3 = F 2 + F 1 = 1 + 1 = 2 F_3=F_2 + F_1=1 + 1 = 2 F3=F2+F1=1+1=2
- F 4 = F 3 + F 2 = 2 + 1 = 3 F_4=F_3+F_2 = 2+1=3 F4=F3+F2=2+1=3
- F 5 = F 4 + F 3 = 3 + 2 = 5 F_5=F_4 + F_3=3 + 2 = 5 F5=F4+F3=3+2=5
- F 6 = F 5 + F 4 = 5 + 3 = 8 F_6=F_5+F_4 = 5+3 = 8 F6=F5+F4=5+3=8
- F 7 = F 6 + F 5 = 8 + 5 = 13 F_7=F_6+F_5 = 8 + 5=13 F7=F6+F5=8+5=13
- F 8 = F 7 + F 6 = 13 + 8 = 21 F_8=F_7+F_6=13 + 8 = 21 F8=F7+F6=13+8=21
根据
平衡二叉树节点数公式:
n = F h + 2 − 1 = F 8 − 1 = 21 − 1 = 20 n=F_{h + 2}-1=F_{8}-1=21 - 1 = 20 n=Fh+2−1=F8−1=21−1=20
答案【B】
53.某序列元素依次插入到大根堆中则最终该堆为?
答案【B】
54.串的子串操作为?
串的子串操作
:从一个串中取出的一个任意连续
的子序列。
- 例如:对于串s = “abcdef”,s1="bcd"就是s的一个子串,它是从s中连续取出的一部分。
答案【对】
55.为通信电文的字母设计的哈夫曼编码为?
答案:
56.根据某序列构造一个二叉排序树的过程为?
答案:
构造一棵二叉排序树的目的: 并不是为了排序,而是为了提高
查找
和插人
或删除
关键码的速度。
- 在一个有序数据集上的查找速度快于无序数据集的查找速度。
- 二叉排序树这种非线性结构,也有利于插入和删除的实现。
57.根据某哈希函数用线性探索法处理冲突来构造出的哈希表为?
答案:
58.排序算法中要求内存最大的算法为?
希尔排序
:它的空间复杂度为 O ( 1 ) O(1) O(1)
- 这意味着在希尔排序过程中,除了输入数据本身占用的空间外,只需要使用非常少量的额外空间(常数级别的空间)来进行排序操作。
快速排序
:它的空间复杂度为 O ( log 2 n ) O(\log_{2}n) O(log2n)
- 这里的 n n n是待排序数据的个数。
- 在快速排序过程中,需要使用一定量的额外空间来进行递归操作等,但这个额外空间的大小与 n n n的对数成正比。
归并排序
:它的空间复杂度为 O ( n ) O(n) O(n)
- 归并排序在合并过程中,需要额外开辟与待排序数据个数 n n n相同数量级的空间来存储临时数据,以便进行合并操作。
堆排序
:它的空间复杂度为 O ( 1 ) O(1) O(1)
- 和希尔排序类似,只需要很少的常数级别的额外空间来进行排序操作。
答案【C】
59.根据一组记录利用堆排序的方法建立的初始堆为?
- 利用堆排序的方法对给定的排序码建立初始堆。
- 堆排序的初始堆通常是一个大根堆(最大堆),即每个节点的值都大于或等于其子节点的值。
建立初始堆的步骤如下:
- 将给定的排序码构建成一棵完全二叉树。
- 从最后一个非叶子节点开始,向前依次调整每个节点。
- 在堆排序中,建立初始堆的调整顺序是从
最后一个非叶子节点
开始,自底向上
、从右到左
依次调整每个子树,使其满足堆的性质(大根堆或小根堆)
答案【B】
60.堆排序是一种什么排序?
堆排序
:先将待排序序列构建成一个堆,然后将堆顶元素与堆的最后一个元素交换,再对前面的 n − 1 n - 1 n−1个元素重新调整为堆,重复这个过程直到整个序列有序。
- 堆排序的核心操作是不断从无序区选择最大(或最小)元素放到有序区。
- 在构建堆的过程中,我们通过比较和调整节点的位置,使得堆顶元素始终是最大(或最小)的。
- 这一过程类似于选择排序中的选择最大(或最小)元素的操作。
插入排序
:是将未排序数据插入到已排序序列中的合适位置。
- 堆排序不是这种操作方式,所以不是插入排序。
交换排序
:是通过交换元素的位置来实现排序。
- 例如:冒泡排序和快速排序,堆排序不是通过交换相邻元素来排序的,所以不是交换排序。
归并排序
:是将序列分成子序列,分别排序后再合并。
- 堆排序没有这种分治合并的过程,所以不是归并排序。
堆排序是一种选择排序,选择排序有直接选择排序和堆排序
答案【B】