140 likes | 226 Views
一、導論. 1-1. 資料與資訊 1-2. 演算法與資料結構. 1-1 資料與資訊. 資料結構的功能 需要將人類所能了解的語言轉換成 機械化 的動作,以便交由電腦 來處理。 機械化的動作包含 資 訊 ( 資料 ) 與動作 ( 控制 ) 範例 人類的語言 : 求出全班的平均 電腦的動作 : (1) 將全班的 成績 加起來 (2) 將加起來的 成績 除以全班的人數. 人類自然語言. 輸入. 資料結構的功能 轉成機械化的動作. 處理. 演算法 … …. 輸出. 1-2 演算法與資料結構. 演算法的特性 輸入 : 準確描述
E N D
一、導論 1-1. 資料與資訊 1-2. 演算法與資料結構
1-1 資料與資訊 • 資料結構的功能需要將人類所能了解的語言轉換成機械化的動作,以便交由電腦來處理。 • 機械化的動作包含資訊(資料)與動作(控制) • 範例人類的語言: 求出全班的平均電腦的動作:(1) 將全班的成績 加起來(2) 將加起來的成績 除以全班的人數 人類自然語言 輸入 資料結構的功能 轉成機械化的動作 處理 • 演算法 • … • … 輸出
1-2 演算法與資料結構 • 演算法的特性 • 輸入: 準確描述 • 指令: 明確性 • 正確性: 演算法的正確性 • 有限性: 演算法的步驟需要於一定的步驟內完成 • 輸出: 正確性與描述
1-2 演算法與資料結構 • 範例: 求出兩個數的最大公因數 • 自然的語言(1) 輸入兩個自然數(2) 輾轉相除直到除數為零(3) 除數就是最大公因數 (輸出) • 演算法的步驟(1) 輸入 A, B(2) R 為 A / B 的餘數(3) 如果 R 為零, 則到 (5) – 把前一個除數取出的動作(4) 設定 A←B, B← R, 回到 (2)(5) B 就是最大公因數 輸入的描述不夠明確 輾轉相除的動作描述不夠明確 輸出的描述不夠明確
1-2 演算法與資料結構 • 驗證演算法的正確性 • 輸入 A, B • R 為 A / B 的餘數 • 如果 R 為零, 則到 (5) • 設定 A←B, B← R, 回到 (2) • B 就是最大公因數
1-2 演算法與資料結構 • 流程圖基本符號 (Flow Chart) start 處理 輸入/輸出 End 判斷
1-2 演算法與資料結構 • 流程圖範例 • 輸入 A, B • R 為 A / B 的餘數 • 如果 R 為零, 則到 (5) • 設定 A←B, B← R, 回到 (2) • B 就是最大公因數 start (1) 輸入 A, B (2) R 為 A/B 的餘數 (3) R是否為0 ? Yes 輸入/輸出 start No (4) A←B, B← R 處理 處理 End (5) 輸出最大公因數B 判斷 End
1-2 演算法與資料結構 • 範例: 求出兩個分數的相加,結果並要約成最簡分數 • 基本觀念(1) 通分: 公分母 (最小公倍數) = 兩數相乘 / 最大公因數(2) 擴分: 分子 * (公分母 / 分母)(3) 約分: 分子, 分母共除最大公因數5 3 5*(12/6) 3*(12/4) 5*2 + 3*3 19- + - = -------- + -------- = ---------- = ---- 6 4 12 12 12 12 • 演算法
1-3 程式的分析 • 一個好程式的判斷準則 • 正確達到目的。 計算結果要符合原先設計的要求,結果要正確 • 可維護性高。 程式功能的新增與修改要容易 • 效率高計算時間要盡量短 • 『記憶體』需求低。所使用的記憶體要盡量的少
1-3 程式的分析 • 可維護性高的檢驗方式 • 設計模組化、由上而下的思路。 • 常數、變數、函式的名稱需要有意義如: 求兩人薪資的總和,可以使用(1) A = 20000, B = 15000; ← 比較不容易了解(2) Salary_A = 20000, Salary_B = 15000; ← 比較容易了解 • 函式的輸入、出的定義int sqn_srch(int A[], int n, int key); // Sequential Search • 註解詳實Result = Result + 200; // 將結果加入200元; Result = Result / Total_Num // 除以全班人數; • 說明文件需要詳實使用說明(Readme)、安裝步驟、操作手冊
1-3 程式的分析 • 效率高的檢驗方式 • 效率的直接測量方式是『執行時間』執行時間需要考慮到許多因素,如硬體與編譯器的種類 • 由程式的本身來了解執行效率檢查程式敘述的執行『次數』來了解
1-3 程式的分析 • 由程式執行的頻率來了解效率 • 單層迴圈的計算方式for (i=1; i<=n; i++) result = result + 1; ← 這行程式敘述執行了n 次 • 雙層迴圈的計算方式for (i=1; i<=n; i++) for (j=1; j<=m; j++) result = result + 1; ← 這行程式敘述執行了 n*m次 • 雙層迴圈,內圈不固定的計算方式for (i=1; i<=n; i++) for (j=i+1; j<=n; j++) result = result + 1; ← 這行程式敘述執行了 n*(n-1)/2次以第二圈來看,執行次數分別為: n-1, n-2, …, 1= (n-1)+(n-2)+…+1 = (n-1+1)*(n-1)/2 = n*(n-1)/2
1-3 程式的分析 • Big-O (程式頻率計數) • 計算方式: 取出頻率次數的方程式中的最高次數,去掉係數 • 例如:(1) 5n2+6n+9 = O(n2)(2) 19n3+9n2+6n+9 = O(n3)(3) 3nlgn+9n+10 = O(nlgn) • 時間複雜度等級O(1), O(lgn), O(n), O(n2), O(n3), O(2n)
作業 • 第1-18與1-19頁 • 第 1, 2, 5, 7, 8, 9 題 • 和第二章的部份一起交