2019上海科技大學991數據結構與算法

算法導論:
鏈接:https://pan.baidu.com
/s/1nXzwVML3V_FFnQHGFfBcYg 
提取碼:50pq 
民間QQ羣:807064328

基礎知識與結論

①:

滿=+1滿二叉樹中,葉子節點=中間節點+1
滿二叉樹就是每個節點要麼沒有兒子,要麼有兩個兒子;當葉子節點增加兩個兒子時,葉子節點增加兩個,並且剛剛的葉子節點變成了中間節點,所以相當於中間節點和葉子節點都同時增加1,而最開始的情況的時候,就是隻有1個根節點,相當於葉子節點爲1,中間節點爲0,而向以後發展兩種節點增加的速度是一樣的,所以總是相差1

②:

前序遍歷:根左右
中序遍歷:左根右
後序遍歷:左右根

③:漸進號

OO:最壞時間複雜度
Ω\Omega:最好時間複雜度
Θ\Theta:包含最好最壞複雜度(好像不太對)
oo:感覺就是數學裏的高階無窮小的意思

真題

一.判斷題(10 題,每題 2 分)


1.在循環鏈表中,某些鏈接域可能爲空(錯 )
都是環了得哇,應該每個數的信息都一樣,要是有一個空那全都空了

2.給定任意函數f(n)和g(n),f(n)=Q(g(n)和f(n)=o(g(n)可能同時成立。(錯)
在算法導論的第三章21頁

3. 一個好的哈希函數需滿足簡單均勻(對)

4.下列樹是二叉搜索樹。 (對)
在這裏插入圖片描述
滿足左兒子<根<右兒子
5.一棵樹的節點個數有可能大於葉節點兩倍。(對)
沒說是二叉樹哦(╥╯^╰╥)
隨便一根長一點直鏈就能舉出例子

6.圖的鄰接矩陣表示空間複雜度與邊數無關。 ( 對)

7.在圖的廣度遍歷算法中,每個節點恰好僅入隊一次。 ( 對)

8.給定一個帶權有向圖,圖的節點爲1,2…n,要計算節點1和n之間的最短路徑或判斷這樣的路徑不存在,這個問題闊以在多項式時間內解決 ( 對)

9.給定一個 圖,確中是否存在給定一個圖正好包含100 個節點的團是一個 NP-complete的問 題, 假設 P≠NP ( )

10.給定 一個圖, 確定是否可以去除圖中一半的節點後使得該可以三染色,這可以在多項式時間內完成, 假設 P≠NP ( )

二.單選題(10 題,每題 2 分)

1.哪種字符串的存儲結構可以方便地進行插入,刪除,並聯及重新安排子字符串?( B)
A. 固定長度的存儲結構
B. 鏈表存儲結構
C. 具有固定最大長度的變存儲結構
D. 數組存儲結構
E. 以上都不是

2.下面哪個選項中的函數是按照漸進大小的增序排列?(C )
A. 2n, n + (log n)2, n3, 10n2, n log n
B. n + (log n)2, n3, 10n2, n log n, 2n
C. n + (log n)2, n log n, 10n2, n3, 2n
D. n + (log n)2, 10n2, n log n, n3, 2n
E. 2n, n3, 10n2, n log n, n + (log n)2

3.存儲 10 個元素到一個哈希表,這 10 個元素的 key 是{5,28,19,15,20,12,33,17,10,18}。哈希表總共有 9 個 slots,哈希函數是 h(k) = k mod 9,並用鏈表解決衝突。哈希表中最長的鏈表長度是?( C)
mod之後:5 1 1 6 2 3 6 8 1 0
A. 1
B. 2
C. 3
D. 4

4.滿二叉樹的所有中間節點都有兩個孩子節點。一個有 500 個葉子節點的滿二叉樹有多少箇中間節點?( B)
A. 250
B. 499
C. 500
D. 501
E. 1000

5.以下哪一個關於樹的描述是錯誤的?( A)
A. 非葉節點有可能沒有孩子
B. 在一棵樹中加一條邊會形成一個環
C. 一棵樹中並非每個節點都有父親節點
D. 一棵包含一個節點的樹高度爲 0

A選項,不是葉子節點那下面不是肯定連着的嗎?所以肯定有孩子呀
C選項是對滴,只剩一個根節點就沒有父親

6.下面二叉樹的中序遍歷是什麼?( A)
在這裏插入圖片描述
A. DFBEAC
B. ABDFEC
C. FDEBCA
D. FDEBAC

7.Prim 算法是一種計算圖的最小生成樹算法,Floyd-Warshall 算法可用於計算有向圖中所有節點對之間的最短路徑。以下哪些表述肯定是正確的?(B)

i. Prim 算法是一種貪心算法。
ii. Prim 算法是一種動態規劃算法。
iii. Floyd-Warshall 算法是一種貪心算法。
iv. Floyd-Warshall 算法是一種動態規劃算法。
A. i 和 iii
B. i 和 iv
C. ii 和 iii
D. ii 和 iv

8.以下哪一個圖的問題可以在線性時間內解決?( B)
A. 找到一個無向圖中的最長簡單環
B. 計算有向圖的強連通分量
C. 解決帶權有向圖的單源最短路徑問題
D. 找到一個無向圖的最大團
汪同學說選B

9.下列關於歸併排序和快速排序的陳述哪一項是對的?( A)
A. 都是用分治法
B. 給定一個長度爲 n 的輸入數組,都是需要O(n)的時間進行每一次切分
C. 都有相同的最壞時間複雜度
D. 以上都對
我是感覺AB都對,但是汪同學說,歸併並不劃分,只是在並的時候才花時間,大概這個意思
10.任何一個基於比較的算法在一個長度爲 n 的數組中同時找出最大和最小值,至少需要數組元素之間的比較的次數與下列哪個最接近?(B )
A. n
B. 1.5n
C. 2n
D. n²

汪同學說見算法導論第九章第一頁有證明,據說選B
哦~原來就是兩個兩個地拿進來比較,拿進來的這兩個先比較一次,然後用小的比較最小值,大的比較最大值,這樣每輪會比較3次,但是一共只會比較 n2\frac{n}{2} 輪,總共就是 3n2\frac{3n}{2}
試了一下,爲啥優化後反而時間還長了喃(T▽T),哦好像是產生的隨機數太好了,如果換成遞減數列,標答的方法就體現出來了~
改了一下,僅使用if=if和=
第三種方法是有位同學提出來的,我覺得很有道理。。。

#include"bits/stdc++.h"
#define Rand(L,R) (L+sui()%(R-L+1))
using namespace std;
const int maxn=1e8+5;
int a[maxn],N=maxn-5;
clock_t t1,t2;
int solve1()
{
	int Max=a[1],Min=a[1];
	t1=clock();
	for(int i=2;i<=N;i++)
	{
		if(a[i]>Max)Max=a[i];
		if(a[i]<Min)Min=a[i];
	}
	t2=clock();
	cout<<"Max="<<Max<<" Min="<<Min<<endl;
	return t2-t1;
}
int solve2()
{
	int Max=-1e9,Min=1e9;
	t1=clock();
	for(int i=1;i<=N;i+=2)
	{
		if(a[i]<a[i+1])
		{
			if(a[i]<Min)Min=a[i];
			if(a[i+1]>Max)Max=a[i+1];
		}
		else
		{
			if(a[i+1]<Min)Min=a[i+1];
			if(a[i]>Max)Max=a[i];
		}
	}
	t2=clock();
	cout<<"Max="<<Max<<" Min="<<Min<<endl;
	return t2-t1;
}
int solve3()//最好情況遞減O(n),最壞情況遞增O(2n) 
{
	int Max=a[1],Min=a[1];
	t1=clock();
	for(int i=2;i<=N;i++)
	{
		if(a[i]>Max)Max=a[i];
		else if(a[i]<Min)Min=a[i];
	}
	t2=clock();
	cout<<"Max="<<Max<<" Min="<<Min<<endl;
	return t2-t1;
}
int main()
{
	mt19937 sui(time(0));
	for(int i=1;i<=N;i++)a[i]=Rand(1,100000000);
	cout<<"優化前="<<solve1()<<endl;
	cout<<"優化後="<<solve2()<<endl;
	cout<<"第三種="<<solve3()<<endl;
 } 

三.多選題(5 題,每題 2 分)

1. 假設使用一個鏈表來表示一個稀疏矩陣,其中只存儲非零元素。在鏈表的節點中需要存儲什麼信息?(ABCD )
A. 行號
B. 列號
C. 矩陣元素的值
D. 非零元素的個數
E. 零元素的個數
有爭議選不選D

2.在一個字符編碼問題中,如果一個文件只由 a, b, c 組成,它們出現的頻率分別是 45, 13,
12, 以下哪些編碼是最優的?(D )
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
大概是看他最短吧

3.給定一個具有 n 個節點和 m 條邊的無向圖,選擇下列正確的稱述?( AC)
A. 如果該圖是一棵樹,那麼m = n - 1
B. 如果該圖是一棵樹,那麼n = m - 1
C. 如果該圖是一個森林,那麼m < n
D. 如果該圖是一個森林,那麼n < m
E. 以上都不正確

4.考慮以下帶權無向圖,以下哪一個或哪些表述是正確的?( BCE)
在這裏插入圖片描述
A. 上圖有四個最小生成樹
B. 存在一個包含邊(6,8)的最小生成樹
C. 存在一個包含邊(5,6)的最小生成樹
D. 所有最小生成樹都包含邊(2,9)
E. 所有最小生成樹都包含邊(4,7)
在這裏插入圖片描述

5.用 X ≤pY 表示問題 X 可以多項式時間規約到問題 Y。假設問題 X 屬於 P,問題 Y 屬於 NP,同時 X ≤p Y。下列哪些項一定爲真?(A )
A. X 屬於 NP
B. X 是 NP-complete
C. Y 是 NP-complete
D. 假定 Z 屬於 P,那麼 Z ≤p X

在這裏插入圖片描述
據霍同學說是625頁的這個(ಥ_ಥ)

四. Lists (25 points) 列表(25 分)

給定如下不含重複關鍵字的數組(數組的索引從 0 開始):
在這裏插入圖片描述

(1)在如上數組中插入一個新的數據的平均時間複雜度是多少?用 O 表示這個時間複雜度,同時假設這個數組原來存放有 N 個數據、而且不滿。(5 分)

我覺得是O(N2)O(\frac{N}{2})

(2)用兩個數組將上述給定的數組中的數據表示成一個單鏈表(需保持數據在原數組中的順序),在兩個數組中填寫對應的信息(提示:其中一個數組存放關鍵字,另一個存放對應的指向下一個關鍵字的指針,用“/”表示 NULL 指針)。(5 分) 在這裏插入圖片描述
汪同學的答案,注意索引是從0開始滴:
在這裏插入圖片描述

(3)在以上兩個數組表示的鏈表中去掉關鍵字 K3,畫出去掉之後兩個數組的狀態(不被鏈表佔用的空格留空)。(5 分)
在這裏插入圖片描述
同樣是汪同學的答案:
在這裏插入圖片描述

(4)根據 (3)的結果,只給定了 K4 在關鍵字數組裏的索引,要求把 K4 用O(1)O(1)時間複雜度從鏈表中刪除,畫出刪除後的兩個數組狀態。(5 分)
還是汪同學的:![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190921203725413.png)
這道題確實應該是這樣的,因爲題目說了要O(1)O(1)的複雜度,感謝羣裏的童鞋~
在這裏插入圖片描述

然後我才知道闊以O(1)O(1)刪除鄰接表的邊,以前都沒想過O(1)刪除鄰接表的邊
(5)假設給定的關鍵字滿足一個線性關係:K1 > K2 > K3 > K4 > K5。用一個完全二叉樹將這個線性關係表示成一個二叉搜索樹,然後將這個二叉搜索樹用一個數組來表達,最後畫出這個數組(數組的長度是 5)。備註:在這裏完全二叉樹是一個二叉樹,其中每一層(可能除最後一層之外)都完全填充,而最後一層從左到右填到某一個位置爲止。(5 分)
沒懂這道題到底要幹嘛,汪同學是先弄成二叉搜索樹,然後一層一層填進數組裏面
在這裏插入圖片描述
在這裏插入圖片描述

五.Binary Trees (25 points) 二叉樹(25 分)

(1)請寫出下面這棵二叉樹的前序、中序、後序和廣度優先遍歷,以節點序列的形式給出。(9 分)

在這裏插入圖片描述
前序:3241675
中序:4261357
後序:4612573
廣度優先:3274156
(2)一棵二叉樹的前序遍歷是 1,3,2,7,6,5,4,中序遍歷是 1,2,3,4,5,6,7。請畫出這棵樹。(8 分)
在這裏插入圖片描述
(3)一棵二叉樹的後序遍歷是 1,3,2,7,6,5,4,中序遍歷是 1,2,3,4,5,6,7。請畫出這棵樹。(8 分)
在這裏插入圖片描述

六. Graph (25 points) 圖(25 分)

給定如下帶權有向圖
在這裏插入圖片描述
(1)畫出該圖的鄰接表表示
在這裏插入圖片描述

(2)畫出該圖的鄰接矩陣表示
在這裏插入圖片描述

(3)畫出該圖的以 A 爲出發節點的一棵廣度優先樹
在這裏插入圖片描述
(4)畫出該圖的以 A 爲出發節點的最短路徑樹。
在這裏插入圖片描述

七.快速排序(25 分)

假設我們把快速排序算法用在一個包含 n 個整數的數組 E,將這 n 個元素排爲升序。我們用元素之間的比較次數來衡量時間複雜度,而每一次元素間的比較需要常數時間。
(1)假設一個快速排序算法的版本總是選數組裏最左邊的元素作爲基準。對這樣一個快速排序算法,找到一個最壞情況的包含 n 個元素的輸入數組,用集合{1, 2, …, n}中的所有整數的一個排列來表示。對這樣的輸入,推導這個算法的漸近時間複雜度,用OO來表示。(8 分)

解:
每次選的最左邊的數都是最大的
T(n)nT(n)表示還有n個數需要排序
T(n)=T(n1)+(n1)T(n)=T(n-1)+(n-1)
T(n)=T(n2)+(n2)+(n1)T(n)=T(n-2)+(n-2)+(n-1)
......
T(n)=T(1)+1+2+...(n1)=n(n1)2=O(n2)T(n)=T(1)+1+2+...(n-1)=\frac{n(n-1)}{2}=O(n^2)
所以最壞情況就是O(n2)O(n^2)


O(nlogn)O(nlogn)的推導:
網上看到滴:
T(n)=2T(n2)+nT(n)=2 T\left(\frac{n}{2}\right)+n
T(n)=2(2T(n4)+n2)+n=4T(n4)+2nT(n)=2\left(2 T\left(\frac{n}{4}\right)+\frac{n}{2}\right)+n=4 T\left(\frac{n}{4}\right)+2 n
T(n)=4(2T(n8)+n4)+2n=8T(n8)+3nT(n)=4\left(2 T\left(\frac{n}{8}\right)+\frac{n}{4}\right)+2 n=8 T\left(\frac{n}{8}\right)+3 n
......
T(1)=0T(1)=0
T(n)=nT(1)+(log(n))×n=O(nlogn)T(n)=n T(1)+(\log (n)) \times n=O(nlogn)

(2)作爲一個遞歸算法,快速排序算法一般要對很多小的子數組進行遞歸調用,從而影響了時間效率。 而插入排序算法在小數組上運行效率很高。描述一個修改快速排序算法的方法,利用插入排序算法來解決上述的問題。假設插入排序算法處理的每一個子數組的長度不超過 k 個元素。推導證明這個修改過的快速排序算法的平均時間複雜度是
O(nk + n lg(n / k))。(9 分)

解:
因爲數組長度最少變成了kk,所以快排只會遞歸log(nk)log(\frac{n}{k})次,每次的排序都是O(n)O(n)的,因此整個快排的過程是nlognknlog\frac{n}{k}的。然後長度爲kk的插入排序是O(k2)O(k^2)的,有nk\frac{n}{k}坨,因此是O(k2nk)=O(nk)O(k^2\frac{n}{k})=O(nk)
所以整個排序時間是:O(nk+nlognk):O(nk+nlog\frac{n}{k})

(3)假設快速排序算法總是從輸入數組的第一個、最後一個、和中間位置這三個元素中選擇中位數作爲基準。證明該快速排序算法最壞情況下完成排序需作不超過n24+O(n2)\frac{n^2}{4}+O(n^2)次元素間的比較。(8 分)
汪同學的解答:
在這裏插入圖片描述


















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