2018上海科技大学991数据结构与算法

文章目录

基础知识

渐进符号

OO:最坏时间复杂度
Ω\Omega:最好时间复杂度
Θ\Theta:包含最好最坏复杂度(好像不太对)
oo:感觉就是数学里的高阶无穷小的意思

完全二叉树,满二叉树

完全二叉树:就是从上到下,从左到右一个一个填,没有跳着填,但是最下面一层可能每没填完
满二叉树:就是每一层都会填满
内部节点:就是不要最后一层的点,因此高度为h(根节点高度为0)的完全二叉树和满二叉树的内部节点都是2h12^h-1
在这里插入图片描述

一.判断题(10 题,每题 2 分)

1.若函数 f(n)=n34n+4f(n) = n^3 - 4n + 4 以及 g(n)=5n3100g(n) = 5n^3 – 100, 则 f(n)+g(n)f(n) + g(n)(n3)Ω(n^3) 并且 f(n)g(n)f(n)*g(n)o(n6)o(n^6).

F

在这里插入图片描述

2用简单均匀的哈希函数将 n 个不同的 keys 映射到一个长度为 m 的数组,集合{{k, l}: k≠l and h(k) = h(l)}的期望大小是 n/m.

3 .一个有n个节点的有向无环图最多有n(n-1)/2条边。

T

4 .在图深度优先遍历 DFS 算法中,对于图 G 任意两点节点 u 和 v,如果 u 的结束时间大于 v 的结束时间,并且 u 和 v 在同一个 DFS 树中,那么在此 DFS 树中 u 是 v 的先驱。

T
就是回溯的时候先驱后回溯哇

5 .给定一个长度为 n、包含 100 个变量的布尔公式 F,判断 F 是否可满足是 NP-complete, 假设 P≠NP.

在这里插入图片描述

二.单选题(15 题,每题 2 分)

1.假设一个栈由一个线性链表实现,其中仅有一个指针指向链表的第一个元素(栈顶)。下面哪一个关于进栈和出栈操作的算法复杂度是正确的?

A.(1) O(1) (2) O(1)
B.(1) O(1) (2) O(n)
C.(1) O(n) (2) O(1)
D.(1) O(n) (2) O(n)
E.(1) O(log n) (2) O(1)
A

2.下面哪种数据结构对更新由固定长度的整数组成的列表效率最高:

A.栈
B.链表
C.数组
D.顺序文件
E.二叉搜索树
C

3.假设栈和队列是已提供的非透明数据类型,仅实现了元素增加、元素删除、以及是否为空的测试。一个程序员要计算一个栈或者队列 C 的元素个数,而 C 当前的状态是 t 并且只能使用一个辅助的栈或队列 D。C 和 D 可以被任何合理的方式使用,但计数之后 C 必须恢复到原来的状态 t。下面哪些选项可以实现上述的计数操作?

I. C 是队列并且 D 是队列
II. C 是栈并且 D 是栈
III. C 是队列并且 D 是栈

A.无选项
B.I 和 II
C.I 和 III
D.II 和 III
E.I,II 和 III
B或者E
关键就是没说是一趟还是两趟
在这里插入图片描述

4.一个哈希函数 h 将 16 比特的输入映射到一个 8 比特的哈希值。假设给定任意一个包含 1000 个不同输入的集合,都至少有 k 个输入会被 h 影射到同一个哈希值。这个 k 的最大值是多少?

A.3
B.4
C.64
D.256
B
2^8=256
就是把1000个东西放进256个格子里,平摊下来3个多

5.以下哪种数据结构可以用来有效的调度一个共享计算机上的工作,其可以跟踪需要完成的工作和它们的相对优先级?

A.优先队列
B.数组
C.链表
D.堆栈
A

6.在一个长度为 n 的优先队列中插入一个新元素的复杂度是?

A.O(1)
B.O(lg n)
C.O(n)
D.O(n lg n)
B

7.一棵满二叉树是一棵有根树,其所有非叶节点都有两个孩子节点。一棵有 50 个叶节点的满二叉树有几个非叶节点?

A.25
B.49
C.50
D.51
E.100
B

8.在一棵存储于数组的二叉树中,索引号为 n 的节点的孩子节点的索引号是多少?假定根节点的索引号为 0。

A.𝑛 × 2 , 𝑛 × 2 + 1
B.n2n^2 + 1 , n2n^2 + 2
C.𝑛 × 2 + 1 , 𝑛 × 2 + 2
D.2𝑛 , 2𝑛 + 1
C

