演算法複習 研一上

2022-05-07 09:18:08 字數 4175 閱讀 4916

兩遍複習,第一遍 先過算啊發   第二遍,從題目入手

考試點:

第一章,時間複雜度排序  時間複雜度計算步驟    排序(快速排序 歸併排序)

每個不同演算法的基本思想與演算法框架(基本步驟)

遞迴樹方法求解遞迴方程

分治法、動態規劃法以及貪心演算法的設計思想並簡要分析三種方法的異同

包含主題: 貪心演算法 , 分治法,動態規劃,回溯法,分支限界,線性規劃

q:貪心與動態規劃中間的聯絡和區別 p93 後面總結 (背部問題,0-1揹包問題)

基本思想:將乙個大的問題分成若干小的子問題問題,分而治之

一般步驟:1.分解將原問題分為若干規模小,相互獨立與原問題形式相同的問題   2.求解,求解各個子問題,當問題被劃分的足夠小的時候,就能很容易求解     3.合併,將子問題逐層合併,得到最後的解

二分搜尋:

合併排序(將想要排序的序列分為兩個大小相同的子集,然後分別排序,再合併 o(nlogn)):劃分策略是類似二分搜尋,通過遞迴來一層層劃分直至只有乙個,再一層層合併

快速排序:(將序列按照a[i]來劃分兩個子集,第乙個子集裡面都比a[i]小,第二個子集都比a[i]大) :

大整數乘法(若要精確的求出大整數在乘法運算中所有位數上的值,需要用軟體的方法來求,):

有重複和無重複排列問題

基本思想:貪心演算法總是做出當前最好的選擇,他期望通過區域性最優解來得到全域性最優解

能利用貪心演算法來求解的演算法一般有兩個特性:貪心選擇性質(原問題的整體最優解可以通過一系列的區域性最優的選擇得到), 最優子結構(乙個問題的最優解,包含其子問題的最優解)(因其具有最優子結構,可以用動態規劃來求解,但是貪心會更加簡單)

選擇排序 每次從剩下的序列裡選出最大的乙個,形成最後的最優解

氣泡排序

最優裝載(如何將最多的貨物裝上船) 採用重量最輕者優先的貪心策略來進行  

活動安排(在會議時間不衝突的情況下,用有限的時間來進行最多的會議) 1.貪心策略的選擇,a.最早開始與時間不衝突策略,b.最短持續時間與不衝突策略 c.最早結束時間與不衝突策略 我們選擇c貪心策略,

求哈夫曼編碼:(字首碼,任一字元的**都不能是其他字元的字首求得最優的編碼方案) 貪心策略:在所有節點中選取權值最小的兩個節點作為新樹的左右節點,組成乙個新的節點,權值為兩者之和

單源最短路徑(dijkstra演算法,求得最短路徑(插值法)) :貪心策略,從初始狀態開始,乙個乙個的加入與之相連的值,然後求出當前所有節點的最短路徑,當將所有的點都加入時,就是最後的結果

最小生成樹:

prim演算法(加邊): 貪心策略:在當前的子樹中,選取與之相連的最小權值且不形成環的邊

kruskal演算法(選邊): 貪心策略:在所有的邊中,選取最小的且不形成環的邊

多機排程問題:

分治法:將原問題劃分為n個規模較小而結構與原問題相似的子問題,遞迴地解決這些子問題,然後再合併其結果,就可得到原問題的解(即遞迴解決)

動態規劃:核心思想是將子問題的計算結果儲存起來,如果再次遇到同一問題,就不用再次計算了。一般來說動態規劃是自下而上計算答案的集合。

思路:將子問題列成**,寫入**中已知的初始值,寫出狀態轉移方程(填表);

貪心演算法:貪心演算法是對演算法中的每乙個決策點做乙個看起來是最佳的選擇,然後繼續以用同樣的決策方式計算由此產生的子問題。

動態規劃和貪心演算法共同點求解的問題都具有最優子結構性質。

分治法與動態規劃的相同點:

分治法與動態規劃,二者要求原問題具有子結構,都是將問題分而治之分解成若干個規模較小的子問題;

不同點:

動態規劃是將原問題分解為多個子問題,通過計算出子問題的結果構造乙個最優解。動態規劃通過迭代法自底向上求解,動態規劃將分解後的子問題理解為相互間有聯絡,有重疊的部分;

分治法是將原問題分解為多個子問題,利用遞迴對各個子問題獨立求解,最後利用各子問題的解進行合併形成原問題的解。分治法將分解後的子問題看成是相互獨立的。

