算法導論 課程設計
題 目: 算法導論課程設計實驗報告
學院班級: 1613013 學 號: 16130130216 姓 名: 庫 妍 主講教師: 張立勇 日 期: 2019.6.3 |
錄
分治法
一、Implement exercise 2.3-7........................................4
二、Implement priority queue........................................6
三、Quicksort.......................................................8
四、找出第k大的元素...............................................10
動態規划法
一、Matrix-chain product...........................................13
二、Longest Common Subsequence (LCS)................................15
三、Longest Common Substring.......................................16
四、Max Sum........................................................18
五、Shortest path in multistage graphs.............................19
貪心法
一、Knapsack Problem...............................................22
二、scheduling problem.............................................23
三、Single-source shortest paths...................................24
四、All-pairs shortest paths.......................................26
回溯法
一、0/1 Knapsack Problem...........................................29
二、8-Queen problem................................................30
算法導論 課程設計
題 目: 分 治 法
學院班級: 1613013 學 號: 16130130216 姓 名: 庫 妍 主講教師: 張立勇 日 期: 2019.3.21 |
一、Implement exercise 2.3-7
1、實驗題目
描述一個運行時間為O(nlgn)的算法,給定n個整數的集合S和另一個整數x,該算法能確定S中是否存在兩個其和剛好為x的元素。
2、使用的算法
(1)運用歸並排序算法,先對集合中的整數進行排序。
(2)歸並排序后,運用二分查找兩個數和為x的元素。
3、算法分析與設計
(1)首先將S進行排序,然后再通過查找算法進行查找。插入排序算法復雜度最差O(n^2),歸並排序最差為O(nlgn),堆排序為最差為O(nlgn),快速排序最差為O(n^2),這里直接使用歸並排序。歸並排序運用的是分治思想,時間復雜度為 O(nlgn),能夠滿足題目要求的運行時間。
①分解(devide):歸並排序將n個元素分成各含n/2g個元素的子序列,對已經分解的兩個部分再進行分解直到將數組分解成單個元素為止。
②解決(conquer):用合並排序法遞歸求解排序子序列。
③合並(combine):合並部分是將已經排序的兩個子序列進行合並得到結果。
(2)二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好,占用系統內存較少。折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,采用分治策略,可在最壞的情況下用O(lg n)完成搜索任務。它的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如 果x<a[n/2],則我們只要在數組a的左半部繼續搜索x(這里假設數組元素呈升序排列)。如果x>a[n/2],則我們只要在數組a的右 半部繼續搜索x。
1、項目測試(功能與性能)
時間復雜度為O(nlgn)
1、實驗總結
遇到的問題及解決:
MERGE過程中,子數組A[p..q]和A[q+1..r],待合並個數n1 = q - p + 1,n2 = r - q,計算時容易出錯。
另外,進行二分查找時right = A.length - 1,數組最后一個元素的下標是數組A的長度減1。
二、Implement priority queue
1、實驗題目
實現優先級隊列,即需要支持以下操作:INSERT(S,x):把元素x插入到集合S中;MAXMUM(S):返回S中具有最大key的元素;EXTRACT-MAX(S):去掉並返回S中的具有最大key的元素; INCREASE-KEY(S,x,k):將元素x的關鍵字值增到k。
2、使用的算法
運用堆排序,來實現優先隊列。
3、算法分析與設計
(1)堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復雜度均為O(nlogn),它也是不穩定排序。堆排序算法分為3個過程,MAX-HEAPIEY:調整堆以滿足小頂堆性質,其時間復雜度為O(lgn);BUILD-MAXHEAP:從無序的輸入數據數組中構造小頂堆,其時間復雜度為線性時間;HEAP-SORT:對數組進行原址排序,其時間復雜度為O(nlgn)。
(2)在堆的基礎上實現優先隊列INSERT、MAXMUM、EXTRACT-MAX、INCREASE-KEY,時間復雜度為O(lgn)。
4、項目測試(功能與性能)
1、實驗總結
編寫HEAP-EXTRACT-MAX函數的時候,當去掉第一個元素后,程序要調用MAX-HEAPIFY進行調整堆,否則最后序列是無序狀態。另外,開始沒有理解BUILD-MAX-HEAP的過程,當對某結點調用BUILD-MAX-HEAP時,該結點的兩棵子樹都已是最大堆。
三、Quicksort
1、實驗題目
實現quick_sort算法,並且回答以下兩個問題:
(1)待排數組中的元素值都相同的情況下,運用quick_sort需要進行多少次比較?
(2)對於n個元素的數組,運用quick_sort舉出需要進行比較次數的上限和下限是多少?
2、使用的算法
使用了快速排序算法。
3、算法分析與設計
快速排序采用分治策略,時間復雜度為O(nlgn),但是最壞情況下為O(n2),並且快速排序算法屬於原地排序,並不需要開辟空間。快速排序復雜的步驟為其分解的步驟。
①分解(divide):數組A[p..r]被划分為兩個子數組A[p..q-1]和A[q+1..r], 使得A[p..q-1]中的每個元素都小於等於A[q],而且,小於等於A[q+1..r] 中的每個元素。下標q也在這個划分過程中進行計算。
②解決(conquer):通過遞歸調用快速排序,對子數組A[p..q-1]和A[q+1..r] 進行排序。
③合並(combine):因為兩個子數組是就地排序的,將它們的合並不需要操 作,整個數組A[p..r]已排序。
4、項目測試(功能與性能)
5、實驗總結
問題回答:
(1)當選擇第一個或最后一個參考點時,當n個元素相同時為最壞情況,比較的數目是n *(n-1)/ 2。
(2)快速排序比較的最小數目是nlgn,最大的比較數是n^2。
四、找出第k大的元素
1、實驗題目
運用分治的策略將兩個已經排好序的序列中,找出第k大的元素,且要求時間復雜度為O(lgm + lgn),其中m和n分別為兩個序列的長度。
2、使用的算法
使用分治策略
3、算法分析與設計
解法一:
(1)分解:因為已經是兩個獨立的的序列,所以不用進行分解。
(2)解決:因為兩個序列為已經排好的序列,因此不用分開進行排序。
(3)利用歸並排序中的merge函數,將這兩個序列分別看成是L[]和R[]兩個數組,通過開辟一個新的數組,將兩個數組合並成一個新的排好序的序列,在根據要求的k值,對新的數組進行取值。
解法二:題目只要求第k大的數,沒必要花力氣將數組全部再排序,可以定義兩個游標分別指向兩個有序數組,按序移動,並用count計數,當count等於k時,返回兩個游標指向的數中最小的那一個。
4、項目測試(功能與性能)
時間復雜度為O(lgm + lgn)。
5、實驗總結
理解分治策略的三個步驟:分解、解決和合並在具體問題上的應用,根據時間復雜度與所學的算法進行結合。為了解決一個問題,算法要一次或多次地調用其自身來解決相關的子問題,這些算法常采用分治策略。分治法將原問題划分成n個規模較小而結構與原問題相似的子問題,遞歸地解決這些子問題,然后合並其結果,得到子問題的解。