算法分析與設計——分治法實驗報告


 

   算法導論  課程設計

 

 

題    目:  算法導論課程設計實驗報告  

 

 

 

 

 

學院班級:        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個規模較小而結構與原問題相似的子問題,遞歸地解決這些子問題,然后合並其結果,得到子問題的解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM