13算法策略總結與比較


算法策略間的比較

算法策略和算法是有區別的,它們是算法設計中的兩個方面,算法策略是面向問題的,算法是面向實現的;但二者又是不可分的,首先是通過算法策略才找出解決問題的算法,其次對於用不同算法求解的問題算法策略是自然不同的。

 

“貪婪算法”

        這些策略求解的是最簡單的一類問題,或者說是對問題要求最嚴格的算法策略。“貪婪算法”解決這類問題是按一定順序(從前向后或從后向前等)一定的策略,只需考慮當前局部信息就能做出決策,即所謂局部最優就是全局最優。

 

“遞推法”

      “遞推法”和貪婪算法一樣也是由當前問題的逐步解決從而得到整個問題的解,只是依賴的是信息間本身的遞推關系,每一步不需要策略參與到算法中,它們更多地用於計算。

 

“遞歸法”

      和遞推法類似,遞歸法是利用大問題與其子問題間的遞歸關系來解決問題的。能采用遞歸描述的算法通常有這樣的特征:為求解規模為N的問題,設法將它分解成規模較小的問題,然后從這些小問題的解方便地構造出大問題的解,並且這些規模較小的問題也能采用同樣的分解和綜合方法,分解成規模更小的問題,並從這些更小問題的解構造出規模較大問題的解。特別地,當規模N=1時,能直接得解。

 

“枚舉法”

       枚舉法既是一個策略,也是一個算法,也是一個分析問題的手段。枚舉法的求解思路很簡單,就是對所有可能的解逐一嘗試,從而找出問題的真正解。當然這就要求所解的問題可能的解是有限的、固定的,不會產生組合爆炸、容易枚舉的。多用於決策類問題。這類問題都不易進行問題的分解,只能整體來求解。

 

“遞歸回朔法”

類似於枚舉法的思想,遞歸回朔法通過遞歸嘗試遍問題各個可能解的通路,發現此路不通時回朔到上一步繼續嘗試別的通路。

 

“分治法”

      求解的則是較復雜的問題,這類問題是可以被分解成獨立的子問題來解決的,將兩個或兩個以上的獨立子問題的解“合成”,就得到較大的子問題的解,最后合成為總問題的解。

 

“動態規划法”

      動態規划法與貪心法類似,是通過多階段決策過程來解決問題的。但每個階段決策的結果是一個決策結果序列,這個結果序列中最后采用哪一個結果取決於以后每個階段決策,因此稱為“動態”規划法。當然每一次的決策結果序列都必須進行存儲。因此,可以說“動態規划是高效率、高消費的算法”。

      另一方面,動態規划法與分治法類似,當問題不能分解為獨立的子問題,但又符合最優化原理(最優子結構性質)時,用動態規划,通過多階段決策過程從逐步找出子問題的最優解,從而決策出問題的結果。

 

 

算法策略間的關聯

 1. 對問題進行分解的算法策略---"分治法"與"動態規划法"

 2. 多階段過程"貪婪算法"、"遞推法"、"遞歸法"和"動態規划法"

 3. 全面逐一嘗試、比較"蠻力法"、"枚舉法"、"遞歸回溯法"

 4.算法策略的中心思想

 

1.對問題進行分解的算法策略---“分治法”與“動態規划法”

 

 

    “分治法”與“動態規划法”都是遞歸思想的應用之一,是找出大問題與小的子問題之間的關系,直到小的子問題很容易解決,再由小的子問題的解導出大問題的解。區別在於:

分治法所能解決的問題一般具有以下幾個特征:

 1) 該問題的規模縮小到一定的程度就可以容易地解決;

 2) 該問題可以分解為若干個規模較小的相同問題,即該問 題具有。

 3) 利用該問題分解出的子問題的解可以合並為該問題的解;

 4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。

第一條特征是絕大多數問題都可以滿足的;

  第二條特征是應用分治法的前提,它也是大多數問題可以滿足的;

  第三條特征是關鍵。

  第四條特征涉及到分治法的效率。

  動態規划的實質是分治思想和解決冗余。

 

 

2.多階段過程“貪婪算法”、“遞推法”、“遞歸法”和“動態規划法”

多階段過程就是按一定順序(從前向后或從后向前等)一定的策略, 逐步解決問題的方法。

    “貪婪算法”每一步根據策略得到一個結果傳遞到下一步,自頂向下,一步一步地作出貪心選擇。

     “動態規划法”則根據一定的決策, 每一步決策出的不是一個結果,而只是使問題的規模不斷的縮小,如果決策比較簡單,是一般的算法運算,則可找到不同規模問題間的關系,使算法演變成“遞推法”、“遞歸法”算法,所以說動態規划更側重算法設計策略,而不是算法。

       “遞推法”、“遞歸法”更注重每一步之間的關系,決策的因素較少。“遞推法”根據關系從前向后推,由小規模的結論,推解出問題的解。“遞歸法”根據關系先從后向前使大問題,轉化為小問題,最后同樣由小規模結論,推解出問題的解。

 

