演算法(一)五大常用演算法雜談

2021-07-28 12:35:19 字數 4041 閱讀 7561

一、貪心演算法

1.設計思想

• 從問題的某乙個初始解出發逐步逼近給定的目標,每一步都作乙個不可回溯的決策,盡可能地求得最好的解。當達到某演算法中的某一步不需要再繼續前進時,演算法停止。

2.基本性質

1)貪心選擇性質

所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到。這是貪心演算法可行的第乙個基本要素,也是貪心法與動態規劃法的主要區別。

2) 最優子結構性質

該問題解的

整體最優性依賴於其

區域性子問題解的最優性。這種性質是可以採用貪心演算法解決問題的關鍵特徵。例如,活動安排問題,在選擇了一項活動後,它必須是最優的,否則不能得到全域性的最優。

3.貪心演算法的適用性

• 貪心演算法對問題只需考慮當前區域性資訊就要做出決策,也就是說使用貪心演算法的前提是「區域性最優策略能導致產生全域性最優解」。

•該演算法的適用範圍較小, 若應用不當, 不能保證求得問題的最佳解。更準確的方法是通過數學方法證明問題對貪心策略的選用性。

4.絕對貪心問題

例一:dijkstra單源最短路徑問題(有向圖)  

(dijkstra)演算法思想

按路徑長度遞增次序產生最短路徑演算法:

把v分成兩組:

(1)s:已求出最短路徑的頂點的集合

(2)v-s=t:尚未確定最短路徑的頂點集合

將t中頂點按最短路徑遞增的次序加入到s中

保證:1)從源點v0到s中各頂點的最短路徑長度都不大於 從v0到t中任何頂點的最短路徑長度

2)每個頂點對應乙個距離值

s中頂點:從v0到此頂點的最短路徑長度

t中頂點:從v0到此頂點的只包括s中頂點作中間 頂點的最短路徑長度

依據:可以證明v0到t中頂點vk的最短路徑,或是從v0到vk的 直接路徑的權值;或是從v0經s中頂點到vk的路徑權值之和

求最短路徑步驟

演算法步驟如下:

1. 初使時令 s=,t=,t中頂點對應的距離值

若存在,d(v0,vi)為弧上的權值

若不存在,d(v0,vi)為∝

2. 從t中選取乙個其距離值為最小的頂點w且不在s中,加入s

3. 對t中頂點的距離值進行修改:若加進w作中間頂點,從v0到vi的 距離值比不加w的路徑要短,則修改此距離值

重複上述步驟2、3,直到s中包含所有頂點,即s=t為止

輔助陣列:dist[ ] 存放v0到t中點距離  

path[ ]存放已經加入s中點到v0最短路徑

例二:kruskal最小生成樹問題(每次選權值最小邊,直到生成乙個最小生成樹)

演算法的執行時間為 o(nlog n)。

5.相對貪心問題

例一,取數遊戲。

•問題描述

有2個人輪流取2n個數中的n個數,取數之和大者為勝。設計演算法,讓先取數者獲勝,模擬取數過程。

•問題分析

這個遊戲一般假設取數者只能看到2n個數中兩邊的數(第一次取時,能看到6,5則取6),用貪心演算法的情況:

•例如若一組資料為:6,16,27,6,12,

9,2,11,6,5

用貪心策略每次兩人都取兩邊的數中較大的乙個數,先取者勝.以a先取為例:

取數結果為:

a  6,27,12,5,11=61  勝

b  16,6,9,6,2=39

•但若選另一組資料:16,27,7,12,9,2,11,6

仍都用貪心演算法,先取者a敗。

取數結果為:

a  16,7,9,11=43

b  27,12,6,2=47 勝

其實,若我們只能看到兩邊的資料,則此題無論先取還是後取都無必勝的策略。這時一般的策略是用近似貪心演算法。

但若取數者能看到全部2n個數,則此問題可有一些簡單的方法,有的雖不能保證所取數的和是最大,但確是乙個先取者必勝的策略。

二、分治演算法

三、動態規劃(各個問題包含公共子問題)

1.最優決策原理:要求問題具有最優子結構(即最優解包含子問題的最優解),是一種自底向上的求解思路,與遞迴正好相反,每次求解到乙個階段時,該階段求解所依賴的子問題已經完全求解完畢,因此每一步的求解都是在直到全部所需資訊的情況下進行的,因此可以得到全域性最優解。

2.動態規劃的決策過程:最優決策是在最後階段形成的,然後向前倒推,直到初始階段;而決策的具體結果及所產生的狀態轉移,卻是由初始階段開始進行計算的,然後向後遞迴或迭代,直到最終結果。

