? ? 1貪心算法
? ? ? ? 這節(jié)課學(xué)習(xí)了貪心算法。實(shí)際上,貪心算法適用的場(chǎng)景比較有限。這種算法思想更多的是在指導(dǎo)設(shè)計(jì)基礎(chǔ)算法。比如最小生成樹(shù)算法、單源最短路徑算法,這些算法都用到了貪心算法。我們不需要刻意去記憶貪心算法的原理,多練習(xí)才是最有效的學(xué)習(xí)方法。
? ? ? ? 貪心算法的最難的一塊是如何將要解決的問(wèn)題抽象成貪心算法模型,只要這一步搞定之后,貪心算法的編碼一般都很簡(jiǎn)單。貪心算法解決問(wèn)題的正確性雖然很多時(shí)候看起來(lái)是顯而易見(jiàn)的,但是要嚴(yán)謹(jǐn)?shù)刈C明算法能夠得到最優(yōu)解,并不是件容易的事。所以很多時(shí)候,我們只要多舉幾個(gè)例子,看一下貪心算法的解決方案是否真的能夠得到最優(yōu)解就可以了。
? ? 2分治算法
? ? ? ? 這節(jié)課學(xué)習(xí)了一種非常廣泛的算法思想,分治算法。
? ? ? ? 分治算法用四個(gè)字概括就是“分而治之”,將原問(wèn)題劃分成n個(gè)規(guī)模較小而結(jié)構(gòu)與原問(wèn)題相似的子問(wèn)題,遞歸地解決這些子問(wèn)題,然后再合并其結(jié)果,就得到原問(wèn)題的解。這個(gè)思想非常簡(jiǎn)單、好理解。
? ? ? ? 我們還學(xué)習(xí)了兩種分治算法典型的應(yīng)用場(chǎng)景:一個(gè)是用來(lái)指導(dǎo)編碼,降低問(wèn)題求解的時(shí)間復(fù)雜度;另一個(gè)是解決海量數(shù)據(jù)處理問(wèn)題,比如MapReduce本質(zhì)上就是利用了分治思想。
? ? ? ? 我們也時(shí)常感嘆Google的創(chuàng)新能力如此之強(qiáng),總是在引領(lǐng)技術(shù)的發(fā)展。實(shí)際上,創(chuàng)新并非離我們很遠(yuǎn),創(chuàng)新的源泉來(lái)自對(duì)事物本質(zhì)的認(rèn)識(shí)。無(wú)數(shù)優(yōu)秀架構(gòu)設(shè)計(jì)的思想來(lái)源都是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法,這本身就是算法的一個(gè)魅力所在。
? ? 3回溯算法
? ? ? ? 回溯算法的思想非常簡(jiǎn)單,大部分情況下,都是用來(lái)解決廣義的搜索問(wèn)題,也就是,從一組可能的解中,選擇出一個(gè)滿足要求的解。回溯算法非常適合用遞歸來(lái)實(shí)現(xiàn),在實(shí)現(xiàn)的過(guò)程中,剪枝操作是提高回溯效率的一種技巧。利用剪枝,我們并不需要窮舉搜索所有的情況,從而提高搜索效率。
? ? ? ? 盡管回溯算法的原理非常簡(jiǎn)單,但是卻可以解決很多問(wèn)題,比如我們開(kāi)頭提到的深度優(yōu)先搜索、八皇后、0-1背包問(wèn)題、圖的著色、旅行商問(wèn)題、數(shù)獨(dú)、全排列、正則表達(dá)式匹配等等。如果這幾個(gè)問(wèn)題都能實(shí)現(xiàn)的話,基本就掌握了回溯算法。