Transcript 貪進法

高中資訊科技概論
松崗圖書公司
14-1 解題方法設計
一、暴力法
二、由上而下
三、由下而上
四、貪進法※
五、回溯法※
14-2 電腦解題在各領域之應用
一、資料搜尋
二、火車訂票
三、MP3音樂轉檔※
四、志願分發

暴力法是一種一一嘗試的方法,是最原始也是最
簡單的電腦解題方法

對於較小的問題,暴力法能提供較簡單的解題方
法

但對於較大、且較複雜的問題,暴力法因為執行
效率不佳,所以很難成為有效的解題方法



任何一個大於 1 的正整數,除了 1 和本身外,沒
有其他的因數,就稱此數為質數
大質數常被應用在資訊科學上,例如作為公開金
鑰密碼系統的金鑰。其原理是設
N = 大質數 A × 大質數 B
若A, B 兩質數是 20 位數的大質數,則 N 值可能
高達 40 多位數,所以 N 值可對外公開給別人知
道,因為大家都很難知道它是那兩個質數的乘積
所以系統的安全強度和所用的質數大小有關,質
數越大,安全性越高

所以找出大質數在資訊科學很重要。

以下將以尋找質數問題為例,說明暴力法解決策
略的缺點,如果使用暴力法尋找大質數,找到的
質數大小,必定受限

找出質數-解題方法

找出質數-解題方法
◦ 上例使用暴力法解決尋找質數的問題,過程中進行了很
多次多餘的比較,例如:
1.刪除 4, 6, 8, 10, 12 .. 等數的倍數,在檢查 2 的倍
數時,都已經檢查過了 (步驟 4, 6, 8 等)
2.檢查 8 ~ 50 的倍數時,再也沒有刪除任何其他非質
數


實際上只要檢查小於等於 50 的最大整數 7 即可,
也就是只要刪除 2, 3, 5, 7 四個數的所有倍數後,
剩餘的就是小於 50 的質數。
使用這樣的解題策略,可減少超過 90% 的比較次
數。因此可修正暴力法的解題方法如下:

是把大而複雜的問題,分解成較小且較簡單的問
題,直到原來的問題可以用一些容易解決的小問
題表示,並且以解決這些小問題的方式,解決整
個問題

上而下的電腦解題方法也稱為模組化 (Module) 設計,
模組化設計是電腦解題很重要的設計方式,現在許多
網路平台,如網路學習系統 Moodle、網站架站系統
Xoops 等,都使用模組化設計

在模組化設計的系統中,使用者可以根據自己的需求,
選擇需要的模組使用,各地的系統開發者,可以分別
發展自己的模組,測試成功後,可以很容易加入系統
中,擴充系統的功能

模組化設計的優點
1. 模組可重複使用
功能單純的小模組開發完成後,可重複使用,或組合起來解
決不同且更複雜的問題
2. 易於分工複雜的問題
分成模組後,不同的人可負責不同的模組,易於團隊分工合
作
3. 易於測試與除錯
小模組的功能較簡單,較容易在較小範圍內進行測試與除錯
4. 可簡化維護的工作
解題方法的維護可透過各別模組的維護,達成簡化的目的

例如學校的校務行政系統就常採用模組化設計

分治法 (Divide and Conquer) ※
◦ 是由上而下解題方法的一種,基本步驟是將問題分成兩
組以上相同或性質相近的較小問題;如果分割後的問題
仍然複雜,就繼續分割,直到所有小問題都很容易解決,
最後再將小問題一一解決,將各個子問題的解答,組合
成較大問題的解答
◦ 分治法的基本步驟

分治法 (Divide and Conquer) ※
◦ 解題過程

日常生活也有許多由下而上的例子,例如體育競
賽的賽程,通常會由下而上逐級比賽,最後產生
出總冠軍
體育競賽的賽程表
(2006 年世界盃足球
賽 16 強賽程)