9.假设我们有一个包含 6 个元素、使用森林表示法的不相交集合(并查集)。其初始父亲数组为[0,1,2,3,4],即每个元素属于一个不同的集合。当我们进行一系列按秩合并(或等价地,按高度合并)操作之后,下列哪一个可能是最终的父亲数组?

A.[1,1,1,4,0]
B.[2,0,2,0,2]
C.[1,4,2,0,0]
D.[3,2,4,4,4]
B
应该就是选个尽量矮一点的树

在这里插入图片描述
原来并查集除了路径压缩还有按秩合并的方法啊~
在这里插入图片描述

10.Kruskal 算法和 Prim 算法是计算图中最小生成树的两个经典算法,以下哪些项是肯定正确的?

i. Kruskal 算法是一种贪心算法。
ii. Kruskal 算法是一种动态规划算法。
iii. Prim 算法是一种贪心算法。
iv. Prim 算法是一种分治算法。

A.i 和 iii
B.i 和 iv
C.ii 和 iii
D.ii 和 iv
A

11.给定一个以邻接矩阵表示的带权有向图 W=(wij),其中 wij 表示(i,j)的权值。假设该图不包含非负权值环,并且含有 n>3 个节点,如果采用基于矩阵乘法的算法解决所有节点对间最短路径问题,以 Wi 表示矩阵 i 次乘法后的结果,以下那些矩阵肯定包含最短路径的权值?

i. W2W^2 , ii. Wn1W^{n-1} , iii. W2n1W^{2n-1}, iv. W2nW^{2n}
A.i
B.ii
C.ii 和 iii
D.ii, iii 和 iv

12.以下哪些项是肯定正确的?

i.给定一个有向图 G=(V,E),G 的关联图是一个图 G’=(V’,E’),其中 V’中的节点是 G 的强连通分量,对于任意一对节点 S,T\inV’, (S,T) \inE’当且仅当存在 u\inS 和 v\inT 满足(u,v) \inE。G’是一个有向无环图。

ii.考虑带权图 G=(V,E,W)G=(V,E,W)G=(V,E,W)G'=(V,E,W'),所有 W 和 W’中的权值为正数,如果 G 和 G’有相同的节点和边,并且对于任意边 e 满足 W(e)=W(e)W(e)W(e) = W'(e)* W'(e),那么对于任意节点对 u,v\inV, G’中的 u 和 v 之间的最短路径同样是 G 中的 u 和 v 之间的最短路径。

iii.考虑带权图 G=(V,E,W)G=(V,E,W)G=(V,E,W)G'=(V,E,W'),所有 W 和 W’中的权值为正数,如果 G 和 G’有相同的节点和边,并且对于任意边 e 满足 W(e)=W(e)+W(e)W(e) = W'(e)+ W'(e),那么对于任意节点对 u,v\inV, G’中的 u 和 v 之间的最短路径同样是 G 中的 u 和 v 之间的最短路径。
A.i
B.i 和 ii
C.i 和 iii
D.ii 和 iii

13.n 个元素的数组采用 quicksort 算法进行排序,其最坏时间复杂度是?

A.O(n log n)
B.O(n)
C.O(n2n^2)
D.O(log n)
C
快排的期望复杂度才是nlogn
最快复杂度是 n^2

14.对于数组排序,以下哪种情况下应该选择插入排序?

A.当数组很大时。
B.当数组中只有少数元素不在其排序后的位置时。
C.当数组内容是字符串而非数值时。
D.插入排序永远不是一个好的选择。
B

15.如果一个算法通过将问题划分成若干个没有重叠的子问题进行解决,那么该算法称为:

A.递归法
B.动态规划
C.分治法
D.贪心算法
C

三.多选题(5 题,每题 2 分)

1.阅读下面的陈述,并选择正确的选项:

A.log2 nlog_2\ n = O(log10 nlog_{10}\ n)
B.log10 nlog_{10}\ n = O(log2 nlog_2\ n)
C.n2n^2 =O(2n2^n)
D.2n2^n =O(n2n^2)
E.None of the above
ABC
据说是同阶低阶都行🙃

在这里插入图片描述
在这里插入图片描述
根据霍同学提供的可靠情报,感觉很有道理~

