演算法_第一章 介紹.ppt

Download Report

Transcript 演算法_第一章 介紹.ppt

介紹
1
2020/4/25
演算法 _ 第一章
1
什麼是演算法?

演算法是解決一個問題的流程

這個流程必須定義得很明確

而且可能會需要一些輸入

並且會產生一些輸出
2020/4/25
演算法 _ 第一章
1-2
為什麼要學演算法?

我們有 32 個外觀看起來都一樣的硬幣,其中
有一個是劣幣而且其重量與其他 31 個不同
(輕或重都可能)

請找出這個劣幣,並且決定它是比真幣輕或是
重

唯一能使用的工具是一支天秤

每一次天秤量過的結果包括:左邊這一組硬幣
的重量小於、等於、或大於右邊這一組硬幣的
重量。
2020/4/25
演算法 _ 第一章
1-3
直覺的解法-演算法1.1
2020/4/25
演算法 _ 第一章
1-4
直覺的解法-演算法1.1

演算法 1.1 所需要使用的天秤次數跟輸入
的硬幣數目成正比

換句話說,如果輸入的硬幣數有 n 個,
那麼演算法 1.1 所需要使用的天秤次數跟
n 成正比
2020/4/25
演算法 _ 第一章
1-5
聰明人花一星期想出的演算法
步驟一: 將所有的硬幣平均分成四組,每組八枚,分別用 81, 82, 83, 84 來
代表; / / 其中有一組的重量不同於其他三組
比較 81 與 82;
// 比第一次
情況一:81 = 82
// 81 與 82 兩組為真
如果 81 = 83,則
// 比第二次
確定劣幣在 84 這一組裡;
否則
確定劣幣在 83 這一組裡;
情況二:81  82
// 83 與 84 兩組為真
如果 81 = 83
// 比第二次
確定劣幣在 82 這一組裡;
否則
確定劣幣在 81 這一組裡;
2020/4/25
演算法 _ 第一章
1-6
聰明人花一星期想出的演算法
步驟二: 把包含有劣幣的那一組 8 枚硬幣再細分成四組,每組二枚,分別用 21, 22, 23, 24 來代表; / /
其中有一組的重量不同於其他三組
比較 21 與 22;
// 比第三次
情況一:21 = 22
// 21 與 22 兩組為真
如果 21 = 23,則
// 比第四次
確定劣幣在 24 這一組裡;
否則
確定劣幣在 23 這一組裡;
情況二:21  22
// 83 與 84 兩組為真
如果 21 = 23
// 比第四次
確定劣幣在 22 這一組裡;
否則
確定劣幣在 21 這一組裡;
2020/4/25
演算法 _ 第一章
1-7
聰明人花一星期想出的演算法
步驟三: 令包含有劣幣的那一組 2 枚硬幣分別為 A 與 B 而 X 是除了 A, B 以外的任何一個真幣;
比較 A 與 X;
// 比第五次
如果 A = X 則
B 是劣幣;
否則
A 是劣幣;
2020/4/25
演算法 _ 第一章
1-8
聰明人花一星期想出的演算法

淘汰與搜尋法

所需要使用的天秤次數跟 log2 n 成正比
2020/4/25
演算法 _ 第一章
1-9
學過演算法後設計出的演算法
步驟一: 如果可能包含劣幣的硬幣數目還大於 2 則執行第二步,否則執行第三步;
步驟二: 將可能是劣幣的所有硬幣平均分成四組,分別用 c1, c2, c3, c4 來代表; / / 其中有一組的重量
必然不同於其他三組
比較 c1 與 c2;
如果 c1 = c2 則
//c1 與 c2 兩組為真
淘汰掉 c1 與 c2;
否則
//c3 與 c4 兩組為真
淘汰掉 c3 與 c4;
回到步驟一;
2020/4/25
演算法 _ 第一章
1-10
學過演算法後設計出的演算法
步驟三: 令包含有劣幣的那一組 2 枚硬幣分別為 A 與 B 而 X 是除了 A, B 以外的任何一個真幣;
比較 A 與 X;
// 比第五次
如果 A = X 則
B 是劣幣;
否則
A 是劣幣;
2020/4/25
演算法 _ 第一章
1-11
為什麼要學演算法?

演算法 1.1 是沒學過演算法的普通人設計出的

演算法 1.2 則是沒學過演算法的聰明人所絞盡
腦汁設計出的

演算法 1.3 則是學過演算法的普通人或聰明人
設計出的

不管我們是普通人或聰明人,只要修學過演算
法,我們所設計出來的演算法可以比聰明人
(但是沒學過演算法)絞盡腦汁後所設計出的
演算法還好!
2020/4/25
演算法 _ 第一章
1-12
更多必須修學演算法的理由
2020/4/25
演算法 _ 第一章
1-13
更多必須修學演算法的理由

圖論證明 n 個頂點的圖裡最多可以找出
nn-2 棵生成樹

當 n = 100 時,nn-2 等於 10196!

這個問題只要用貪婪法就可以很簡單地
在 n2 的時間複雜度下解決掉
2020/4/25
演算法 _ 第一章
1-14
更多必須修學演算法的理由

凸面體
2020/4/25
演算法 _ 第一章
1-15
更多必須修學演算法的理由

一般人面對這個問題可能無從著手

如果你修學過演算法就知道這個問題只
要用貪婪法就可以在 n log n 的時間複雜
度下解決掉。
2020/4/25
演算法 _ 第一章
1-16
更多必須修學演算法的理由

看起來很簡單,實際上卻是很難的問題
2020/4/25
演算法 _ 第一章
1-17
更多必須修學演算法的理由

NP-完備問題

到目前為止,所有的 NP-完備問題都還
找不到任何有效率的演算法!
2020/4/25
演算法 _ 第一章
1-18
更多必須修學演算法的理由

0/1打包問題

公司裡有 n 個不同的物品,物品 i 所佔用的體
積是 vi 而價值為 pi,大保險櫃的容量則是 C

針對每一項物品,我們只能選擇放入大保險櫃
或者不放入大保險櫃

我們的目標是使得大保險櫃中所放置的物品總
價值最大,前提是所放置的物品總體積不能超
過大保險櫃的容量 C。
2020/4/25
演算法 _ 第一章
1-19
更多必須修學演算法的理由

也是一個 NP-完備問題

到目前為止也還找不到任何有效率的演
算法
2020/4/25
演算法 _ 第一章
1-20