貪心演算法:依賴於當前已經做出的所有選擇,採用自頂向下(每一步根據策略得到當前乙個最優解,保證每一步都是選擇當前最優的解決方法。

基本要素:最優子結構原問題最優解包含子問題最優解重疊子問題性質 求解子問題過程中,很多子問題是重複的,那麼只需求解一次,然後把結果存在表中,以後直接使用這個條件不是必要條件,只是子問題重疊更能體現動態規劃的優勢

與分治演算法的關係與區別: 分出的子問題往往不相互獨立, 用乙個表來記錄已經解決的子問題

技巧: 

求解步驟: 1.找出最優解性質(交疊的子問題)  交疊子問題的初始條件(邊界條件)    2.遞迴定義最優值      3.自底向上計算最優值      4. 根據最優值得到的資訊來得到最優解

動態規劃在形式上往往表現為填矩陣的形式

動態規劃的難點在於前期的設計:

a)怎麼描述問題,使它能表述為乙個動態規劃問題(具備什麼特徵?最有子結構,多階段決策,思考)

b)遞推式的寫出(逆向思維去分析或正向思維去遞迴),確定你要求的是哪個值

c)有了遞推式可以畫個矩陣的圖(一般只從式子上不太容易看出來,當然,對於牛人來說可以藐視),

在圖中關注以下兩點:

初始條件

填矩陣的順序(即怎麼去寫**控制語句)

完全不存在具有後效性狀態定義的問題應該都是貪心問題

分治:1.分成獨立的子問題 2.自頂向下求解 

dp: 1.分為重疊的子問題 2 自底向上求解

備忘錄方法是用**來保持遞迴中重複的子問題的方法,與動態規劃的區別主要是:

備忘錄:遞迴方式是自頂向下,  動態規劃是自底向上 

斐波那契數列

矩陣連乘  1.a[1,n] 最優次序包含 a[1,k] 和a[k+1,n]的最優解   2.將其建立遞迴關係  3.計算最優值 遞迴問題中很多子問題被重複計算,使其遞迴式自底向上計算,用陣列儲存   4.構造最優解 根據a[1][n]中的內容,來回構次序

最長公共子串行  c[i][j]   1.最優公共子結構    2.如何來定義遞迴   c[i][j] 記錄xi yi 的最長公共子串行長度

0-1揹包問題

最大欄位和 普通,分治,動態規劃三種解法

是乙個既帶有系統性又帶有跳躍性的搜尋演算法,他在問題的解空間樹里,按照深度優先策略,從根節點去搜尋. 適用於解組合數較大的問題  

解法步驟: 

1.確定問題的解空間  

2.確定易於搜尋的解空間結構

3.以深度優先來搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋

子集樹 :解的長度不是固定的,並且解和元素順序無關

排列樹 : 由n個元素的排列形成

0-1 揹包問題

最大團

著色問題

廣度優先演算法搜尋問題的解空間樹

從活節點表選取下一拓展借點的不同方式導致不同的分支限界法

佇列式分支限界法  (按照先進先出)

優先佇列式分支限界法  (按照優先順序)

(1)求解目標方面

回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使一目標函式值達到極大或極小的解,即在某種意義下的最優解。

(2)搜尋方式方面

回溯法採用深度優先搜尋方式,而分支限界法採用廣度優先搜尋或是最小耗費優先搜尋解空間樹。

2.回溯法與分支限界法的聯絡:

二者都是在問題的解空間樹t上搜尋問題解的演算法。

0-1揹包問題

最大團問題

單源最短路經

裝載問題

研一上總結

讀研滿第乙個月的時候想來個總結,於是有了如下這個markdown emmm,拖了幾天之後,就有了下面的這個markdown 回顧我的研一上,很多時間是在忙著上課,很少的時間是在科研,極其少的時間在提公升自我。先說上課吧。學位課選了三門 有限自動機 演算法設計與分析和隨機過程及應用。前兩門的授課內容我...

大一上覆習

一 前兩章 1 基本變數的資料型別,定義方式 變數的特點 2 基本運算子和表示式 和 自加自減運算子的字首和字尾形式.條件運算子和表示式 3 格式輸入和輸出函式printf和scanf 4 資料型別的強制轉化 二 選擇結構 1 if else語句 重點是多個if else語句的巢狀,如何辨別多個el...

期末總結 研一上學期的回顧與反思

彙總貼 北郵讀研期間的打怪公升級 這學期的工作我主要從以下三個方面來展開 知識學習 實踐 認知提公升。我基本上一直在按著這三個路徑來安排自己的進度。大概就是看了幾本專業相關的書,聽了幾門課,做了一些前端以及nlp的實踐專案,參加了下比賽,聽了幾次講座,讀了幾本社科類的書。1.1 書籍 1.2 課程 ...