由下而上的電腦解題策略是先解決系統各別基礎
的元件,再將這些元件組合成較大的子系統,子
系統再依次向上組合成更大的子系統,最後完成
最頂端的系統
以找出一數列之最大數為例,可先找出前兩個數
中的最大數,再將此數和下一個數比較,找出三
數中的最大數,依此類推,重複使用相同的方法
把數列中的最大數找出來,這就是應用由下而上
的解題方法

找出最大數
1. 設最大數為第一個數
2. 重複取下一個數和最大數比較,如果此數大於
最大數,則將最大數設為該數,直到所有的數
都比過

問題

找出最大數的解題方法


在解題的過程中,一次一步一步的貪進,每次都
找最有利的步驟進行,直到找到解決問題的解答。
這與日常生活解決問題的經驗相似,也就是每次
都找最有利的步驟進行
貪進法的基本步驟
1. 找出可能的選擇
2. 檢查此選擇是否可行
3. 將可行的選擇,加入解答中

貪進法實例
◦ 某一家電信公司在
佈建網路時,希望
以較小成本將許多
城市連接起來

貪進法範例
◦ 共有 A ~ G 7 個城市,
每個城市間連接的成
本為邊上所標示的數
值,例如城市 B 和 E
間的成本為 3,城市
D 和 F 間的成本為 8。
電信公司要解決的問
題,就是在此圖中,
找出一條能連接所有
點,連接邊之值的總
和較小,且不能有循
環的路徑

解題設計
1. 先找出圖形的最小邊
2. 再找出次小邊,檢查是否會造成循環
3. 一次考慮一個邊,一步一步的貪進,直到找
到解答

解題過程
◦ 背包問題
另一個使用貪進法作為解題方法的有趣例子是背包
問題 (Knapsack Problem),背包的容量是有限的,
要如何在背包內裝入最有價值的東西呢?
◦ 背包例子-解題設計

使用暴力法解題時,會將所有可能的情形全部
列出來,一一檢查是否能解決問題。實際上每
次選擇解題的步驟時,可立即進行「可行性」
檢查,若目前的選擇不可行,則停止繼續往下
尋找,退回前一次的選擇,重新繼續尋找解答,
這就是「回溯法」的解題方法


日常生活有很多使用回溯法的例子,例如電腦
軟體提供的「還原」功能,就是退回先前操作
的位置,再重新繼續操作
回溯法的背包問題

回溯法的背包問題-背景知識

回溯法的背包問題-解題方法

各領域都有許多電腦解決問題的例子,如網路
資料搜尋、火車訂票、MP3 音樂轉檔、志願分
發等,以下將說明使用電腦解決這些問題的流
程


對使用者而言,搜尋最重要就是要能快速搜尋
到所要的資料。電腦搜尋資料的方法有很多種,
每種方法的效率可能不同,解決搜尋問題時,
通常會選擇效率較高的搜尋方法。
一些簡單的搜尋方法有:
循序搜尋法 (Sequential Search)
◦ 循序搜尋是從第一個元素開始,一個接著一
個依序搜尋所有資料

循序搜尋法 (Sequential Search)
◦ 例如有一序列整數
15, 35, 45, 30, 55, 20, 40, 50, 25
如果要搜尋 40,循序搜尋會從索引值 0, 1,
2, 3, 4, 5, 6 依序搜尋,最後在索引值 6 的
位置找到,共比較了 7 次。如果要搜尋 60,
需從索引值 0 開始搜尋,直到索引值 8,才
確定鍵值並不在資料中,共比較了 9 次

循序搜尋法 (Sequential Search)
1. 從第一個元素開始,比較元素是否與鍵值相
同
2. 如果相同,表示搜尋到資料,結束搜尋
3. 如果不相同,繼續往下一個元素搜尋,直到
找到鍵值,或已經沒有資料可以搜尋為止

循序搜尋法 (Sequential Search)
◦ 循序搜尋是最簡單的搜尋方法,搜尋前資料
並不需事先排序好,通常適用於小資料量時
◦ 由於網路搜尋的資料量都很龐大,循序搜尋
並無法滿足搜尋效率的需求,例如有 1 千萬
筆資料,在最壞的情形下,循序搜尋要比較
1 千萬次,因此必須使用更有效率的方式,
才能讓使用者快速找到資料

