Lecturer: 江振瑞
Teaching Assistants (TAs):
王昱傑 顏暐翰 高子豪
Time: 週二 14:00~16:50
Place: 週二 工五館(E6) A207
TA Class:
週二 13:00~13:50
工五館(E6)A207
Sign-In Form (若採線上授課之簽
到單): https://forms.gle/BJjEWro4hF3jG4yb8
(請同學於13:45-14:15進行簽到)
Online Course Link (若採線上授課之課
程鏈結):https://ncu-edu.webex.com/meet/pr110522039
Offline Video List: Link
請大家先觀看之前的課程介紹影片:
https://youtu.be/1muNkALTSr8
*請加選的同學慎思,因為本課程為資工系必修課,課程不及格比率為15%+-5%。修讀本課
程需要繳交midterm project、term project以及每週手寫作業6-10題,任選二題作答;每週線
上程式作業3題,至少完成一題;每週助教課程分組報告一小時,需上傳作業解題投影片。
*建議可以採用先看習題,然後再到影片中學會解決問題技術的方式學習,效果較佳!
Scope:
- Many Classical Algorithms
- Several Machine Learning/Deep Learning Algorithms (2019開始新增)
- Few Quantum Algorithms (2021開始新增)
Scoring:
- 期中考(分析與設計概念)(25%)
- 期末考(分析與設計概念)(30%)
- 期中專題、期末專題、作業、程式設計作業、報告、課程參與度(45%)
Textbooks:
- My Book's Manuscript: (輕鬆學演算法 -- 從古典到量子演算法) AlgBook-2023-0325.zip
(此教科書勘誤加分由2023年3月
25日
11:45開始,勘誤範圍為0-8章,期中考以此版本為標準答案);AlgBook(Ch0-7+App1-2)(2023-0213).zip
(2023/02/13更新版)(此教科書勘誤加分由2023年2月14日
21:00開始, 勘誤範圍為0-7章。報告勘誤請列出
AlgBook草稿版本日期、錯誤頁碼及錯誤處,並請先確認是否已
有他人列舉過。)(書籍即將出版,版權
所有,草稿僅供修課同學參考,請勿散播流出:)
- My Another Book: (輕鬆學量子程
式設計 -- 從量子位元到量子演算法)
- 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:
- 張元翔, 量子電腦與量子計算, �眳p, 2020.
- 陳建宏(譯), 量子計算實戰, �眳p, 2020.
- 林大貴, 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:
- 第十二屆全國大專院校 AI 智動化設備創作獎: (png)(pdf); AR: (png); AR Paper: (pdf)
- (2/14)(2/21)1. 認識演算法 --
從食譜到高階程式語言: (AlgSmallTalk.pptx)
(Alg-Intro.pptx) (CPSforIndustry4.0.zip) (ACM-ICPC&EPC.ppt)(CPSProject.zip)
.1 演算法名稱的由來
.2 什麼是演算法?
.3 演算法的例子
.4 如何表示演算法?
.5 如何實作演算法? (EuclidGCD.c)(EuclidGCD.cpp)(EucidCGDClass1.java)(EucidCGDClass.java)(EuclidGCD.py)
.6 演算法的正確性
Homework1: (for 2/21; Due day:
before next class or TA's class on 3/7)
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是快樂數
- 2.
(3/7)演算法複雜度分析範例(以排序演算法為例)(Alg-Analysis.pptx)
.1 演算法的效能
.2 演算法的時間複雜度
.3 大O漸進記號
.4 降低演算法時間複雜度量級
.5 漸進記號(asymptotical
notation): Big O, Big Omega, Theta
.6
多項式時間、指數時間及偽多項式時間演算法
.7 氣泡排序(bubble sort)演算法
.8 插入排序(insertion sort)演算法
Homework 2: (2023-ICCE-4-Papers.zip)
(Select one problem out of A, B, ..., and
H to handwrite its solution, and one of the 4 papers to
handwrite a report; Due day: before next TA's class on
3/14)
A. 使用虛擬碼(pseudo
code)寫一個時間複雜度為O(sqrt(n))的演算法,輸入一個整數n(n>2)並輸出所有n除了本身以外的正因數
(factor)總和,你必須分析演算法的時間複雜度。
B. 使用虛擬碼(pseudo
code)寫一個時間複雜度為O(sqrt(n))的演算法,輸入整數n及m(n>m>2),輸出所有比n小並大於
m的n的因數 (factor)總和,若無此因數則輸出0,分析演算法的時
間與空間複雜度。
C. 使用虛擬碼(pseudo
code)寫一個時間複雜度為O(sqrt(n))的演算法,輸入一個整數(n>2)並判斷n是否為完美數
(perfect number),你必須分析演算法的最差及最佳時間複雜度。
D. 使用虛擬碼(pseudo
code)寫一個演算法,以輸入一個具有n個元素的集合S並輸出S的幂集(power
set),你必須分析演算法的時間複雜度。 (Write an algorithm to input a set S of
n elements and output the power set of S. You must analyze
the time complexity of your algorithm.)
E. 分析費伯納西數列演算法與遞迴費伯納西數列演算法之空間
複雜度
F. 畫出n log n、n log2
n、n2及n3圖 形(for n=2, 4, 8, ...,
128)並比較之。
G. 若一演算法A的時間複雜度為6 x 2n=O(2n)可以在n=10的時候耗費一小時解決問題
X,而另一個解決問題X的演算法B的時間複雜度為5 x
n3 =
O(n3),
則請問當n=10時演
算法B要耗費多少時間完成?
H. 若一演算法A的時間複雜
度為6 x 2n=O(2n)可
以在n=10的時候耗費一小時解決問題X,而另一個解決問
題X的演算法B的時間
複雜度為5 x n3 =O(n3),則請問當n為
何值時演算法B要耗費一小時才可以完
成?
I.
(此題僅供參考,不列入手寫作業及實習課口頭報告範圍,也不列入考試範圍)
使 用虛擬碼寫出堆積排序(heap
sort)演算法,分析其時間與空間複雜度。
J. (此
題僅供參考,不列入手寫作業及
實習課口頭報告範圍,也不列入
考試範圍)
使
用虛擬碼寫出以下操作:
以binary
heap實現priority
queue的operations,包括 insert(p):
Inserts a new element with
priority p; extractMax():
Extracts an element with
maximum priority; remove(i):
Removes an element pointed by
an iterator i;
changePriority(i, p): Changes
the priority of an element
pointed by i to p;
以上操作都具有O(log n)的time
complexity;而getMax(): Returns
an element with maximum
priority; 則具有O(1) time
complexity。
- Slides and Videos: (Alg4-1203(NoMark).pptx)
(更正: 投影片第36和37頁 樹第三層右邊的三個節點由左而右依序為"2' "4' "5")
Youtube video:https://youtu.be/mM93FheJEGQ)
*許多問題的尋找解答過程可以使用樹
(tree)來表達,這類問題也都可以建構 出解答空間樹(solution space
tree)。因此要找到這些問題的解答,不管是可行解(feasible solution)或是最佳解(optimal
solution),就轉變成一個樹搜尋(tree search)問題。
*有許多方法可以拜訪(visit)與拓展(expand)一個解答空間樹,包括深度優先搜尋(depth- first search, DFS)、廣度優先搜尋 (breadth- first search,
BFS)、登山搜尋(hill climbing search, HCS)以及最佳優先搜尋(best-first
search)等演算法。
* 廣度優先搜尋(breadth-first search, BFS)演算法
* 深度優先搜尋(depth-first search, DFS)演算法
* 登山搜尋法(hill climbing search,
HCS)演算法
* 最佳優先搜尋法(best-first search)演算法
* 回溯(backtracking)演算法
Homework 13:
A. 給定一集合S={7, 4, 1, 2,
11}以及一加總值10,利用深度優先搜尋法來解子集合加總問題,你必須畫出解出問題的解
答空間樹(solution space tree)。
B. 以深度優先搜尋演算法找出以下圖
(graph)的漢米爾頓迴路 (Hamiltonian circuit),你必須畫出解出問題
的解 答空間樹(solution space
tree)。
C. 以廣度優先搜尋演算法找出上圖的漢米爾頓
迴路,你必須畫出解出問題
的解答空間樹(solution space
tree)。
D. 以空單 格的移動方向為上下左右的次序,以廣度優先搜
尋演 算法下解決以下
的八拼圖(8- puzzle)問題。
起
始狀態:
目標狀態:
E. 以空單 格的移動方向為上下左右的次序,以深度優先搜
尋演 算法解決D題中
的八拼圖(8- puzzle)問題。
F. 以空單格的移動方向為上下左右的次序,以登山搜尋演算法解決D題中的八拼圖(8-puzzle)問題。而評估函數為
方塊錯置的數目,若有相同的 情形,則以空單格移動方向上下左右為其優先順序。
G. 以空單格的移動方向為上下左右的次序,以最佳優先搜
尋演算法解決D題中的八拼圖
(8-puzzle)問題。而評估函數為方塊錯置的數目,若有相同的情形,則以空單格移動方
向上下左右為其優先順序。
- 14. (6/6) 分支定界(Branch and Bound)演算法 (Branch&Bound.zip)
(Youtube video Part1: https://youtu.be/KUlDxRV6fsU)(Youtube video Part2: https://youtu.be/R91wC81n6Yk)
*分支定界(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*演算法
Homework 14: (A-
G選2題)
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的最段路徑問題。
- 5/30 演講: "AI倫理" by 陳弘軒
教授 (需簽到)
- 6/6 演講: "量子糾纏由哲學,科學,到科技" by 張慶瑞 教授 (需簽到)
- 6/13
Final Examination
14:00-16:30(書面筆試,範圍為期中考之後教授的內容,含量子演算法、問
題下界與問題分類、刪尋演算法、
貪婪演算法、
最短路徑演算法、樹搜尋與回溯演算法、
分支定界演算法)
(30%)
- Term
Project (Deadline 6/20 12:00PM) (12%)
設計量子程式建構使用 c (2 <= c <= 8)個量
子計數位元(counting bits),對應𝑓(𝑥) = a𝑥 (mod
15)
的量子相位估測線路,並使用量子電腦模擬器執行量子線路,獲得量子計數位元的測量結果,以求出𝑓(𝑥)
的週期。程式可以直接呼叫並納入第七章提供的 qc_mod15 及 iqft
函數建構量子模冪線路及逆量子傅立葉變換線路,並且以量子閘的形式加入量子線路中。程式的輸入為c及a(中間以空白隔開),輸出結果為針對
counting bits由小而大排序,並分行列出counting bits以
及其對應的週期(中間以空白隔開)。
例如,若碰到test case的輸入為3 13,則輸出為:
000 1
010 4
100 2
110 4
- 15.
匈牙利演算法(Hungarian Algorithm)(HungarianAlg.zip)(Optional)
演算法課程
_0608(匈牙利演算法)影片
Homework
15: 本週只有兩題,因此每個學生都要做這兩題作業,但本週不需繳交影片與簡報。
A. 使用匈牙利演算法(Hungarian
algorithm)來解以下的最小成本指派問題(assignment problem)(註:
必須寫出演算法執行過程中的每個中間結果)
|
Task A
|
Task B
|
Task C
|
Tim
|
$1
|
$2
|
$3
|
Bob
|
$2
|
$3
|
$2
|
Alex
|
$2
|
$2
|
$3
|
B. 說明如何使用匈牙利演算法(Hungarian
algorithm)解決最小歐氏平面權重配對(Minimum Euclidean Weighted
Matching)問題。所謂最小歐氏平面權重 配對問題描述如下:
給定n個點(n為偶數),如何將此n個點匹配形成n/2個點對,讓每個點對形成一條線段,而此n/2條線段具有最小的長度總和。