几个经典算法的概念
http://eriol.iteye.com/blog/1076296
動態規劃(Dynamic Programming)
?
一、動態規劃的基本思想:
? ? ? 動態規劃算法通常用于求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應于一個值,我們希望找到具有最優值的解。動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。與分治法不同的是,適合于用動態規劃求解的問題,經分解得到子問題往往不是互相獨立的。若用分治法來解這類問題,則分解得到的子問題數目太多,有些子問題被重復計算了很多次。如果我們能夠保存已解決的子問題的答案,而在需要時再找出已求得的答案,這樣就可以避免大量的重復計算,節省時間。我們可以用一個表來記錄所有已解的子問題的答案。不管該子問題以后是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。具體的動態規劃算法多種多樣,但它們具有相同的填表格式。
?
二、設計動態規劃法的步驟:
1. 找出最優解的性質,并刻畫其結構特征;
2. 遞歸地定義最優值(寫出動態規劃方程);
3. 以自底向上的方式計算出最優值;
4. 根據計算最優值時得到的信息,構造一個最優解。
?
? ? ? 步驟1-3是動態規劃算法的基本步驟。在只需要求出最優值的情形,步驟4可以省略,步驟3中記錄的信息也較少;若需要求出問題的一個最優解,則必須執行步驟4,步驟3中記錄的信息必須足夠多以便構造最優解。
?
三、動態規劃問題的特征:
? ? ?動態規劃算法的有效性依賴于問題本身所具有的兩個重要性質:最優子結構性質和子問題重疊性質。
1. 最優子結構:當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。
2. 重疊子問題:在用遞歸算法自頂向下解問題時,每次產生的子問題并不總是新問題,有些子問題被反復計算多次。動態規劃算法正是利用了這種子問題的重疊性質,對每一個子問題只解一次,而后將其解保存在一個表格中,在以后盡可能多地利用這些子問題的解。
?
?
回溯法(Backtracking)
?
一、算法思想
? ? ? 回溯法是一個既帶有系統性又帶有跳躍性的的搜索算法。它在包含問題的所有解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。算法搜索至解空間樹的任一結點時,總是先判斷該結點是否肯定不包含問題的解。如果肯定不包含,則跳過對以該結點為根的子樹的系統搜索,逐層向其祖先結點回溯。否則,進入該子樹,繼續按深度優先的策略進行搜索。回溯法在用來求問題的所有解時,要回溯到根,且根結點的所有子樹都已被搜索遍才結束。而回溯法在用來求問題的任一解時,只要搜索到問題的一個解就可以結束。這種以深度優先的方式系統地搜索問題的解的算法稱為回溯法,它適用于解一些組合數較大的問題。
?
二、算法框架:
1. 問題的解空間:應用回溯法解問題時,首先應明確定義問題的解空間。問題的解空間應到少包含問題的一個(最優)解。
2. 回溯法的基本思想:確定了解空間的組織結構后,回溯法就從開始結點(根結點)出發,以深度優先的方式搜索整個解空間。這個開始結點就成為一個活結點,同時也成為當前的擴展結點。在當前的擴展結點處,搜索向縱深方向移至一個新結點。這個新結點就成為一個新的活結點,并成為當前擴展結點。如果在當前的擴展結點處不能再向縱深方向移動,則當前擴展結點就成為死結點。換句話說,這個結點不再是一個活結點。此時,應往回移動(回溯)至最近的一個活結點處,并使這個活結點成為當前的擴展結點。回溯法即以這種工作方式遞歸地在解空間中搜索,直至找到所要求的解或解空間中已沒有活結點時為止。
? ? ?運用回溯法解題通常包含以下三個步驟:
(1) 針對所給問題,定義問題的解空間;
(2) 確定易于搜索的解空間結構;
(3) 以深度優先的方式搜索解空間,并且在搜索過程中用剪枝函數避免無效搜索;
3. 遞歸回溯:由于回溯法是對解空間的深度優先搜索,因此在一般情況下可用遞歸函數來實現回溯法。
?
?
分治策略(Divide and Conquer)
?
一、算法思想
任何一個可以用計算機求解的問題所需的計算時間都與其規模有關。問題規模越小,解題所需的計算時間往往也越少,從而也越容易計算。想解決一個較大的問題,有時是相當困難的。分治法的思想就是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
分治的基本思想是將一個規模為n的問題分解為k個規模較小的子問題,這些子問題互相獨立且與原問題相同。找出各部分的解,然后把各部分的解組合成整個問題的解。?
?
?
分支限界
?
一、分支限界法:
? ? ? 分支限界法類似于回溯法,也是一種在問題的解空間樹T上搜索問題解的算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出T中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出使用某一目標函數值達到極大或極小的解,即在某種意義下的最優解。
? ? ? 由于求解目標不同,導致分支限界法與回溯法在解空間樹T上的搜索方式也不相同。回溯法以深度優先的方式搜索解空間樹T,而分支限界法則以廣度優先或以最小耗費優先的方式搜索解空間樹T。分支限界法的搜索策略是:在擴展結點處,先生成其所有的兒子結點(分支),然后再從當前的活結點表中選擇下一個擴展對點。為了有效地選擇下一擴展結點,以加速搜索的進程,在每一活結點處,計算一個函數值(限界),并根據這些已計算出的函數值,從當前活結點表中選擇一個最有利的結點作為擴展結點,使搜索朝著解空間樹上有最優解的分支推進,以便盡快地找出一個最優解。
?
二、分支限界法的基本思想:
? ? ? 分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜索問題的解空間樹。問題的解空間樹是表示問題解空間的一棵有序樹,常見的有 子集樹和 排列樹。在搜索問題的解空間樹時,分支限界法與回溯法對當前擴展結點所使用的擴展方式不同。在分支限界法中,每一個活結點只有一次機會成為擴展結點。活結點一旦成為擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,那些導致不可行解或導致非最優解的兒子結點被舍棄,其余兒子結點被子加入活結點表中。此后,從活結點表中取下一結點成為當前擴展結點,并重復上述結點擴展過程。這個過程一直持續到找到所求的解或活結點表為空時為止。
?
三、選擇下一擴展結點的不同方式:
? ? 從活結點表中選擇下一擴展結點的不同方式導致不同的分支限界法。最常見的有以下兩種方式:
1. 隊列式(FIFO)分支限界法:隊列式分支限界法將活結點表組織成一個隊列,并按隊列的先進先出原則選取下一個結點為當前擴展結點。
2. 優先隊列式分支限界法:優先隊列式分支限界法將活結點表組織成一個優先隊列,交按優先隊列中規定的結點優先級選取優先級最高的下一個結點成為當前擴展結點。?
?
總結