任何思想方法都有一定的侷限性,超出了特定條件,它就失去了作用。同樣,動態規劃也並不是萬能的。適用動態規劃的問題必須滿足最優化原理和無後效性。

(1).最優化原理(最優子結構性質) 最優化原理可這樣闡述:乙個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,乙個最優化策略的子策略總是最優的。乙個問題滿足最優化原理又稱其具有最優子結構性質。

(2).無後效性:將各階段按照一定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。換句話說,

每個狀態都是過去歷史的乙個完整總結。這就是無後向性,又稱為無後效性。

例題:著名的貨郎擔(旅行售貨商)問題

詳細解答參見博文------貨郎擔(旅行售貨商)

四、回溯

1.設計思想

回溯與分支限界技術實際上都是基於窮舉方法的,即按照一定規律,把問題所有可能的解組織成某種樹結構,形成可能的解空間樹或狀態空間樹。然後按照具體問題的約束條件,通過各種搜尋策略,遍歷可能的解空間樹。從而得到滿足問題條件的解或最優解。兩種演算法設計思路相近、本質一致。

2.回溯與分支限界法解決實際問題,大致可分為四個環節:

(1)確定問題的可能解空間,相當於找出進行窮舉的搜尋範圍。

(2)以一種便於搜尋的方式組織所有的可能解,一般是生成可能解

空間樹。

(3)以某種方式搜尋可能的解空間樹,有兩種基本搜尋方式。即:深度優先搜尋方式和,這就是回溯技術;廣度優先搜尋,就是分支限界技術。

(4)在搜尋過程中利用判定函式,也稱為限界函式,通過「剪枝」來加速搜尋過程。

3.回溯法的設計原理

按照深度優先搜尋的方式,從根結點出發搜尋狀態空間樹。

•   每搜尋到達狀態空間樹的乙個擴充套件結點,總是先判斷以該結點為根的子樹是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的進一步搜尋,該結點成為乙個死結點,同時應向上層回溯至最近的乙個活動結點。再以該活動結點作為當前新的擴充套件結點。以這種方式遞迴地在解空間中搜尋,直至找到問題的解,或者解空間中已無活動結點為止,即此問題無解。

•   在回溯法中,為了避免生成那些不可能產生最佳解的問題狀態,要不斷地利用限界函式來處死那些實際上不可能產生所需解的活動結點,以減少問題的計算量。所以,回溯法應是具有限界函式的深度優先搜尋法。

用回溯法解題時,常遇到兩類典型的解空間樹,子集樹與排列樹。

例題:著名的八皇后問題

詳細解答參見博文------八皇后問題

五、分支限界(求問題在某種意義下的最優解)

1.分支限界法的設計原理

分支限界法類似於回溯法,也是一種在問題的狀態空間樹上搜尋解的演算法。但是,分支限界法與回溯法有不同的求解目標。回溯法的求解目標是找出狀態空間樹中的所有回答結點或任一回答結點,分支限界法的求解目標則是找出使得某一目標函式達到極小或極大的乙個問題結點。

2.分支限界法與回溯法有兩點不同:

(1)求解目標不同。回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解或最優解。

(2)搜尋方式不同。回溯法以深度優先的方式搜尋解空間樹,而分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹。

3.常見的兩種分支限界法

(1)佇列式(fifo)分支限界法

按照佇列先進先出(fifo)原則選取下乙個結點為擴充套件結點。 

(2)優先佇列式分支限界法

按照優先佇列中規定的優先順序選取優先順序最高的結點成為當前擴充套件結點。

4.常見問題

裝箱問題、佈線問題、單源最短路徑問題、最大團問題、0-1揹包問題、旅行售貨問題。

五大常用演算法

主要是演算法演算法的複雜度 1.分治法 話說遞迴與hanoi塔 二分法求方程近似解 用c 實現合併排序 求最大值和最小值的分治演算法 2.動態規劃法 動態規劃求0 1揹包問題 最長公共子串問題的實現 用動態規劃實現飛彈攔截 最大化投資回報問題的實現 3.貪心演算法 最小生成樹之prim演算法 最小生...

五大常用演算法 貪心演算法

一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...

五大常用演算法 貪心演算法

貪心演算法是指 在每一步求解的步驟中,它要求 貪婪 的選擇最佳操作,並希望通過一系列的最優選擇,能夠產生乙個問題的 全域性的 最優解。貪心演算法每一步必須滿足一下條件 1 可行的 即它必須滿足問題的約束。2 區域性最優 他是當前步驟中所有可行選擇中最佳的區域性選擇。3 不可取消 即選擇一旦做出,在演...