1 / 30

99 高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計 -- 演算法 教學示例與研討

99 高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計 -- 演算法 教學示例與研討. 報告人 國立鳳新高級中學 林光耀 2010.10. 高中資訊科 課程架構. 「 資訊科技概論 」必修 2~4 學分 ( 生活領域 ) 2 學分必修: 核心知識 為主 4 學分必修: 核心知識+ 應用軟體 或 / 及 基礎程式設計 「 資訊科學 」選修 0 ~ 6 學分 ( 非升學科目 ) 基礎程式設計 ( 1 ~ 2 學分 ) 進階程式設計 ( 2 學分 ) 資訊科學與應用專題 ( 1 ~ 4 學分 ) 其它 ( 可依各校課程特色開設 , 0 ~ 2 學分 ).

Download Presentation

99 高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計 -- 演算法 教學示例與研討

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 99高中資訊科選修課程夥伴學習教師專業進修研習進階程式設計--演算法教學示例與研討99高中資訊科選修課程夥伴學習教師專業進修研習進階程式設計--演算法教學示例與研討 報告人 國立鳳新高級中學 林光耀 2010.10

  2. 高中資訊科課程架構 • 「資訊科技概論」必修2~4學分(生活領域) • 2學分必修:核心知識為主 • 4學分必修:核心知識+應用軟體 或/及 基礎程式設計 • 「資訊科學」選修0~6學分(非升學科目) • 基礎程式設計(1~2學分) • 進階程式設計(2學分) • 資訊科學與應用專題(1~4學分) • 其它(可依各校課程特色開設,0~2學分)

  3. 99總綱選修科目與學分數 選修

  4. 基礎程式設計(選修1~2學分)

  5. 進階程式設計(選修2學分)

  6. 單元摘要 • 本主題旨在介紹常用的演算法,以及如何針對演算法進行效能分析。 • 授課重點應強調演算法垂直式邏輯思考的精神,以及循序漸進的解題流程,並搭配日常生活實例進行教學。 • 先備知識 1.必修科目「資訊科技概論」 2.選修科目「基礎程式設計」

  7. 約 7HR 約 5HR 課綱範圍 1.排序演算法 1-1 排序演算法用途 1-2 泡沫排序演算法 1-3 選擇排序演算法 1-4 快速排序演算法※ 1-5 排序演算法效能分析※ 2.搜尋演算法 2-1 搜尋演算法用途 2-2 循序搜尋演算法 2-3 二分搜尋演算法 2-4 搜尋演算法效能分析

  8. 學習目標 • 能分別說明各式常見排序演算法的功能,及其在程式設計中的使用時機。 • 能說明並比較各式排序演算法的差異。 • 能利用複雜度分析方法,分析各式排序演算法的效能。 • 能分別說明各式常見搜尋演算法的功能,及其在程式設計中的使用時機。 • 能說明並比較各式搜尋演算法的差異。 • 能利用複雜度分析方法,分析各式搜尋演算法的效能。

  9. 第一堂課:排序介紹 一、排序介紹 1.何謂排序(Sorting)? 2.內部排序 VS外部排序 3.直接移動 VS邏輯移動 二、排序演算法分析 1.穩定度 2.時間複雜度 VS 空間複雜度

  10. 排序(Sorting) • 是指將一群資料,依照特定規則調整位置順序,使資料具有某種次序。 • 目的在使資料隨著特定順序排列組合。 • 如班級成績資料,可以使用每個學生的總成績、總平均、名次或座號順序等排列方式,將資料由大至小或是由小至大來排列。 • 內部排序:排序的資料量小,可以完全在記憶體內進行排序。內部排序法有:泡沫排序法、選擇排序法、快速排序法等。 • 外部排序:排序的資料量無法直接在記憶體內進行排序,而必須使用到輔助記憶體。外部排序法有:直接合併排序法、堆積合併排序法等。(※)

  11. 直接移動 VS 邏輯移動 • 「直接移動」是直接交換儲存資料的位置。如圖示。 • 「邏輯移動」並不會移動資料儲存位置,僅改變指向這些資料的輔助指標的值。如圖示。

  12. 排序穩定度 • 穩定排序(Stable Sort)是指資料在經過排序後,兩個相同鍵值的記錄仍然保持原來的次序。 • 舉例說明:如下例中,8左的原始位置本來在8右的左邊(所謂8左及8右是指相同鍵值一個在左,一個在右。),穩定排序後8左仍應在8右的左邊,不穩定排序則有可能8左會跑到8右的右邊去。 • 原始資料順序:8左6 9 8右 7 • 穩定的排序: 6 7 8左8右9 • 不穩定的排序:6 7 8右8左 9

  13. 時間複雜度VS 空間複雜度 • 時間複雜度(Time complexity):1.可分為最好情況(Best Case)、最壞情況(Worst Case)及 平均情況(Average Case)。2.最好情況就是資料已完成排序。例如:原本資料已經完成遞增(由小至大)排序,如果再進行一次遞增排序所使用的 時間複雜度就是最好情況。3.最壞情況是指每一鍵值均須重新排列。例如:原本為遞增排序重新排序成為遞減(由大至小),就是最壞情況。 • 空間複雜度(Space complexity):1.指演算法在執行過程所需付出的額外記憶體空間。2.排序法所使用到的額外空間愈少,空間複雜度就愈佳。3.例如泡沫排序法在排序過程中僅用到一個額外空間,在所 有的排序演算法中,這樣的空間複雜度就算是最佳情況。

  14. 第二堂課:泡沫排序法介紹 1.排序原理: • 泡沫排序演算法,又稱為氣泡排序法或交換排序法。是由觀察水中氣泡大小會隨著水深高度壓力變化演進而成。 • 泡沫排序法的比較方式是由第一個元素開始,比較2個相鄰元素大小,若大小順序有誤,則立即對調,對調後再進行下一個元素的比較。 2.教師舉例:(以五筆隨機資料,用泡沫排序法表示演算法過程。)例題:「26,5,37,1,61」。結果:「1,5,26,37,61」。 3.學生練習:(可隨機挑選若干位同學,以座號上台操作演練。) • 例題:數列「23,36,5,14,9」(隨機挑選同學座號,各班可能不同。)若經由泡沫排序法由小到大的順序排序,過程及結果為何? • 隨機挑選若干張撲克牌,由學生(可分組進行)操作泡沫排序法由小到大,互相觀察排序過程。

  15. 第三堂課:泡沫排序法程式 程式參考示例與練習:(重點解說) void Bubble_Sort(int n, int *Data) { /* N筆資料儲存於Data[0]….Data[n-1]中 */ int i, j, temp; for (i=0;i<n-1;i++) { for(j=0;j<n-i;j++) { if (Data[j+1]<Data[j]) {temp=Data[j]; Data[j]=Data[j+1]; Data[j+1]=temp;/* 交換資料 swap */}} printf("第 %d 次排序後的結果:",i+1); ShowData(6,Data); /* 列印每次排序後的資料 */ } }

  16. 第四堂課:選擇排序法介紹 1.排序原理: • 選擇排序法可使用兩種方式排序,一為在所有的資料中,當由大至小排序,則將最大值放入第一位置;若由小至大排序時,則將最大值放入位置末端。 • 選擇排序法分析:1.不是穩定排序法。2.時間複雜度為O(n2)。3.只需一個額外的空間,所以空間複雜度為最佳。4.適用於資料量小或有部份資料已經過排序者。 2.教師舉例:(同「26,5,37,1,61」例,用選擇排序法表示過程。) 3.學生練習:(可隨機挑選若干位同學,以座號上台操作演練。) • 例題:隨機挑選同學座號,形成數列「33,17,6,24,9」,經由選擇排序法由小到大的順序排序,過程及結果為何? • 隨機挑選若干張撲克牌,由學生(可分組進行)操作選擇排序法由小到大,互相觀察排序過程。

  17. 第五堂課:選擇排序法程式 程式參考示例與練習:(重點解說) void Select_Sort(int n, int *Data) {/* N筆資料儲存於Data[0]...Data[n-1]中 */ int i,j,k,temp; for (i=0;i<n-1;i++) {k=i; /* 掃瞄n-1次 */ for(j=i+1;j<n;j++) if(Data[j]<Data[k]) k=j; /* 尋找最小鍵值資料 */ if(i!=k) /*交換資料 swap*/ {temp=Data[i]; Data[i]=Data[k];Data[k]=temp;} /* 使此次掃瞄的最小鍵值資料擺在最前面 */ printf("第%d 次排序後的結果:",i+1); ShowData(n,Data); } }

  18. 第六堂課:快速排序法介紹 1.排序原理: • 快速排序法又稱分割交換排序法,是目前公認最佳的排序法。假設有n筆記錄R1,R2,R3,…,Rn,其鍵值分別為k1,k2,k3,…,kn。快速排序法的步驟如下: (1)取K為第一筆鍵值。 (2)由左向右找出一個鍵值Ki使得Ki>K。 (3)由右向左找出一個鍵值Kj使得Kj<K。 (4)若i<j則Ki與Kj交換,並繼續步驟(2)的執行。 (5)若ij則將K與Kj交換,並以j為基準點將資料分為左右兩部份。 (6)以遞迴方式分別為左右兩半繼續分別進行排序,直至完成排序。 • 快速排序法分析:1.快速排序法不是穩定排序法。2.時間複雜度:最快及平均為O(nlog2n),最壞為O(n2)。3.空間複雜度:最差情況為O(n),最佳情況為O(log2n)。4.快速排序法是平均執行時間最快的排序法。

  19. 第六堂課:快速排序法介紹 2.教師舉例:可利用以上過程,將左半部與右半部分別排序,形成遞迴,至於排序過程如下:

  20. 第七堂課:快速排序法程式 程式參考示例與練習:(重點解說) void q_sort(int *data,int m,int n) { int k,temp,i,j; /* 分割元素 */ if(m<n) /* 是否繼續分割 */ { i = m; /* 分割的最左 */ j = n + 1; /* 分割的最右 */ k = data[m]; /* 取第一個元素 */ do { do /* 由左往右找 */ { i++; } while(data[i]<k); do /* 由右往左找 */ { j--; } while(data[j]>k); if (i<j) /*交換資料*/ {temp=data[i]; data[i]=data[j]; data[j]=temp;}} while(i<j); temp=data[m]; data[m]=data[j];data[j]=temp;/*交換資料*/ printf("過程輸出: "); for (i=m;i<=n;i++) /*列印過程*/ printf("%3d",data[i]); printf("\n"); q_sort(data,m,j-1); q_sort(data,j+1,n);/*快速排序遞迴呼叫*/} }

  21. 第八堂課:搜尋介紹 一、搜尋介紹 1.何謂搜尋(Search)? 2.靜態搜尋VS 動態搜尋 3.內部搜尋VS 外部搜尋 二、常見的搜尋方法 1.循序搜尋法。(適合未經排序整理的資料) 2.二元搜尋法。(適合已經排序整理的資料) 3.其他:如內插搜尋法、費氏搜尋法。(斟酌補充※) 三、循序搜尋演算法介紹 1.搜尋原理 2.效能分析

  22. 第八堂課:搜尋介紹 • 靜態搜尋VS 動態搜尋1.靜態搜尋:指在搜尋過程中,該資料不會有增加、刪除、或更新等行為。例如符號表搜尋。2.動態搜尋:指所搜尋的資料,在搜尋過程中會經常性增加、刪除、或更新。例如B-tree搜尋。 • 內部搜尋VS 外部搜尋1.內部搜尋:資料量較小的檔案,可以直接全部載入記憶體中進行搜尋。2.外部搜尋:資料量大的檔案,無法一次載入記憶體處理,而需使用到輔助記憶體來分次處理。

  23. 第八堂課:循序搜尋法介紹 • 循序搜尋法:1.又稱為線性搜尋法,是一種最簡單的搜尋法。2.優點是資料在搜尋之前不需要作任何的前置處理或排 序,缺點為搜尋速度較慢。3.因此在平均狀況下,循序搜尋法搜尋一筆資料大約需 要(n+1)/2的比較次數。 • 循序搜尋法分析:1.時間複雜度:如果資料沒有重覆,找到資料就可中止 搜尋的話,在最差狀況是未找到資料,需作n次比較, 時間複雜度為O(n)。2.當資料量很大時,不適合使用循序搜尋法。但如果預 估所搜尋的資料在檔案前端則可以減少搜尋的時間。

  24. 第九堂課:循序搜尋法程式 程式參考示例與練習:(重點解說) int search(int *data, int n, int key) {/* 資料比對的部分 */ int i; for(i=0; i<n; i++) /* 循序比對資料 */ if(data[i]==key) return i; /*找到傳回第i筆*/ return n; }/* 沒找到資料 */

  25. 第十堂課:二分搜尋法介紹 • 二分搜尋法原理:將已排序的資料分割成兩等份,再比較鍵值與中間值,如果鍵值小於中間值,可確定要找的資料在前半段,否則在後半部。如此分割數次直到找到或確定找不到(不存在)為止。 • 二分法分析:1.時間複雜度:因為每次搜尋都會比上一次少一半的範圍, 最多約只需要比較[log2n]+1,時間複雜度為O(log2n)。2.二分法必須事先經過排序,且資料量必須能直接在記憶體 中執行。適合用於不需增刪的靜態資料。 • 舉例說明: • 學生練習:隨機挑選若干張撲克牌,由學生(可分組進行)先操作排序法(演算法不拘)由小到大,再使用二分搜尋法找出指定的牌並互相觀察操作過程。

  26. 9 12 第十堂課:二分搜尋法介紹 • 舉例說明:例如以下已排序數列 2、3、5、8、9、11、12、16、18,而所要搜尋值為11時: (1)首先跟第五個數值9比較: (2)因11>9,故和後半部的中間值(第七個數值)12比較: (3)因11<12,故和前半部的中間值(第六個數值)11比較: (4)因為11=11,表示搜尋完成,如果不相等則表示找不到。

  27. 第11堂課:二分搜尋法程式 程式參考示例與練習:(重點解說) int binary(int *k, int n, int key) { int u, l, m; u=n; l=0; while(u>=l) { /*資料比對的迴圈部分*/ m=(u+l)/2; if(k[m]==key) return m; else if(k[m]<key) l=m+1; else u=m-1; } return -1; }

  28. 第12堂課:搜尋法分析 一、搜尋演算法程式改進討論: 二、搜尋演算法效能分析: 1.循序搜尋演算法: (1)無須事先排序。 (2)最好情形為1次。最差情形為n次(找不到)。 (3)與其資料項數成正比,時間複雜度為O(n)。 2.二分搜尋演算法: (1)須事先排序。 (2)最好情形為1次。最差情形為(log2n)+1次。 (3)時間複雜度為O(log2n)。 三、結論: 任何搜尋演算法:時間複雜度≦O(n)

  29. 結語 • 高中資訊課程重視資訊科學基本概念 • 九年一貫電腦課程著重資訊科技應用 • 除必修2學分外,具充分開課彈性 • 資訊科技概論 + 程式設計、應用軟體、專題 • 教學方法強調理論與實務並重 • 由實作中學習基本概念 • 重視學生對重要概念的理解 • 非細節、片段知識之記憶 • 培養學生對資訊科學的興趣為最重要目標

  30. 謝謝各位指教 問題討論vs 經驗分享 幸福不只是傳說,學生快樂學習,教師歡喜授課。你我都能做得到!

More Related