文章目錄
算法導論:
鏈接:https://pan.baidu.com
/s/1nXzwVML3V_FFnQHGFfBcYg
提取碼:50pq
民間QQ羣:807064328
基礎知識與結論
①:
滿二叉樹就是每個節點要麼沒有兒子,要麼有兩個兒子;當葉子節點增加兩個兒子時,葉子節點增加兩個,並且剛剛的葉子節點變成了中間節點,所以相當於中間節點和葉子節點都同時增加1,而最開始的情況的時候,就是隻有1個根節點,相當於葉子節點爲1,中間節點爲0,而向以後發展兩種節點增加的速度是一樣的,所以總是相差1
②:
前序遍歷:根左右
中序遍歷:左根右
後序遍歷:左右根
③:漸進號
:最壞時間複雜度
:最好時間複雜度
:包含最好最壞複雜度(好像不太對)
:感覺就是數學裏的高階無窮小的意思
真題
一.判斷題(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
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次,但是一共只會比較 輪,總共就是
試了一下,爲啥優化後反而時間還長了喃(T▽T),哦好像是產生的隨機數太好了,如果換成遞減數列,標答的方法就體現出來了~
改了一下,僅使用
第三種方法是有位同學提出來的,我覺得很有道理。。。
#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 開始):
我覺得是
(2)用兩個數組將上述給定的數組中的數據表示成一個單鏈表(需保持數據在原數組中的順序),在兩個數組中填寫對應的信息(提示:其中一個數組存放關鍵字,另一個存放對應的指向下一個關鍵字的指針,用“/”表示 NULL 指針)。(5 分)
汪同學的答案,注意索引是從0開始滴:
(3)在以上兩個數組表示的鏈表中去掉關鍵字 K3,畫出去掉之後兩個數組的狀態(不被鏈表佔用的空格留空)。(5 分)
同樣是汪同學的答案:
(4)根據 (3)的結果,只給定了 K4 在關鍵字數組裏的索引,要求把 K4 用時間複雜度從鏈表中刪除,畫出刪除後的兩個數組狀態。(5 分)
這道題確實應該是這樣的,因爲題目說了要的複雜度,感謝羣裏的童鞋~
然後我才知道闊以刪除鄰接表的邊,以前都沒想過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}中的所有整數的一個排列來表示。對這樣的輸入,推導這個算法的漸近時間複雜度,用來表示。(8 分)
解:
每次選的最左邊的數都是最大的
所以最壞情況就是
的推導:
網上看到滴:
且
(2)作爲一個遞歸算法,快速排序算法一般要對很多小的子數組進行遞歸調用,從而影響了時間效率。 而插入排序算法在小數組上運行效率很高。描述一個修改快速排序算法的方法,利用插入排序算法來解決上述的問題。假設插入排序算法處理的每一個子數組的長度不超過 k 個元素。推導證明這個修改過的快速排序算法的平均時間複雜度是
O(nk + n lg(n / k))。(9 分)
解:
因爲數組長度最少變成了,所以快排只會遞歸次,每次的排序都是的,因此整個快排的過程是的。然後長度爲的插入排序是的,有坨,因此是
所以整個排序時間是
(3)假設快速排序算法總是從輸入數組的第一個、最後一個、和中間位置這三個元素中選擇中位數作爲基準。證明該快速排序算法最壞情況下完成排序需作不超過次元素間的比較。(8 分)
汪同學的解答: