###### tags: `Algorithm` `test` # 期末考重點 ## 1.最佳子結構(DP問題) 若一個問題可以用於子問題相同的解法來解,亦即局部最佳解能決定全域的解,則稱此問題為最佳子結構。 例子:matrix-chain multiple、rod cutting、shortest path ### shortest path有最佳子結構 ![](https://i.imgur.com/vxi1Z5x.png) - 當$p$是$u$到$v$的最短路徑。 - $w$為$p$上的任意一點 - $p1$為$u$到$w$,是$p$的一部份 - 當$p_1$是$u\rightsquigarrow w$的最短路徑 證明: 假設$u$到$w$存在一個最短路徑$p_1'$。用$p_1'$代替$p_1$可得到包含$p_1'$的新路徑會比原本的$p_1$短。 ### longest path 沒有最佳子結構 ![](https://i.imgur.com/NabdUt5.png) - 子路徑$q$到$r$是$q\rightarrow r$ - 簡單最長路徑$q$到$r$是$q\rightarrow s\rightarrow t\rightarrow r$ - 子路徑$r$到$t$是$r\rightarrow t$ - 簡單最長路徑$r$到$r$是$r\rightarrow q\rightarrow s\rightarrow t$ 結合上述的簡單最長路徑可得 $$q\rightarrow s\rightarrow t\rightarrow r\rightarrow q\rightarrow s\rightarrow t$$ 它並不是簡單路徑。 ## 2.背包問題(Greedy Algorithm) ### 01背包問題 - 為NP-complete問題 - 沒有greedy choice - 找出最有價值的子集合,總重量為$weight\le W$,W為背包可承受的重量。 ### 分數背包問題 - 有最佳子結構 - 有 greedy choice - 解決此問題,需要比較各個項目的$\frac{value}{weight}$:$\frac{v_i}{w_i}$ - 使得$\forall i,\frac{v_i}{w_i}\geq \frac{v_{i+1}}{w_{i+1}}$ ## 3.圖 ### 廣度優先搜尋 - 為了方便追縱進度,所有頂點將會分成3類,尚未拜訪時是白色,拜訪過後但周圍鄰居尚未拜訪完時顏色為灰色,鄰居全被拜訪過後顏色轉為黑色。 - 時間複雜度:$O(V+E)$ - 應用:二分圖測試、最短路徑演算法 ### 深度優先搜尋 - 使用DFS時,邊分為Tree edge, Back edge, Forward edge, Cross edge - Edge(u, v)可用顏色做判斷,當此邊是第一次探索時,若color(v)為 1.white $\Rightarrow$ (u, v)是tree edge 2.gray $\Rightarrow$ (u, v)是Back edge 3.back $\Rightarrow$ (u, v)可能是: &emsp;(1)$if(d[u]<d[v])$(u比v早探索):Forward edge &emsp;(1)$if(d[u]>d[v])$(u比晚探索):cross edge - 無向圖中只有tree edge和back edge - 有back edge $\Rightarrow$ 有cycle - 應用: 1.強連通: &emsp;(1)call DFS(G) to compute finish times $u.f$ for each vertex u. &emsp;(2)creat $G^T$ &emsp;(3)call DFS($G^T$), but in the main loop of DFS, consider the vertices in order of decreasing $u.f$(as compute in line 1) &emsp;(4)output the vertices of each tree in the depth-first forest formed in line 3 as a seperate strongly connected component 2.拓撲排序: &emsp;(1)Call DFS(G) to compute finishing time $f(v)$ for each vertex $v$ &emsp;(2)As each vertex is finished, insert it onto the front of a link list. &emsp;(3)Return the link list of vertices. ## 4.最小生成樹 當一張圖的所有點完全連通,稱為生成樹(spanning Tree) 當點與點不完全連通,稱為生成森林(spanning forest) 而生成樹的每條邊都有權重,權重總和最小為最小生成樹 ### 定義: - 有$|V|-1$條邊 - 沒有cycle - 不一定唯一 ``` Generic-MST(G, w){ A = 0; while(A doesn't form a spanning tree){ find an edge(u, v) that is safe for A A = A union{(u, v)} } return A } ``` 若$A$是$MST$的子集合,$(u,v)$是$A$中一條safe的邊,iff $A\cup{(u,v)}$也是$MST$的子集合,所以只加入safe邊 ### 名詞解釋: - cut:$(S, S-V)$為$G(V, E)$的一部份 - cross:若存在一條edge$(u, v)$其中一點在$S$另外一點在$S-V$則稱之 - respect:若有一個set A沒有cross的情形,則稱之 - light edge:若某個cut的某條邊擁有全村最小的weight,則稱之 ### 演算法: Prim's algorithm 步驟: 1.將任意節點加入樹中 2.選擇與樹距離最近的節點並加入,反覆直到所有節點都在樹中 Kruskal's algorithm 1.將所有邊由小到大排序 2.從最小的開始,選擇不會形成環的路線,直到連接所有點 ## 最短路徑演算法 ### Bellman-Ford 和 Dijkstra之比較 | 演算法名稱 | 假設條件 | 時間複雜度 |策略|優點| | -------- | -------- | -------- |-------- |---------| | Bellman-Ford | 邊的加權值可為負,不能有負cycle | $O(n^2)$ $(有查到O(VE))$ |Dynamic-progamming|可用分布式的方式實現及加權值可為負| | Dijkstra | 邊的加權值不可為負,不能有負cycle | $O(n^3)$ $(有查到O(E*logV))$ |Greedy 阿葛|速度較快| ## All pairs shortest path ### 重新設計的理由 - Bellman-Ford在解決All pairs問題效率太差 - Dijkstra不能解決負加權值的問題 ### 策略 - 加入中繼點的概念考慮點$u$和點$v$的最短路徑是否因為加入了中繼點降低成本。 ## NP問題 ![](https://i.imgur.com/Y5Ym0A2.png) - P:在多項式時間內可以檢查並解決的問題 - NP:在多項式時間內可以檢查的問題 - NP-C:在多項式時間內難以檢查且最複雜的問題 ### NP-C問題 ![](https://i.imgur.com/RBV5rJj.png) 1.Circult SAT(布林滿足問題) 判斷一組給定的布林函數,是否能找到一組input讓其為true 應用:EDA領域(電子設計自動化)的測試、驗證 2.Subset Sum(子集合問題) 給一組集合與指定數字,能否找到全部的子集合相加剛好等於指定數字 ex:集合{7, 5, 9, 6, 2}中,能否找到子集合加總=18的組合 Ans:{7, 5, 6} 3.TSP(Travelling salesman problem, 旅行商問題) 給定城市與城市之間的距離,求解經過每一座城市並回到起始點的最短迴路 應用:DNA測序