算法複習-研一上

算法複習 

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

考試點:數組

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

每一個不一樣算法的基本思想與算法框架(基本步驟)函數

遞歸樹方法求解遞歸方程編碼

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

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

關鍵詞:最優子結構blog

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

 

遞歸分治算法

基本思想:將一個大的問題分紅若干小的子問題問題,分而治之遞歸

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

經典問題

二分搜索:

合併排序(將想要排序的序列分爲兩個大小相同的子集,而後分別排序,再合併 O(nlogn)):劃分策略是相似二分搜索,經過遞歸來一層層劃分直至只有一個,再一層層合併

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

大整數乘法(若要精確的求出大整數在乘法運算中全部位數上的值,須要用軟件的方法來求,):

有重複和無重複排列問題

貪心算法

基本思想:貪心算法老是作出當前最好的選擇,他指望經過局部最優解來獲得全局最優解

 能利用貪心算法來求解的算法通常有兩個特性:貪心選擇性質(原問題的總體最優解能夠經過一系列的局部最優的選擇獲得), 最優子結構(一個問題的最優解,包含其子問題的最優解)(因其具備最優子結構,能夠用動態規劃來求解,可是貪心會更加簡單)

經典貪心選擇問題

選擇排序 每次從剩下的序列裏選出最大的一個,造成最後的最優解

冒泡排序

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

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

求哈夫曼編碼:(前綴碼,任一字符的代碼都不能是其餘字符的前綴求得最優的編碼方案) 貪心策略:在全部節點中選取權值最小的兩個節點做爲新樹的左右節點,組成一個新的節點,權值爲二者之和

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

最小生成樹:

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

kruskal算法(選邊): 貪心策略:在全部的邊中,選取最小的且不造成環的邊

多機調度問題:

 

分治法、動態規劃法、貪心算法基本思想,以及區別和聯繫

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

不一樣點:

 

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

 

分治法是將原問題分解爲多個子問題,利用遞歸對各個子問題獨立求解,最後利用各子問題的解進行合併造成原問題的解。分治法將分解後的子問題當作是相互獨立的。

 

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

 

練習題

動態規劃  DP   多階段決策過程最優的通用方法

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

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

技巧: 

 

求解步驟: 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揹包問題

最大團問題

單源最短路經

裝載問題

相關文章
相關標籤/搜索