資料結構與演算法- 五大常用演算法總結(分治法,回溯法,分治限界法,貪心演算法,動態規劃法)
1.分治法(Recurrence and Divide-Conquer)
對於一個規模為n的問題,若該問題可以容易解決(比如說規模n較小)則直接解決,否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解決這些子問題。然後將各個子問題的解合併得到原問題的解
2.回溯法(Back Tracking Method)
在回溯法中,每次擴大當前部分解時,都面臨一個可選的狀態集合,新的部分解就通過在該集合中選擇構造而成。這樣的狀態集合,其結構是一棵多叉樹,每個樹結點代表一個可能的部分解,它的兒子是在它的基礎上生成的其他部分解。樹根為初始狀態,這樣的狀態集合稱為狀態空間樹
回溯法對任一解的生成,一般都採用逐步擴大解的方式。每前進一步,都試圖在當前部分解的基礎上擴大該部分解。它在問題的狀態空間樹中,從開始結點(根結點)出發,以深度優先搜尋整個狀態空間。這個開始結點成為活結點,同時也成為當前的擴充套件結點。在當前擴充套件結點處,搜尋向縱深方向移至一個新結點。這個新結點成為新的活結點,併成為當前擴充套件結點。如果在當前擴充套件結點處不能再向縱深方向移動,則當前擴充套件結點就成為死結點。此時,應往回移動(回溯)至最近的活結點處,並使這個活結點成為當前擴充套件結點。回溯法以這種工作方式遞迴地在狀態空間中搜索,直到找到所要求的解或解空間中已無活結點時為止。
回溯法與窮舉法
3.分治限界法(Branch-and-Bound)
分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜尋問題的解空間樹。
在分支限界法中,每一個活結點只有一次機會成為擴充套件結點。活結點一旦成為擴充套件結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優解的兒子結點被捨棄,其餘兒子結點被加入活結點表中。此後,從活結點表中取下一結點成為當前擴充套件結點,並重覆上述結點擴充套件過程。這個過程一直持續到找到所需的解或活結點表為空時為止。
分治界限與回溯法之間的差異:
1)控制條件:回溯法一般使用約束函式產生部分解,如果瞞住約束條件則繼續擴大該解;否則丟棄重新搜尋,而在分治界限法中,除了使用約束函式外,還使用更有小的評判函式---目標函式控制搜尋程序,使盡快得到最優解
2).搜尋方式:回溯法種的搜尋一般是以深度優先反向搜尋,而在分支界限中一般是以廣度優先方式進行
從活結點表中選擇下一擴充套件結點的不同方式導致不同的分支界限方法。常用的有下列兩種方式
- 佇列式(FIFO) 分支界限法:將活結點表組成一個佇列,並按照佇列的先進先出原則選取下一個結點為當前擴充套件結點
- 優先佇列式分支界限法:將活結點表組織成一個優先佇列。並按照優先佇列中結點優先順序選取優先順序最高的下一個結點成 為當前擴充套件結點
4.貪心演算法(Greedy Method)
貪心演算法通過一系列的選擇得到問題的解。它所做出的每一個選擇都是當前狀態下區域性最好選擇,即貪心選擇。這種啟發式的策略並不總能獲得最優解。然而在許多情況下的確能得到最優解
性質: 貪心選擇性質和最優子結構性質
貪心選擇性質: 貪心選擇性質是指所求問題的整體最優解可以通過一序列區域性最優的選擇(貪心選擇)來達到。它採用自頂向下的方式將所求問題簡化為規模更小的子問題
最優子結構的性質:當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質
5.動態規劃法(Dynamic Programming)
動態規劃演算法的基本思想與分治法和回溯法類似,也是基於問題的劃分解決方案(多步決策,遞增生成子解)。動態規劃是一種將問題例項分解為更小的,相似的子問題,並存儲於子問題的解而避免計算重複的子問題,以解決最優化問題的演算法策略。但在遞增生成子解的過程中,力圖朝最優方向進行,而且也不回溯,因此比動態規劃效率要高,且常用來求最優解,而不像回溯法那樣可直接求全解
注意事項與滿足條件:即最優化原理(最優子結構性質)和子問題的重疊性