Hust 軟院 《演算法結業報告》

2021-10-05 18:18:40 字數 3203 閱讀 6943

《演算法設計分析》結課報告

總覽在本學期的演算法課程學習中,主要學習了以下內容:

演算法的漸進分析 分治策略 隨機化演算法

統計演算法 排序問題 動態規劃 貪心演算法

圖演算法:基本圖演算法,最小生成樹,單源最短路徑,所有結點對的最短路徑問題,以及最大流

通過對以上內容的學習,讓我對大二上的資料結構課程內容有了進一步的理解,同時也對演算法設計有了更深的體悟。

內容概述

演算法:演算法可以看成用於求解良說明的計算問題的工具。一般來說,問題陳述了期望的

輸入/輸出關係,而演算法則描述乙個特定的計算過程來實現該輸入/輸出關係。

演算法的漸進分析

當輸入規模足夠大,使得只有執行時間的增長量級有關時,我們要研究演算法的漸進效率,也就是說,我們關心當輸入規模無限增加時,在極限中,演算法的執行時間如何隨著輸入規模的變大而增加 。對於演算法的漸進分析,我們有以下漸進記號:

θ:θ(g(n))=,這裡的θ(g(n))是乙個集合,g(n)是f(n)的乙個漸進緊確界。

ο: ο(g(n))=,此時只有乙個漸進上界g(n),我們用這個記號來描述上界,那麼可以用它來描述最差執行時間,關於演算法在每個輸入上的執行時間,我們也有乙個界,例如,執行時間為o(n²),意思是存在乙個o(n²)的函式f(n),對於n的所有值,不管選擇什麼特定規模的規模為n的輸入,其執行時間的上界都是f(n),也就是說最壞情況執行時間為f(n)。

ω:與o相對,這個符號提供了漸進下界,ω(g(n))=,不管選擇什麼規模為n的輸入,只要n足夠大,對那個輸入的執行時間至少為g(n)的常量倍

ω:ω(g(n))=;其中的乙個子集, k是某個小於n的整數,並且設p為其中權重最小的路徑(路徑p是簡單路徑)。

演算法利用了路徑p和從i到j之間中間結點均取自集合的最短路徑之間的關係。該關係依賴於結點k是否是路徑p上的乙個中間結點。如果結點k不是路徑p上的中間結點,則路徑p上的所有中間結點一定屬於集合;所以從結點i到j的中間結點取自的最短路徑也是結點i到j的中間結點取自的最短路徑。如果結點k是路徑p上的中間結點,則路徑p可以表示為ikj;其中ik為路徑p1,kj為路徑p2.顯然,路徑p1上的所有中間結點必定在中,自然,p1是從結點i到k的中間結點位於的最短路徑。對於p2實際上也是同理,很容易退出,p2也是從結點k到j上的中間結點位於的一條最短路徑。

得到遞迴解:

典型問題分析
*最長公共子串行(lcs)

子串行:給定乙個序列x=,另乙個序列z=,若存在乙個嚴格遞增的x的下標序列對所有的1,2,3,…,k,都滿足x(ik)=zk,則稱z是x的子串行。

公共子串行:給定兩個序列x和y,如果z既是x的子串行,也是y的子串行,那麼z是x和y的公共子串行。

求解x=(x1,x2…….xm)和y=(y1,y2……yn)的最長公共子串行:

如果採用暴力法,那麼就要窮舉出x的所有子串行,對每個子串行都檢查它是否是y的子串行,記錄找到的最長子序列,執行時間為指數階,對於較長的序列是不適用的。

設x=,y=為兩個序列,z=是他們的任意公共子串行

經過分析,我們可以知道:

1、如果xm = yn,則zk = xm = yn 且 zk-1是xm-1和yn-1的乙個lcs

2、如果xm != yn 且 zk != xm,則z是xm-1和y的乙個lcs

3、如果xm != yn 且 zk != yn,則z是x和yn-1的乙個lcs

所以如果用乙個二維陣列c表示字串x和y中對應的前i,前j個字元的lcs的長度話,可以得到以下公式:

p1表示x的前 i-1 個字元和y的前 j 個字元的lcs的長度

p2表示x的前 i 個字元和y的前 j-1 個字元的lcs的長度

p表示x的前 i-1 個字元和y的前 j-1 個字元的lcs的長度

p0表示x的前 i 個字元和y的前 j 個字元的lcs的長度

如果x的第 i 個字元和y的第 j 個字元相等,則p0 = p + 1

