Lecturer: 江振瑞
Teaching Assistants (TAs):
陳學致 李佳霖 廖建凱 陳沿廷
Time: 週二 14:00~16:50
Place: 週二 工五館E6-A207
TA Class:
週二 13:00~13:50
(工五館E6-A207)
Online
Video: https://www.twitch.tv/acanlab
Offline Video: https://drive.google.com/folderview?id=1WsZopoti_c_7gKfFHerIk5iflLGsQc4_
Scoring:
- 期中考(分析與設計概念)(20%)
- 期末考(分析與設計概念)(30%)
- 程式設計作業、報告、課程參與度及程式設計競賽成績(50%)
Textbooks:
- My Book's Manuscript: book1-7AB.zip
(勘誤: page 39: 步驟5:
j <- 2i+1 改為 j <- 2i。。
圖3.4: 8'的節點編號應為#3)
- R.C.T. Lee et. al., Introduction to the Design and Analysis
of Algorithms -- A Strategic Approach (2/e), McGraw Hill,
2005.
- Thomas Cormen, Charles
Leiserson, Ronald Rivest and Clifford Stein, Introduction to Algorithms (3/e),
MIT Press, 2009.
Reference Books:
- 林大貴, TensorFlow + Keras 深度學習人工智慧實務應用, 博碩文化, 2017.
- 齊藤康毅, Deep Learning -- 用Python進行深度學習的基礎理論實作, O'REILLY, (吳嘉芳
譯, �眳p資訊出版), 2017.
- Algorithm Design: Foundations, Analysis, and Internet
Examples, Michael T. Goodrich, Roberto Tamassia, Wiley, 2002.
(有中譯本)
- Computer Algorithms, Ellis Horowitz et. al., Silicon Press,
2008.
-
中文Java程式設計 (第三版) SIM-908A , 江振瑞 著, 儒林出版社, 2006.
-
物件導向資料結構 — 使用Java語言, 江振瑞 著, 松崗圖書公司, 2005.
- Algorithms, S. Dasgupta, C. Papadimitriou and U. Vazirani,
McGraw Hill, 2008.
- Programming Challenges, Steven S. Skiena and Miguel Revilla,
Elsevier, 2003.
- The Algorithm Design Manual, Steven S. Skiena, Elsevier.
Programming:
安裝課程相關軟體及原始程式碼: Jeep7 (for
JAVA platform on Windows)
1 安裝Java Development Kit (JDK): http://java.sun.com/javase/downloads/index.jsp
2 安裝MinGW C++ Compiler
(G++):
http://prdownloads.sf.net/mingw/MinGW-3.0.0-1.exe?download
3 安裝最新Python 3 Interpreter:
https://www.anaconda.com/
4 安裝Jeep7(
Java
editor for
every
programmers v7.0)
(下載: Jeep7Setup&SourceCode.exe)
(防毒軟體會誤判為不安全軟體,但保證安全,請安心使用。)
5 設定路徑參數:
注意,這會因為你安裝上列不同軟體的不同版本而不同,也會因為你安裝的作業系統版本不同而不同。以下為針對Windows作業系統的設定:
選擇
[控制台][系統及安全性][系統][進階系統設定][環境變數],找出[path]變數並按下[編輯],並在其變數值末端加入以下內容:
;JDK安裝目
錄\bin;MinGW安裝目錄\ bin;Python安裝目錄;Jeep7安裝目錄
(例如: ;C:\Program
Files\Java\jdk-9.0.4\bin;C:\MinGW\bin;C:\Users\yourname\Anaconda3;C:\Jeep7)
6 下載範例程式(
Sample.c)(
Sample.cpp)(
Sample.java)(
Sample.py)儲
存於C:\Jeep7目錄中,按下桌面Jeep7圖示執行Jeep7軟體,並使用 [開舊檔]選項載入範例程式進行[編譯][執行]。
ACM國際大學生
程式設計 競賽 (ACM International Collegiate Programming Contest,
ACM-ICPC) (ACM-ICPC&EPC.ppt)
Syllabus:
- 1. 認識演算法 -- 從食譜到高階程式語言:
(AlgSmallTalk.pptx) (Alg-Intro.pptx) (CPSforIndustry4.0.zip) (ACM-ICPC&EPC.ppt)(CPSProject.zip)(3/3
and 3/10)
1. 演算法名稱的由來
2. 什麼是演算法?
3. 演算法的例子
4. 如何表示演算法?
5. 如何實作演算法? (EuclidGCD.c)(EuclidGCD.cpp)(EucidCGDClass1.java)(EucidCGDClass.java)(EuclidGCD.py)
6. 演算法的正確性
Homework1: (for 3/10; Due day:
before next class or TA's class)
(A)使用虛擬瑪(pseudo
code)寫一個演算法,輸入一個整數n(n>2)並並判斷n是否為質數(prime)(Write an
algorithm using the pseudo code to input an integer n and
output (decide) if n is a prime.)
(B) 使用虛擬 瑪(pseudo
code)寫一個演算法,輸入一個整數n(n>2)並輸出小於n的最大因數(factor) (Write an
algorithm using the pseudo code to input an integer n and
output the n's largest factor that is less than n.)
(C) 使用虛擬
瑪(pseudo code)寫一個演算法,輸入一個整數n(n>2)並輸出所有n除了本身以外的正因數(factor)總和
(Write an algorithm using the pseudo code to input an integer
n and output the total summation of all n's factors except n.)
(D) 使用虛擬瑪(pseudo
code)寫一個演算法,輸入整數n及m(n>m>2),輸出所有比n小並大於m的n的因數(factor)總和,若無
此因數則輸出0 (Write an algorithm using the pseudo code to input
integers n and m, and output all n's factors larger than m and
less than n.)
(E) 使用虛擬瑪(pseudo code)寫一個演算法,輸入一個整數n(n>2)並判斷n是否為完美數(perfect
number)。一個完美數是一個正整數,它所有的真因數(即除了自身以外的因數)的和,恰好等於它本身。 (Write an
algorithm using the pseudo code to input an integer n and
output (decide) if n is a perfect number. Note that a perfect
number is a positive integer that is equal to the sum of its
proper positive divisors, that is, the sum of its positive
divisors excluding the number itself.)
(F) 使用虛擬瑪(pseudo code)寫 一個演算法,輸入一個整數n(n>0)並判斷n是否為快樂數(happy
number) (Write an algorithm to input an integer n and output
(decide) if n is a happy number.)
註:
快樂數有以下的特性:在給定的進位制下,該數字所有數位(digits)的平方和,得到的新數再次求所有數位的平方和,如此重複進
行,最終結果必為1。例 如,以十進位為例:
28 → 22+82= 68 → 62+82=100
→
12+02+02=1,因此28是快樂數
- 7. 貪婪演算法(greedy algorithm):
(Alg-Greedy.pptx) (4/21)
貪婪演算法(greedy
algorithm)一步步地建構出一個問題的完整解答。其每一步都藉由貪婪解題策略(greed
strategy)增加一部份的解答到完整解答中。所謂貪婪解題策略為:
每一次都選擇當下最好的部份解答加入完整解答中。
.1 背包演算法(knapsack algorithm)
(帶出0/1背包問題後可以在之後講授NP-hard問題)
.2 活動選擇(activity
selection)演算法
.3 Huffman編碼(Huffman coding)演算法
.4 Kruskal最小生成樹(minimum spanning
tree, MST)演算法
.5 Prim最小生成樹(minimum spanning
tree, MST)演算法
Homework 7:
(A) 一個背包容量為
10,現在有5個物品, 重量分別為4、3、6、2、5,價格分別為10、9、
12、4、8,求背包能夠裝入零碎(fractional)物品的最大價值為何?
(B) 給定 5 個活動,其活動區間分別為 [0,18), [3, 5), [4, 16), [2, 9), [10,
15),請描述如何以活動選擇演算法找出最多的相容活動總數m(必須寫出m的數值)。
(C)
利用Huffman 編 碼演算法替以下字元編碼A(46%)、 B(7%)、C
(28%)、D (19%)。(備註:括號中為字元出現頻率)
(D) 利用Kruskal演算法求出以下的圖(graph)的最小生成樹 (minimum spanning tree, MST)
(E) 利用Prim演算法求出以上的圖(graph)的最小生成樹 (minimum spanning tree,
MST)
- 期中考: (時
間: 4/28 下 午2:00-3:50)(範圍: 已授課的部份)(地點:
請TA另行公佈按照座位表入座,應試請戴口罩)
教材: book1-7AB.zip(期
中考試答案以此為準)(樹搜尋與回溯演算法的標準答案則以該課程的投
影片為準)
(教材勘誤: page 39: 步驟5: j
<- 2i+1 改為 j <- 2i。圖3.4: 8'的節點編號應為#3)
- Term Project 說明與教學 (5/5)
(本周無課程作業也無程式設計作業,請同學務必把握時間觀看由助教錄製的Term
Project教學影片,儘早完成機器學習/深度學習環境安裝,並開始撰寫程式以完成Term Project)
題目: 深度學習中文手寫數字辨識
輸入: 中文手寫數字資料集(dataset)
輸出: 中文手寫數字辨識準確率(accuracy)
佔分: 總成績20%
目的: 讓學生練習使用深度學習(deep learning)模型解決中文手寫數字辨識問題。深度學習(deep learning)模型可為深度神經網路(deep neural network, DNN)、捲積神經網路(convolutional neural network, CNN)、長短期記憶(long short-term memory, LSTM)神經網路或閘控遞迴單元(gated recurrent unit, GRU)神經網路。
資料集說明: (資料集下載連結)
資料集檔案handwrite_detect.zip為中文手寫數字資料集,包含了訓練資料集(training dataset)與測試資料集(test dataset)
訓練資料共有2450筆
測試資料共有1700筆
評分項目與規範:
Source code(.py)
A short report (.pdf) (含有)
中文手寫辨識準確率(accuracy),以截圖方式呈現
Source code之逐行解釋
繳交方式: 請將所有檔案壓縮成 .zip 後,再上傳至 LMS 作業繳交區
(上傳檔名:Term_Project_學號_姓名.zip)
繳交時間: 期末考兩周後周二 20:00前截止
備註 : 切勿互相抄襲,若發現抄襲,則以0分計算
投影片: https://drive.google.com/drive/folders/1OiRiTyf5xMbHxlUEg2LUbXT9Z9GqgLZu?usp=sharing
教學影片:
演算法課程_機
器學習環境安裝之教學影片
演算法課程_Machine Learning_01_DNN
演算法課程_Machine Learning_02_CNN
演算法課程_Machine Learning_03_LSTM
演算法課程_Machine Learning_04_GRU
- 8. 動態規劃(dynamic
programming)演算法: (Alg-DP.pptx) (5/12)
動態規劃(dynamic programming)演算法籍由將原問題分解成一系列子問題
(subproblems),並依序解決子問題來解決原問題。為避免一再地解重複的子問
題,一旦解出子問題的解答(solution),即會將其存在表格(或陣列)中。當需要用到某一子問題的解答時,與其重新計算其
解答,演算法會取而代之地
從表格中直接取出其解答以節省計算時間,是一個「以空間換取時間」的演算法。一個動態規劃演算法會先從最簡單的子問題先解起,並
以一定的程序持續運行直至 求出原問題解答為止。
最佳解原則(Principle of optimality):
假設為了解決一個問題,我們必須作出一系列的決策 D1, D2, …,
Dn。若這一系列的決策是最佳解,則針對於前n-k個(或最後n-k個)決策所產生的狀態(子問題)而言,最後的k個(或前k個)決
策(1<= k<=n)必定也是最佳的。
*最長共同子序列(longest common
subsequence, LCS or LCSS)演算法
*最小編輯成本 (Minimum Edit Cost, MEC)演算法
*0/1背包動態規劃演算法(0/1 knapsack dynamic programming
algorithm)
*子集合加總(subset sum)動態規劃演算法
*(複習)多項式及偽多項式時間演算法
*最大連續子序列和(maximum contiguous subsequence sum, MCSS)動態規劃演算法
Homework 8:
A. 說明X=ABCBA與Y=BDCA兩個字串藉由動態規劃演
算法求出最長共同子序列的過程。
B. 設計一個演算法,可以產生一個給定集合S的所有可能子集合。
C. 設計一個演算法,可以輸入長度為m的序列X及長
度為n的序列Y,輸出true或是false,分別
代表X是或不是Y的子序列。
D.
給定一個0/1背包問題如下;背包荷重W=12,且4個物品其重量各為6、4、5、3,其價值各為20、30、40、10,說明藉由動態規劃演算法
解決此0/1背包問題的過程。
E. 以子集合加總動態規劃演算法解決以下子集合加總問題: 給定整數集合S={1, 2, 4,
7}及整數c=10。
F.
修改子集合加總動態規劃演算法使其傳回加總值為c的子集合若此子集合存在;否則傳回空集合。
G. 令S = (-2, 1, -3, 4, -1, 2, 1, -5, 4), 使用動態規劃演算法求出最大連續非空子
序列和。
H. 設計最大連續可空子序列和動態規劃演算法。
- 9.
使用貪婪(greedy)演算法以及動態規劃(dynamic programming)演算法解決最短路徑問題: (Alg-SP.pptx) (5/19)
(請
同學注意: 為使說明更清楚,本次課程投影片在課程錄影之後有些修改,例如,"負
迴圈"改為"負循環"等,在期末考試時以網頁說明及投影片的內容為準。)
由加權有向圖(weighted digraph)中的某個頂點或節點 (vertex or
node)v到圖中的另一節點u,若v到u之間存在一條路徑(path),則路徑中所經過的邊(edge)的權值(weight)總合稱為路徑的成本
(cost)或距離(distance),而所有路徑中具有最小成本或距離的路徑則稱為最短路徑(shortest
path)。
著名的最短路徑演算法包括:
(1) 多階圖最短路徑演算法(使用動態規劃解題策略)
(2) Dijkstra演算法(使用貪婪解題策略)
(3) Bellman-Ford演算法(使用動態規劃解題策略)
(4) Floyd-Warshall演算法(使用動態規劃解題策略)
Homework 9:
A.
使用動態規劃演算法求以下多階圖的最短路徑。

B.
利用Dijkstra演算法求以下圖(graph)頂點4到各頂點的最短路徑(shortest
path)及其距離(成本)。

C. 承上題,利用Dijkstra演算法求頂點1到各頂點的最短路徑(shortest
path)及其距離(成本)。
D.
畫圖說明利用利用Floyd-Warshall演算法求以下圖(graph)全對最短路徑(all-pair shortest
path)距離(成本)(此圖的啟始距離矩陣如下,以經過的中間節點為s, a, b, c, d的順序寫出距離矩陣的改變過程。)
(d->b的加權在圖形與表格中誤植為不一致的值,同學可以將之改為5或6讓圖形與表格一致後解題都算答對。)
E.
求出以下給定圖(graph)的Floyd-Warshall演算法的啟始前節點矩陣(陣列),並求出最後的前節點矩陣(陣列)。
F.
以下是Floyd-Warshall演算法針對具有五個節點(記為1、2、3、4、5)的圖產生的前節點矩陣(陣列),說明如何藉以
找出節點1到節點3的 最短路徑,及節點5到節點2的最短路徑。
G. 針對以下的給定圖,列出Bellman-Ford最短路徑演算 法執行過程, 說明Bellman
-Ford最短路徑演算法如何檢查出一給定圖具有負循環(negative-weight cycle)。

- Introduction to Software Defined
Networking (SDN) Multicast (SDN-Multicast.pptx)
(Optional)
- 10.
分支定界(Branch and
Bound)演算法 (Branch&Bound.zip)
(Youtube video Part1: https://youtu.be/KUlDxRV6fsU)(Youtube video Part2: https://youtu.be/R91wC81n6Yk)
(5/26)
*分支定界(branch and bound)是一個拜 訪與拓展解
答空間樹的特殊方法,用於找出問題的最佳解。其做法相當於找出一種方法來切割出解答空間的分支(branch),然後以上界
(upper bound)與下界(lower bound)的概念來加快最佳解的搜尋。
*對於尋找最小成本(minimum
cost)解答的最佳化問題而言,分支定界演算法會針對每一分支的解答預測其成本下界(lower
bound),並利用找出可行解來得到問題的成本上界(upper
bound)。如果有一個解答的成本下界超過問題成本上界,則這個解不可能是最佳的,因此演算法會中止(terminate)與
這個解相關聯的整個分支的 搜尋。
*而對於尋找最大利益(maximum
benefit)解答的最佳化問題而言,分支定界演算法會針對每一分支的解答預測其利益上界(upper
bound),並利用找出可行解來得到問題的利益下界(lower
bound)。如果有一個解答的利益上界低於問題利益下界,則這個解不可能是最佳的,因此演算法會中止(terminate)與
這個解相關聯的整個分支的 搜尋。
.1 基本概念
.2 分支定界演算法(配合登山搜尋法)解決多階圖最短路徑問題
.3 分支定界演算法(配合最佳優先搜尋
法)解決旅行推銷員問題
.4 分支定界演算法(配合最佳優先搜尋
法)解決0/1背包問題
.5 一個特殊的分支定界演算法: A*演算法
Problem Set 10:
A.
以分支定界演算法解決以下多階圖最短路徑問題。
B.
給定一0/1背包問題,其背包可載重C=10,且有三物品的重量分別為10, 3, 5,而其利潤分別為40, 20,
30,求出可以放入背包中物品利潤的負值的最小化,使用分支定界演算法來解此0/1背包問題。 (註:
必須畫出搜尋樹)(此題使用負的目標函數值,因此feasible solution是求出upper bound,而且我們不斷
地嘗試降低upper bound)
C. 同上 題,但目標改為求 出可以放入背
包中物品利潤的最大化,使用分支定界演算法來解此0/1背包問 題。 (註:
必須畫出搜尋樹)(此題使用正的目標函數值,因此feasible solution是求出lower
bound,而且我們不斷地嘗試提高lower bound)
D.
使用A*演算法來解以下之多階圖最短路徑問題。(註: 必須畫出搜尋樹)
E. 將A題的S與T對調,箭頭反向解題。
F. 將B題所有成本乘以2減3解題。
G. 將C題的物品重量改為20, 5, 6解題。
H. 將D題的V0與V8對調,箭頭反向解由V8到V0的最段路徑問題。
以下改為實體上課,但是上課實況依然錄影上傳。
- 11. 問
題下界與問題分類: P、NP、NP困難與NP完全問題 (6/2)
*一個問題
的下界為任何能解決此問題的演算法至少所需的時間複雜度。(The
lower
bound
of a problem is the least time complexity required for any
algorithm which can be used to solve this problem.)
*NP完全問題理論:
若任何一個NP完全問題可在多項式時間被解決,則每一個NP問題皆可在多項式時間獲得解決(也就是P=NP)。
If any one NP-complete problem can be solved in polynomial
time, then every problem in NP can also be solved in
polynomial time (i.e., P=NP). (ProblemLB.zip)(Recipe, Cook and Carp)(NPC.zip)
*(NPC理論測驗及解答)
Problem Set 11:
A. 以下的敘述是對還是錯,並解釋對或錯的原因:
若我們能證明任何一個 NPC問題的最壞狀況問題下界(worst case problem lower
bound)是指數函數量級,則我們已經證明 NP不等於P。
B. 以下的敘述是對還是錯,並解釋對或錯的原因:
若我們能證明任何一個 NPC問題的最壞狀況問題下界(worst case problem lower
bound)是多項式函數量級,則我們已經證明 NP等於P。
C. 以下的敘述是對還是錯,並解釋對或錯的原因:
若我們能直找到一個確定性演算法,在最差狀況下以多項式時間複雜度解決一個NPC問題,則我們已經證明NP等於P。
D. 以下的敘述是對還是錯,並解釋對或錯的原因:
人們已經證明: 沒有任何確定演算法(deterministic algorithm)可以在最差狀況(worst
case)下,以多項式時間複雜度解決NPC問題。
E. 以下的敘述是對還是錯,並解釋對或錯的原因:
人們已經證明: 沒有任何確定演算法(deterministic algorithm)可以在最差狀況(worst
case)下,以多項式時間複雜度解決NP-hard問題。
F. 以下的敘述是對還是錯,並解釋對或錯的原因:
任何NPC問題可以polynomially reduces to另一個NPC問題。
G. 證明支配集問題(dominating set problem)為NP問題。證明支配集問題(dominating set
problem)為NP問題。
H. 證明點覆蓋問題(vertex cover problem)為NP問題。
I. 證明集團問題(clique problem)為NP問題。
J. 證明著色問題(chromatic coloring problem)為NP問題。
K. 證明0/1 背包問題(0/1 knapsack problem)為NP問題。
L. 證明3-滿足問題(3-SAT problem)為NP問題。
M. 證明最大割問題(Max cut problem)為NP問題。
N. 證明史坦惹樹問題(Steiner tree problem)為NP問題。
O. 證明劃分問題(partition problem)為NP問題。
P. 證明擊中集合問題(hitting set problem)為NP問題。
Q. 證明三維匹配問題(3-dimensional matching problem)為NP問題。
- 12.
最小成本最大流量演算法(Minimum-Cost Maximum-Flow
Alg., Min-Cost Max-Flow Alg., MCMF Alg.)(MCMF-New.zip)
(Optional)
應用 實例 1: Paper: Yung-Liang Lai and
Jehn-Ruey Jiang, "Sink-Connected Barrier Coverage Optimization
for Wireless Sensor Networks," in Proc. of 2011 International
Conference on Wireless and Mobile Communications (ICWMC 2011),
2011. (Slides)
應用實例 2: Paper: Yung-Liang Lai, and Jehn-Ruey Jiang, "Barrier
Coverage with Optimized Quality for Wireless Sensor Networks,"
in Proc. of the 15th International Symposium on Wireless
Personal Multimedia Communications Symposium (WPMC'12), 2012.
(Slides)
應用實例 3: Jehn-Ruey Jiang,
Guan-Yi Sung, and Jih-Wei Wu, "LOM:
A Leader Oriented Matchmaking Algorithm for Multiplayer
Online Games," in Proc. of International
Conference on Internet Studies (NETs 2015), 2015.
(Distinguished Paper Award)(LOM.ppt)
*匈牙利演算法(Hungarian
Algorithm)(HungarianAlg.zip)(6/9)
Problem
Set
12: (Optional)
A.以Ford-
Fulkerson演算法 (搭配Hill-Climbing
Search)解決以下最大流量問題(圖的有向邊(directed edge)上所標示的為容量(capacity))
B. 以Edmonds
-Karp演算法解決以下最大流量問題(圖的有向邊(directed edge)上所標示的為容量(capacity))
C.
自行設計一個流網 (flow
network)(除s、t外具有4個節點,並具有10個edge),以Edmonds-Karp演算法解決
其最大流量問題。
D.
完成投影片p30之Bellman-Ford演算法檢測負加權循環範例到iteration 8
E. 完成投影片
p30之Bellman- Ford演算法檢測負加權循環範例到iteration 8,並加入predecessor註記
F. 說明如何detect投影片p30之負加權循環
Problem Set 12: (*A
and *B for 6/9)
*A. 使用匈牙利演算法(Hungarian
algorithm)來解以下的指派問題(assignment problem)(註:
必須寫出演算法執行過程中的每個中間結果)
|
Task A
|
Task B
|
Task C
|
Tim
|
$1
|
$2
|
$3
|
Bob
|
$2
|
$3
|
$2
|
Alex
|
$2
|
$2
|
$3
|
*B. 自行設計一個指 派問題(assignment
problem)的4x4成本矩陣,並以匈牙利演算法(Hungarian
algorithm)找出最大權重完美二分匹配(Maximum-Weight Perfect Bipartite
Matching)。
C. 說明如何使用匈牙利演算法(Hungarian
algorithm)解決最小歐氏平面權重配對(Minimum Euclidean Weighted
Matching)問題。所謂最小歐氏平面權重 配對問題描述如下:
給定n個點(n為偶數),如何將此n個點匹配形成n/2個點對,讓每個點對形成一條線段,而此n/2條線段具有最小的長度總和。
D. 隨意畫出四個歐氏平面點(2D
point),設其距離皆為整數(以公分計算),以匈牙利演算法(Hungarian
algorithm)找出其最小歐氏平面權重配對(Minimum Euclidean Weighted
Matching)。
E.
說明如何將匈牙利演算法能夠解答的最
小成本指 派問題(assignment problem)變轉為(reduce to)最大流問題
F. 將以 下最小成本指 派問題(assignment problem)轉換為流網(flow
network),以便使用最大流(max-flow)演算法解決之
|
Task 1
|
Task 2
|
Task 3
|
Carl
|
$24
|
$28
|
$24
|
Bob
|
$26
|
$32
|
$28
|
Alex
|
$24
|
$28
|
$30
|
- 13. (Optional) 近似演算法
(Approximation algorithms) (ApproximationAlgorithm.zip)
歐拉旅途演算法 (Eulerian Tour Algorithm) (EulerianTour.zip)
定理一
*連通的無向圖G有歐拉路徑的充要條件是: G中奇頂點(連接的邊數量為奇數的頂點)的數目等於0或者2。
*連通的無向圖G是歐拉環(存在歐拉迴路)的充要條件是: G中每個頂點的度都是偶數。
定理二
*一個連通的有向圖可以表示為一條從頂點 u到 v的(不閉合的)歐拉路徑的充要條件是:
u的出度(從這個頂點發出的有向邊的數量)比入度(指向這個頂點的有向邊的數量)多1,
v的出度比入度少1,而其它頂點的出度和入度都相等。
*一個連通的有向圖是歐拉環(存在歐拉迴路)的充要條件是:每個頂點的出度和入度都相等。
Problem
Set
13:
A. 使用2-近似演算法(2-approximation algorithm)來解決以下圖的頂點覆蓋問題(vertex cover problem)。(註: 須描述在執行演算法過程的每個中間結果。)
B. 使用歐拉旅途演算法來找出以下圖的歐拉旅途。(註: 須描述在執行演算法過程的每個中間結果。)
C. 將以自然語言撰寫的「無向圖歐拉旅途/路徑演算法」改為以虛擬碼撰寫
D. 以自然語言撰寫「有向圖歐拉旅途/路徑演算法」
E. 以虛擬碼撰寫「有向圖歐拉旅途/路徑演算法」
F. 分析兩個演算法的時間複雜度