2.在一个字符编码问题中,如果一个文件只由 a, b, c 组成,它们出现的频率分别是 45, 13, 12, 以下哪些编码是最优的?

A.a:000, b:010, c:101.
B.a:000, b:010, c:100.
C.a:00, b:01, c:10.
D.a:1, b:01, c:00.
D
在这里插入图片描述
在这里插入图片描述

3.一棵二叉树的前序遍历是 ABCDE,后序遍历是 CBEDA,它的中序遍历有可能是哪个?

A.BACDE
B.BCADE
C.CBAED
D.ACBED
BC
在这里插入图片描述

4.以下哪一个或哪些是下图的拓扑排序?

在这里插入图片描述
A.2,1,9,3,4,7,5,6,8
B.2,1,9,4,5,7,3,6,8
C.2,9,1,4,7,3,5,6,8
D.2,1,4,7,5,9,3,6,8
E.2,9,1,4,3,7,5,6.8
ACE

5.对于可以通过动态规划可以解决的问题,以下哪些表述是正确的?

A.这些问题无法通过贪心算法解决。
B.这些问题具有最优子结构性质。
C.这些问题可以划分成若干个重叠子问题。
D.动态规划的时间复杂度和空间复杂度相等。
BC

四.栈(20 分)

设计一个栈,除了提供入栈和出栈操作,还提供 min 函数,返回栈里的最小元素。所有三个函数都应该具有 O(1)的复杂度。请描述你的设计。

五.二叉搜索树(20 分)

根据以下二叉搜索树回答:

在这里插入图片描述

1.从一个空的二叉搜索树开始,以下哪个插入序列可以生成以上二叉搜索树?(4 分)

A.3, 7, 1, 5, 9, 4
B.3, 7, 4, 1, 5, 9
C.3, 4, 7, 5, 9, 1
D.3, 1, 7, 9, 5, 4
B

2. 以上二叉树的中序遍历是?(4 分)

①③④⑤⑦⑨

3. 画出把树中根节点 3 去掉后的二叉搜索树。(6 分)

4.画出把 3 节点重新插入到第 3)小问所得树之后的二叉搜索树。(6 分)

六.图的表示(20 分)

给定一个图的邻接表表示

在这里插入图片描述

1.画出该图;(10 分)

2.画出该图的邻接矩阵表示。(10 分)

七. 图的遍历(20 分)

考虑以下修改后的图遍历算法:

1: 	Visited = {}; 
2: 	ModTraversal (v: Node, G: Graph) { 
3: 	    // assume  G.V is the set of nodes in the graph G 
4: 	    //        G.E is the set of edges in the graph G   
5: 	    Queue active = Ø;  // a queue that is first in first out 
6: 	    forall (v,w) in G.E do { // an ascending alphabetical  
// order of w’s 
7:         if (not wVisited) then {  
8:             Visit (w); 
9:             Visited = Visited∪{w}; 
10:             ENQUEUE(active ,w) ; 
11:         } ; 
12:     } ; 
13:     while (active ≠ Ø) do { 
14:         w = DEQUEUE(active); 
15:         ModTraversal (w,G) ; 
16:     } ; 
17:  } 

1.给出下图用上述遍历算法遍历时的节点访问顺序,遍历算法采用以下方式调用:

Visited = Visited∪{a}; // Visited={a}
ModTraversal (a, G) ;
(a 是遍历的起始节点;当存在多个同一个节点出发的边时,上述算法行 6 以边的目标节点的升序访问。比如,连接节点 a 的边有三条(a,b),(a,e),(a,f),由于 b<e<f, (a,b)必须在(a,e)和(a,f)前访问, (a,e)必须在(a,f)前访问)(8 分)

2. 画出上述算法在下图的遍历生成树(6 分)

在这里插入图片描述

3.假设上述算法的输入图是以邻接链表表示,集合的操作(检查是否包含某个节点和集合中加入节点)和入队、出队都在常数时间内完成(即 O(1)),使用|V|和|E|表示上述遍历算法的最坏时间复杂度(大 O 表示法)。(6 分)

八.排序(20 分)

假设给定一个长度为 n 的数组,并且数组中每个值的位置距离排序后该值的位置不超过k(小于或等于 k),k ≤n。比如数组[2 3 1 4 6 5 7 9 8],每个值的位置距离其排序后的位置不超过 2。设计一个最坏时间复杂度为 O(n log k)的排序算法,以伪代码形式给出,并解释该程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章