3.全面逐一嘗試、比較“蠻力法”、 “枚舉法”、“遞歸回溯法”

       考慮到有這樣一類問題,問題中不易找到信息間的相互關系,也不能分解為獨立的子問題,似乎只有把各種可能情況都考慮到,並把全部解都列出來之后,才能判定和得到最優解。對於規模不大的問題,這些策略簡單方便;而當問題的計算復雜度高且計算量很大時,還是考慮采用“動態規划法”這個更有效的算法策略。

      枚舉法算法的實現依賴於循環,通過循環嵌套枚舉問題中各種可能的情況,如八皇后問題能用八重循環嵌套枚舉。而對於規模不固定的問題就無法用固定重數的循環嵌套來枚舉了,有的問題可能通過變換枚舉對象也能用循環嵌套枚舉實現,但更多的任意指定規模的問題是靠遞歸回朔法來“枚舉”或“遍歷”各種可能的情況。比如n皇后問題只能用“遞歸回朔法”通過遞歸實現(當然可以通過棧,而不用遞歸)。

     

4.算法策略的中心思想

      所有算法策略的中心思想就是用算法的基本工具循環機制和遞歸機制實現算法。遞推法自然不用多說,貪婪算法就是逐步決策解決問題,動態規划也是。

 

 

算法策略側重的問題類型

    一般我們在實際應用中遇到的問題主要分為四類:判定性問題、計算問題、最優化問題和構造性問題。

   "遞推法"、"遞歸法"算法較適合解決判定性問題、計算問題。

   “貪婪算法”、“分治法” 、“動態規划法” 與“枚舉法” 較適合解最優化問題。

    構造性問題更多地依賴於人的經驗和抽象能力,算法一般是人類智能充分對問題解決步驟細化后才能得到算法,少有通用的算法策略。當然也有一些問題在構造過程中使用通用的算法策略。

 

 

下面就最優化問題討論如下:

    在現實生活中,有這樣的問題:他有n個輸入, 而他的解就由n個輸入的某個子集組成,只是這個子集必須滿足某些事先給定的條件。把那些必須滿足的條件稱為約束條件;而把滿足約定條件的子集稱為該問題的可行解。顯然,滿足約束條件的子集可能不止一個,因此,可行解一般來說是不唯一的。為了衡量可行解的優劣,事先也給出了一定的標准,這些標准一般以函數形式給出, 這些函數稱為目標函數。 那些使目標函數取極值的可行解, 稱為最優解, 這一類需求取最優解的問題, 又可根據描述約束條件和目標函數的 數學模型的特性或求借問題方法的不同,進行而細分為 線形規則、整數規則、非線形規則、動態規划等問題。

       盡管各類規划問題都有一些相應的求解方法,但其中的某些問題,還可用一種更直接的方法來求解,這種方法就叫貪心方法。

       動態規划法是將問題實例歸納為更小的、 相似的子問題, 並通過求解子問題產生一個全局最優解。其中貪心法的當前選擇可能要依賴已經作出的所有選擇, 但不依賴於有待於做出的選擇和子問題。 而分治法中的各個子問題是獨立的(即不包含公共的子子問題),因此一旦遞歸地求出各子問題的解后,便可自下而上地將子問題的解合並成問題的解。但不足的是, 如果當前選擇可能要依賴子問題的解時, 則難以通過局部的貪心策略達到全局最優解;如果各子問題是不獨立的,則分治法要做許多不必要的工作,重復地解公共的子問題。

動態規划在解決不獨立子問題時,是分為若干個階段進行的,而且在任一階段后的行為都僅依賴i階段的過程狀態, 而與i階段之前的過程如何達到這種狀態的方法無關,這樣的過程就構成一個多階段決策過程。 動態規划不僅求出了當前狀態到目標狀態的最優值,而且同時求出了到中間狀態的最優值。

       顯然,用枚舉的方法從所有可能的決策序列中選取最優決策序列是一種最笨的方法。

      最優性原理指出, 過程的最優序列有如下性質:無論過程的初始狀態和初始決策是什么,其余的決策都必須相對於初始決策所產生的狀態構成一個最優決策序列。

      如果求解問題的最優性原理成立, 則說明用動態規划方法有可能解決該問題。而解決問題的關鍵在於獲得各階段間的遞推關系式。因此, 從某種意義上說動態規划是一種找出子問題間遞推或遞歸關系的方法。

      動態規划相比一般窮舉也存在一定缺點:空間占據過多,但對於空間需求量不大的題目來說,動態規划無疑是最佳方法!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM