《演算法設計與分析》期末複習精簡版
阿新 • • 發佈:2019-01-28
期末考試形式全為大題,重點在於概念的掌握和方法的描述,所以再根據考點進行比較概念層面的複習
第一章
1、演算法具有四個屬性:
有輸入,有輸出,確定性,有窮性
第二章
一、分治法
> 分治法的設計思想: 將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
> 分治法能解決問題的特徵:
該問題的規模縮小到一定的程度就可以容易地解決;
該問題可以分解為若干個規模較小的相同問題,即該問題具有最優
子結構性質利用該問題分解出的子問題的解可以合併為該問題的解;(重要條件!)
該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。
二、遞迴
> 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。
> 每個遞迴函式必須有非遞迴定義的初始值
> 邊界條件與遞迴方程是遞迴函式的二個要素,遞迴函式只有具備了這兩個要素,才能在有限次計算後得出結果
三、二分搜尋(找出中間元素比對,二分搜尋陣列)
> 演算法複雜度分析:每執行一次演算法的while迴圈, 待搜尋陣列的大小減少一半。因此,在最壞情況下,while迴圈被執行了O(logn) 次。迴圈體內運算需要O(1) 時間,因此整個演算法在最壞情況下的計算時間複雜性為O(logn) 。
四、快速排序
> 最壞時間複雜度: O(n2). 平均時間複雜度: O(nlogn). 輔助空間: O(n)或O(logn)
第三章
一、動態規劃
> 動態規劃演算法的基本要素:最優子結構和重疊子問題
> 動態規劃演算法思想:與分治法類似,其基本思想也是將待求解問題分解成若干個子問題
二、矩陣連乘
> 計算量: A[i:k]的計算量加上A[k+1:j]的計算量,再加上A[i:k]和A[k+1:j] 相乘的計算量
m[i,j] = m[i,k] + m[k+1,j] + p^(i-1)p^kp^j
> 特徵:計算A[i:j]的最優次序所包含的計算矩陣子鏈 A[i:k]和A[k+1:j]的次序也是最優的。矩陣連乘計算次序問題的最優解包含著其子問題的最優解。這種性質稱為最優子結構性質。
> 演算法複雜度分析:演算法matrixChain的主要計算量取決於演算法中對r,i和k的3重迴圈。迴圈體內的計算量為O(1),而3重迴圈的總次數為O(n3)。因此演算法的計算時間上界為O(n3)。演算法所佔用的空間顯然為O(n2)。
三、0-1揹包(動態規劃)
> 演算法複雜度分析: O(nc).改進後演算法的計算時間複雜性為O(2^n)
四、最優二叉樹
> 定義:
(1)若它的左子樹不空,則左子樹上所有
節點的值均小於它的根節點的值;
(2)若它的右子樹不空,則右子樹上所有
節點的值均大於它的根節點的值;
(3 它的左、右子樹也分別為二叉排序樹
> 時間複雜度:O(n2)
五、貪心演算法
> 定義:貪心演算法總是作出在當前看來最好的選擇。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的區域性最優選擇。
> 性質:貪心選擇性質和最優子結構性質。
> 和動態規劃的區別:動態規劃演算法通常以自底向上的方式解各子問題,而貪心演算法則通常以自頂向下的方式進行
第四章
一、哈夫曼編碼
> 定義:給出現頻率高的字元較短的編碼,出現頻率較低的字元以較長的編碼,可以大大縮短總碼長。
> 時間複雜度:為O(nlogn) 。
二、 最小生成樹
1、Prim演算法
> 定義:根據已更新的資料選取最短路徑
> 時間複雜度: O(n^2)
2、 Kruskal演算法
> 定義:選擇最小的邊,但是不成圈
> 時間複雜度:當圖的邊數為e時,Kruskal演算法所需的計算時間是O(eloge) 。
第五章
一、回溯法(深度優先搜尋策略)
> 解空間:對於問題的一個例項,解向量滿足顯式約束條件的所有多元組,構成了該例項的一個解空間。
n=3時的0-1揹包問題用完全二叉樹表示的解空間
> 定義:具有限界函式的深度優先生成法稱為回溯法
> 剪枝函式:用約束函式在擴充套件結點處剪去不滿足約束的子樹;用限界函式剪去得不到最優解的子樹。
二、N後問題
> 定義:在n×n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上
解向量:(x1, x2, … , xn)
顯約束:xi=1,2, … ,n
隱約束:
1)不同列:xixj
2)不處於同一正、反對角線:|i-j||xi-xj|
> 注意:解空間存在4^4種可能的解!必須使用剪枝函式
三、0-1揹包(回溯法)
> 解空間:子集樹.上界函式:cp+rbestp
四、旅行售貨員問題(回溯法)
> 解空間:排列樹
> 複雜度分析:整個演算法的計算時間複雜性為O(n!)。
五、回溯法效率分析
> 回溯演算法的效率在很大程度上依賴於以下因素:
(1)產生x[k]的時間;
(2)滿足顯約束的x[k]值的個數;
(3)計算約束函式constraint的時間;
(4)計算上界函式bound的時間;
(5)滿足約束函式和上界函式約束的所有x[k]的個數。
> 在選擇約束函式時通常存在生成結點數與約束函式計算量之間的折衷
第六章
一、分支限界法
> 定義:
(1)求解目標:回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優解。
(2)搜尋方式的不同:回溯法以深度優先的方式搜尋解空間樹,而分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹。
> 常見的兩種分支限界法:
(1)佇列式(FIFO)分支限界法(佇列先進先出(FIFO))
(2)優先佇列式分支限界法(選取優先順序最高的節點成為當前擴充套件節點)
二、0-1揹包(分支限界法)
> 首先,要對輸入資料進行預處理,將各物品依其單位重量價值從大到小進行排列。節點的優先順序由已裝袋的物品價值加上剩下的最大單位重量價值的物品裝滿剩餘容量的價值和。
三、旅行售貨員(分支限界法)
> 定義:演算法開始時建立一個最小堆,用於表示活結點優先佇列。堆中每個結點的子樹費用的下界lcost值是優先佇列的優先順序。接著演算法計算出圖中每個頂點的最小費用出邊並用minout記錄。如果所給的有向圖中某個頂點沒有出邊,則該圖不可能有迴路,演算法即告結束。如果每個頂點都有出邊,則根據計算出的minout作演算法初始化。
第七章
一、隨機化演算法
> 定義:允許演算法在執行過程中隨機選擇下一個步驟,不做最優決策。複雜度低。
二、隨機數(線性同餘法)
> 定義:在現實計算機上無法產生真正的隨機數,因此在隨機化演算法中使用的隨機數都是一定程度上隨機的,即偽隨機數。
數值隨機化演算法(求圓周率、定積分)
double Darts(int n) {
//用隨機投點法計算π值
static RandomNumber dart;
int k = 0;
for (int i = 1; i <= n; i++) {
double x = dart.fRandom();
double y = dart.fRandom();
if ((x*x + y*y) <= 1) k++;
}
return 4 * k / double(n);
}
double Darts(int n) {
//用隨機投點法計算定積分
static RandomNumber dart;
int k = 0;
for (int i = 1; i <= n; i++) {
double x = dart.fRandom();
double y = dart.fRandom();
if (y <= f(x)) k++;
}
return k / double(n);
}