貪婪、分治、回溯和動態(tài)規(guī)劃,四種算法的比較

貪婪算法

貪婪算法,也被稱為“貪心算法”。貪婪算法分階段地工作。在每一個階段,都可以認為所作決定是好的,而不考慮將來的后果。一般來說,這意味著選擇的是某個局部的最優(yōu)。這種“眼下能夠拿到的就拿”的策略即是這類算法的來源。當算法終止時,我們希望局部最優(yōu)就是全局最優(yōu)。如果是這樣的話,那么算法就是正確的;否則,算法得到的就是一個次優(yōu)解。如果不要求絕對最佳答案,那么有時會用簡單的貪婪算法來生成近似的答案,而不是使用一般產生準確答案所需要的復雜算法。

分治算法

分治算法由兩部分組成:

  • 分(divide):遞歸解決較小的問題(當然,基本情況除外)。
  • 治(conquer):然后,從子問題的解構建原問題的解。

傳統(tǒng)上,在正文中至少含有兩個遞歸調用的例程叫做分治算法,而正文中只含有一個遞歸調用的例程不是分治算法。我們一般堅持子問題是不相交的(即基本上不重疊)。

在分治算法中,所有有效的分治算法都是把問題分成一些子問題,每個子問題都是原問題的一部分,然后進行某些附加的工作以算出最后的答案。

回溯算法

在許多情況下,回溯算法相當于窮舉搜索的巧妙實現(xiàn),但性能一般不理性。不過,情況并不總是如此,即使如此,在某些情況下下它相比蠻力(brute force)窮舉搜索,工作量也有顯著的節(jié)省。當然,性能是相對的;對于排序而言,O(N^2)的算法是相當差的,但對旅行售貨員(或任何 NP-完全)問題,O(N^2)算法則是里程碑式結果。

動態(tài)規(guī)劃

任何數(shù)學遞歸共識都可以直接翻譯成遞歸算法,但是基本現(xiàn)實是編譯器常常不能正確對待遞歸算法,結果導致低效的算法。當我們懷疑很可能是這種情況時,我們必須再給編譯器提供一些幫助,將遞歸算法重新寫成非遞歸算法,讓后者把那些子問題的答案系統(tǒng)地記錄在一個表內。利用這種方法的一種技巧叫做動態(tài)規(guī)劃(dynamic programming)。

區(qū)別和聯(lián)系

如果我們將這四種算法思想分一下類,那貪心、回溯、動態(tài)規(guī)劃可以歸為一類,而分治單獨可以作為一類,因為它跟其他三個都不大一樣。為什么這么說呢?前三個算法解決問題的模型,都可以抽象成我們今天講的那個多階段決策最優(yōu)解模型,而分治算法解決的問題盡管大部分也是最優(yōu)解問題,但是,大部分都不能抽象成多階段決策模型。

回溯算法是個“萬金油”。基本上能用的動態(tài)規(guī)劃、貪心解決的問題,我們都可以用回溯算法解決。回溯算法相當于窮舉搜索。窮舉所有的情況,然后對比得到最優(yōu)解。不過,回溯算法的時間復雜度非常高,是指數(shù)級別的,只能用來解決小規(guī)模數(shù)據(jù)的問題。對于大規(guī)模數(shù)據(jù)的問題,用回溯算法解決的執(zhí)行效率就很低了。

盡管動態(tài)規(guī)劃比回溯算法高效,但是,并不是所有問題,都可以用動態(tài)規(guī)劃來解決。能用動態(tài)規(guī)劃解決的問題,需要滿足三個特征,最優(yōu)子結構、無后效性和重復子問題。在重復子問題這一點上,動態(tài)規(guī)劃和分治算法的區(qū)分非常明顯。分治算法要求分割成的子問題,不能有重復子問題,而動態(tài)規(guī)劃正好相反,動態(tài)規(guī)劃之所以高效,就是因為回溯算法實現(xiàn)中存在大量的重復子問題。

貪心算法實際上是動態(tài)規(guī)劃算法的一種特殊情況。它解決問題起來更加高效,代碼實現(xiàn)也更加簡潔。不過,它可以解決的問題也更加有限。它能解決的問題需要滿足三個條件,最優(yōu)子結構、無后效性和貪心選擇性(這里我們不怎么強調重復子問題)。

其中,最優(yōu)子結構、無后效性跟動態(tài)規(guī)劃中的無異。“貪心選擇性”的意思是,通過局部最優(yōu)的選擇,能產生全局的最優(yōu)選擇。每一個階段,我們都選擇當前看起來最優(yōu)的決策,所有階段的決策完成之后,最終由這些局部最優(yōu)解構成全局最優(yōu)解。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容