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)的排序算法,以僞代碼形式給出,並解釋該程序。

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