二分搜尋法 (Binary Search)
◦ 二分搜尋法是另一種資料搜尋的方法,和循
序搜尋不同的是,二分搜尋在搜尋前,需要
先將資料排序好。
◦ 其解題原理是將鍵值和中間位置的資料比較,
鍵值較小,往前半部搜尋;鍵值較大,往後
半部搜尋,直到搜尋到資料,或已經沒有資
料可以繼續尋找為止

二分搜尋法 (Binary Search)
1. 先檢查最中間位置的資料,和鍵值相同,表示
搜尋到資料,結束搜尋
2. 鍵值小於中間位置的資料,表示資料位在前半
段
3. 鍵值大於中間位置的資料,表示資料位在後半
段
4. 以同樣的方式在前半段或後半段搜尋,直到找
到鍵值,或已經沒有資料可以繼續分割為止

二分搜尋法 (Binary Search)
◦ 在數列中搜尋鍵值45

二分搜尋法 (Binary Search)
◦ 在數列中搜尋鍵值45
 從上例可以發現,如果沒有搜尋到資料,二分搜尋
每次都會將搜尋的範圍減小到原來的 1/2,所以平
均的搜尋效率會比循序搜尋法好

搜尋引擎的搜尋方法
◦ Google 宣稱在 1 秒內可以搜尋百億筆資料,將
搜尋結果呈現瀏覽器上。如果等到使用者開始搜
尋資料時,才將關鍵字和各個網頁一一比對,絕
對無法達到這樣的效率,所以搜尋引擎在搜尋之
前,就已預先建立相關資料,以提升搜尋的速度
◦ 索引搜尋是目前搜尋引擎常採用的方法,也是日
常生活常使用且有效率的搜尋法。以本書的名詞
索引頁為例,要搜尋 CPU 一詞,只要先搜尋字
母 C,再使用循序搜尋的方式,找到對應的頁數,
便能很快找到 CPU 在書本內的位置

搜尋引擎的搜尋方法
◦ 另一個應用索引搜尋的例子就是電話號碼查
詢,查詢電話簿時,通常會先搜尋電話號碼
的一個數字,再依次搜尋第二、第三、第四
個數字,依此類推
◦ 同學上網查詢成績或圖書館的借書資料時,
常會輸入學號或身分證字號,就是透過學號
或身分證字號的索引資料,快速搜尋到相關
的資料

搜尋引擎的搜尋方法
◦ 一般搜尋引擎會將出現頻率高的字詞,放置
在能較快搜尋到的位置,同時也會降低搜尋
比較的次數,才能加速整體的搜尋速度。
◦ 常用的搜尋引擎有 Google, Yahoo, Bing 等,
所能搜尋的資料包含網站、圖片、新聞、影
音資料等,搜尋引擎資料搜尋的能力與特性
雖有差異,但通常都使用索引搜尋的方式

搜尋引擎的搜尋方法
◦ 搜尋引擎在搜尋前,預先建立好完整且有效
率的索引資料庫

搜尋引擎的搜尋方法
1. 擷取網頁
搜尋引擎利用程式拜訪各個網頁,流量大的網站優
先拜訪
將自動蒐集網頁中的資料,並將資料記錄起來
2. 建立索引資料庫
根據相關的字詞,建立出高效率的資料庫,將字詞
與特定網頁的關聯建立起來

使用者搜尋資料
1. 使用者在瀏覽器輸入所要搜尋的關鍵字
2. 伺服端收到關鍵字後,搜尋事先建好的索引
資料庫
3.伺服器端將找到的資料送給瀏覽器


網路訂票是另一個使用電腦解決問題的例子,
目前火車、高鐵、飛機等交通工具都使用網路
訂票系統
火車訂票系統通常會使用資料庫紀錄乘客基本
資料,及各列車的訂票紀錄等。一般和資料庫
系統有關的操作,都可分成新增、刪除、查詢、
修改四種作業。火車訂票的作業則包含訂票
(新增)、取消訂票記錄 (刪除)、查詢三種。

火車網路訂票系統的架構

火車網路訂票系統的流程
1. 用戶端將訂票資料,如日期、張數、起迄站等
資料,送到伺服器端
2. 伺服器端接收到用戶端的資料後,依訂票日期
與車次查詢資料庫內的空位數
3. 如果空位數小於訂票張數,則傳給用戶端該日
該車次空位數不足的訊息
4. 如果空位數大於訂票張數,則將訂戶資料寫入
資料庫內,剩餘空位數變成原來空位數減掉訂
票張數,並傳給用戶端訂位代號等相關訊息

火車網路訂票
流程圖


一般人在收聽 MP3 音樂時,很少會去了解電
腦將音樂轉換成 MP3 的方法,實際上轉換的
過程很複雜
使用電腦解題按部就班、循序漸進的方式,思
考 MP3 具有良好壓縮效果的關鍵,除了將人
耳無法感知的音訊濾除之外,在聲音數位化的
過程中 (第 5 章),還可以改變聲音「編碼」的
方法,使聲音經過重新編碼後,能降低整體檔
案的大小,並且不影響原來聲音的品質

實際上這樣的編碼方式,在 1952 年已由
Huffman 提出,Huffman 編碼法是一種無失
真的壓縮技術。其編碼的基本原則是
出現次數較多者,使用較少的位元編碼;
出現次數較少者,則使用較多的位元編碼
最後將這些位元串接起來,就可以壓縮檔案

Huffman 編碼

Huffman 編碼範例
◦ 例如有一篇文章出現字母的次數統計如下,
使用 Huffman 編碼過程為:

Huffman 編碼範例-過程

Huffman 編碼範例
◦ 使用不同的編碼法進行檔案壓縮,壓縮的效
果可能會不一樣
兩種不同編碼方式產生的結果

Huffman 編碼
◦ 固定長度編碼
 每個字母的編碼長度都是固定的,上例中共有 6 個字母,
所以需要 3 bits 來表示。檔案壓縮後的大小為( 45 +
13 + 12 + 16 + 9 + 5) × 3 = 300 bits
◦ 可變長度編碼
 使用 Huffman 可變長度的編碼法後,檔案大小為
45 × 1 + 13 × 3 + 12 × 3 + 16 × 3 + 9 × 4 + 5 ×
4 = 224 bits
可見可變長度編碼比固定長度編碼壓縮效果較好。

Huffman 編碼
◦ Huffman 編碼法可以節省約 20% 的空間,
除了 MP3 檔案使用 Huffman 編碼法,
WinZip, WinRAR 等壓縮軟體,也是利用類
似 Huffman 編碼的技巧。另外《第五章:
電腦軟體概論》介紹過的圖形檔 JPG、影音
檔 MPEG 等檔案格式,均使用 Huffman 編
碼法壓縮檔案

志願分發現在大
多使用電腦協助,
如果是透過登記
分發的入學管道
進入高中,就一
定經歷過電腦分
發的過程;將來
進入大學也可能
會透過電腦分發,
決定所要就讀的
學校和科系

志願分發就是將考生依志願指定到某一學校 (科
系),或是決定某一學校 (科系) 要收那些學生。
實際上志願分發就是學生與學校間的配對,電
腦會根據學生的志願與成績和學校進行撮合。

國中升高中志願分發
◦ 國中升高中的志願分發過程非常單純,只要將
考生的總分排序後,再進行分發即可,例如某
年升高中的入學考試,考生 1 ~ 7 的總分由
高而低依序為 5, 3, 1, 7, 6, 2, 4,假設學校
A ~ D 每校招收兩名學生,考生選填的志願
總表如下,使用電腦進行分發的步驟如下:

國中升高中志願分發順序

國中升高中志願分發順序
1. 從尚未分發的考生中,選取成績最高者,
以其第 1 志願進行分發。
2. 如果該校未額滿,將其錄取到該校。
3. 如果該校已額滿,且有選填下一個志願,
選取下一個志願,繼續進行步驟 2。如沒有
下一個志願,則顯示該生落榜。
4. 重複步驟 1,直到所有考生分發完畢。