### algorithm overview - [algorithm overview](https://hackmd.io/fRiBP7u1S_yE8k_5GxAPnQ?both) - [complexity](/6LLQEyeaRjCahtEV3ov7lA) ## graph ### graph - [graph](/i0FmQWK_SlqKRVYh0wBKvg) ### MST - [prim](/D3YP4moJSraEm--lzp3jLg) ### shortest path - [floyd-warshall](/oI7JbjBuQdWOR3e5_wc6fw) ## NP related [Theory of NP-Completeness](/qm8Hauf4Tnmi8oOd_Euo5A) ## other - [huffman_coding](/asv43zitSnmddCu_GDkvDQ) ## 期末 ### 計畫/開銷的最佳化 點 $i,j$ => 代表 (計畫,開銷),開銷可為 0,如果開銷過大,則轉移的邊權重為 0,意味著用光,無收益。 邊 $a$ => 代表收益 有兩虛擬點 $S,T$,代表開始結束 一條路徑的邊收益總和,就是一種方法。 ### 最長共同子序列 字串 $a,b$ 其中,$a,b$ **最長的** **不一定連續的** **共有的** 字串 LCS 是什麼?LCS 非唯一。 $L_{i,j} = \begin{cases} x_i = y_i \rightarrow 1 + L_{i-1,j-1} \\ x_1 \neq y_i \rightarrow \max(L_{i-1,j}, L_{i,j-1}) \end{cases}$ 可以畫成 array_2d,圖中可以看到有幾個 LCS。 $a = x$ 軸 $b = y$ 軸 $x=0, y=0$ 被跳過,從 $1$ 開始 ,不然 $a,b$ 會搶 $[0][0]$ ### NP 問題 #### **P** => $O(n^c)$ 內算完 排序問題 (Sorting) $O(n \log n)$ 最短路徑 最長共同子序列 (LCS) $O(nm)$ 最大流 #### **NP** => $O(n^c)$ 內驗證 關係: $P \subseteq NP$ 0-1 背包 (0-1 Knapsack) #### **NP-Complete (NPC)** => 任何 NP 都能在 $O(n^c)$ 內變成 NPC 的問題 關係: $NPC \subseteq NP$ >人類尚未解出任何 NPC 問題的多項式時間演算法,只證明他是 NPC。 所有 NPC 問題之間都存在「多項式歸約(Polynomial-Time Reduction)」的關係 把一個 NP 問題 A,快速轉換(只花多項式時間)成另一個問題 NPC 的輸入,使得解 NPC 可以幫你解出 A。 著色問題 (Graph Coloring) 旅行銷售員問題 (TSP) 邏輯滿足問題 (SAT) 頂點涵蓋 (Vertex Cover) #### P=NP 意思是找答案跟證明正確一樣難。 目前人類相信 $P \neq NP$(直覺上找答案更難),但還沒有證明。 ### Boyer-Moore (需建立 L(x), LastOccurrence function) $T$ 目標字串 $P$ 匹配字串 左到右 從 (T最後一個字符) = (P最後一個字符) 比較 遇到不匹配的 Case 1 => (當前 T) 存在於 \(P 後方) 如: ``` v ??xa xcba => v xa?? xcba ``` 把 (當前 T) 對齊到 (P 存在當前 T) 的位置 Case 2 => (當前 T) 存在於 \(P 前方(已比較的)) 如: ``` v ?xax cwax => v xax? cwax ``` P 往右一格 Case 3 => No x in P 如: ``` v ??xa dcba => v xa??? dbba ``` 把 P[0] 對到 i+i (當前比較的右邊) #### 範例 a_par **t** t **e** rn_m **a** tchi **n** g_al **g** o **rithm** rithm (t,m) Case 1, move to p(t) (e,m) Case 3, move to i+1 (a,m) Case 3, move to i+1 (n,m) Case 3, move to i+1 (g,m) Case 3, move to i+1 (h,m) Case 1, move to p(m) (m,m), (h,h), ..., (r,r) good, finished #### L(x) (Last Occurrence Function) P="abcabc" A={a,b,c,d} L(x) 是最後一次該 x 出現的位置,沒出現以 -1 代表,長度為 |A|。 ### KMP 演算法(需建立 F(k), Failure function) 左字符到右字符比 複雜度 $O(|T|+|P|)$ 範例: p = abcdabc prefix\(p) = a, ab, abc, abcd suffix\(p) = c, bc, abc, dabc abc 是重複出現了 想法是前綴是否出現在 p 中 lps table (Longest Proper Prefix ) abcdabeabf 0000120120 在 p 中找 p[i] = p[0] ,如果成立,找 p[i+1]=p[1],對每個都這樣做 abcdeabfabc 00000120123 aaaabaacd 012301200 p[1] = p[0] p[2] = p[1] p[3] = p[2] t = ababcabcabababd p = ababd lps = 00120 ``` v ababcabcabababd ababd => 匹配直到錯 v ababcabcabababd ababd => lps(v-1=b) => lps(b)=2 => 2 = a v ababcabcabababd ababd => lps(v-1=b) => lps(b)=0 => No v ababcabcabababd ababd => 匹配直到錯 v ababcabcabababd ababd => lps(v-1=b) => lps(b)=0 => No v ababcabcabababd ababd => 匹配直到錯 v ababcabcabababd ababd => lps(v-1=b) => lps(b)=2 => 2 = a v ababcabcabababd ababd => 匹配到結束,成功 ```
{"title":"algorithm","description":"algorithm overview","contributors":"[{\"id\":\"ef76cbf4-dcda-4e4e-a6de-7d30ded912a1\",\"add\":3636,\"del\":612}]"}
Expand menu