如果x的第 i 個字元和y的第 j 個字元不相等,則p0 = max(p1,p2)

根據上面的公式,我們很容易就可以寫出遞迴計算lcs問題的程式,通過這個程式我們可以求出各個子問題的lcs的值,時間複雜度為o(m*n),此外,為了求解最優解本身,我們好需要乙個表b,b[i,j]記錄使c[i,j]取值的最優子結構。

從方法的實現中可以看出計算lcs的過程中時間複雜度是ο(mn),空間複雜度也是ο(mn)。在構造最長公共子串行的過程中時間複雜度為ο(m+n);但是我們可以不適用表b,我們可以直接利用表c的資訊構造lcs; 因為c[i,j]的值只依賴於三項:c[i-1,j],c[i,j-1],c[i-1,j-1]。這樣就為記憶體節約了乙個ο(mn)空間。但是計算lcs的輔助空間並未減少,因為表c的空間複雜度依然是ο(mn)。

比如:x=(a,b,c,b),y=(b,d,c,a)

因此可以得到這兩個序列的最長公共子串行的長度為2。

*活動選擇問題

問題描述:假設有乙個n個活動的集合s=,這些活動使用同乙個資源,並且這個資源在某個時刻只能供乙個活動使用,每個活動都有乙個開始時間si,結束時間fi,如果被選中,活動ai發生時間區間[si,fi]期間,如果兩個活動的時間區間不重疊,則稱他們相容,我們希望選出乙個最大相容活動集,假設活動按照結束時間的單調遞增順序排序:f1≤f2…. ≤fn

從上面可見,我們觀察可得相容子集有:,但是這個並不是最大相容子集,因為也是這個活動的最大相容子集,於是我們將活動選擇問題描述為:給定乙個集合s=s=,在相同的資源下,求出最大相容活動的個數。

動態規劃解法:

sijsij表明是在aiai之後ajaj之前的活動集合

這裡子問題數量為o(n2),每乙個子問題有o(n)種選擇,於是動態規劃的時間代價為o(n3)。

貪心選擇:

選取乙個活動,使得去掉這個活動以後剩下的資源最多,即選擇占用時間fi-si最小的乙個,或者選擇最早結束的活動,這裡我們選擇第二種方案,每次選擇子問題最早結束的活動加入到最優解中。證明選擇的正確性:

令ak是sk的乙個最大相容子集,aj是ak中最早結束的活動,將aj從ak中去掉得到ak-1,它也是乙個相容子集,假設ai是sk中最早結束的活動,那麼有fi≤fj,將活動ai張貼到ak-1中,得到乙個新的相容子集ak1,則|ak|==|ak1|,於是ak1也是sk的乙個最大相容子集

因此我們可以反覆選擇最早結束的活動,保留與此活動相容的活動,重複,直到不再有剩餘活動,因為活動的結束時間是嚴格遞增的,所以只需按照順序處理所有活動,每個活動處理一次

遞迴貪心演算法:

迭代貪心演算法

執行時間均為θ(n)。可見在這個問題的解決過程中,貪心演算法比動態規劃耗時更少,但是貪心演算法並不能每次都能得到正確的答案。

北航軟院初試總結

距離2020考研已經過去兩個多月了,成績也在十天前出來了。分數不高 政治 60,英語 55,數學二 71,專業課 資料結構與c語言 125,總分311.按照去年北航的分數線285來看,應該算過線了。總結一下考研的經歷 1 數學,是關乎考研成敗的一科,北航的數學單科線2019年是60分,雖然不高,但是...

軟院專案執行篇

在軟體專案管理的課程中提到時間是軟體開發中比較難以控制的變數。專案組成員個人開發能力和進度,對環境以及編輯器的熟悉程度往往影響著整個專案的進度。故在專案開始前兩天,我們沒有著手去寫關於專案的 而是給組員充分的時間去熟悉編輯器,先培養感情。在6 7號早上,每乙個人就開始了每個人的part內容的編寫。由...

2017軟院金山WPS補題 L

比賽的時候題意看不懂。然後就卡了。l題就是模擬作業系統的lru演算法。就是維護乙個鍊錶,如果要替換的話就找到最後乙個替換,如果要插入的話就插入到開頭,如果在鍊錶中已經存在的話,就把這個提到鍊錶的開頭,然後搞一下就行了。看了別人的做法,用的是queue map cnt與queue中的元素個數不是同步的...