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,直到所有考生分發完畢。