高級(jí)算法設(shè)計(jì)與分析

目錄

  • 算法基礎(chǔ)
  • 算法復(fù)雜性
  • 遞歸與分治
  • 回溯法與分支限界法
  • 貪心算法
  • 動(dòng)態(tài)規(guī)劃法
  • NP問題
  • 概率算法
  • 現(xiàn)代優(yōu)化算法
  • 計(jì)算幾何

0. 時(shí)間復(fù)雜度

時(shí)間復(fù)雜度其實(shí)還分為 平均時(shí)間復(fù)雜度寓调、最好時(shí)間復(fù)雜度最壞時(shí)間復(fù)雜度亡蓉。對(duì)于一個(gè)算法來說阁吝,往往有很多特殊情況锋边,一般而言伤锚,我們所說的時(shí)間復(fù)雜度都指最壞時(shí)間復(fù)雜度,因?yàn)樵谧顗牡那闆r下论笔,我們才能夠評(píng)估一個(gè)算法的性能最差會(huì)到什么地步汁雷,這樣我們才能更好地選擇相應(yīng)的算法去解決問題。

大O表示法

目前通用的時(shí)間復(fù)雜度的表示法是“大O表示法”陷嘴,但其實(shí)同時(shí)還存在其他的符號(hào)映砖。

  • O: 表示的是最壞時(shí)間復(fù)雜度间坐,即小于等于
  • Ω: 表示的是最好時(shí)間復(fù)雜度灾挨,即大于等于,不常用竹宋,因?yàn)闆]有什么參考意義劳澄,過于樂觀。
  • θ: 表示確界蜈七,即明確等于

常見時(shí)間復(fù)雜度比較

  • 常數(shù)階O(1)
  • 線性階O(n)
  • 平方階O(n2)
  • 對(duì)數(shù)階O(logn)
  • 線性對(duì)數(shù)階O(nlogn)

注意:O(nlogn)秒拔、O(logn) 內(nèi)部的內(nèi)容在數(shù)學(xué)里是錯(cuò)誤的,一般應(yīng)該是 log2n 等飒硅,但是這里的系數(shù)并不在我們的考慮范圍之內(nèi)砂缩,所以我們一般在計(jì)算復(fù)雜度時(shí)直接將其表示為 O(nlogn) 和 O(logn)。

猴子排序等時(shí)間復(fù)雜度為O(n!)三娩,時(shí)間復(fù)雜度最高庵芭。

這里有一張圖,可以直觀看出各種時(shí)間復(fù)雜度的好壞:


常見時(shí)間復(fù)雜度

時(shí)間復(fù)雜度最好的算法是O(1)雀监,即有限次數(shù)內(nèi)得到結(jié)果双吆。當(dāng)然,一個(gè)算法能不能達(dá)到 O(1) 的時(shí)間復(fù)雜度会前,要看具體情況好乐,我們當(dāng)然希望程序的性能能夠達(dá)到最優(yōu),所以算法的時(shí)間復(fù)雜度能夠低于 O(n2) 一般來說已經(jīng)很不錯(cuò)了瓦宜。不要忘了蔚万,算法的性能除考慮時(shí)間復(fù)雜度外還要考慮空間復(fù)雜度,在大多數(shù)情況下往往需要在時(shí)間復(fù)雜度和空間復(fù)雜度之間進(jìn)行權(quán)衡临庇。

我們?cè)谏厦嫣岬降那闆r都只有一個(gè)規(guī)模參數(shù)反璃,有時(shí)規(guī)模參數(shù)也可能有兩個(gè)区转。比如兩層嵌套循環(huán)的規(guī)模不一樣,我們假設(shè)分別為 m 和 n版扩,這時(shí)我們一般會(huì)把時(shí)間復(fù)雜度寫為 O(m×n)废离,但是我們自己需要明確,如果 m 和 n 非常相近礁芦,則這個(gè)時(shí)間復(fù)雜度趨于 O(n2)蜻韭;如果 m 通常比較小(也就是說我們能夠明白 m 的范圍是多少)柿扣,則這個(gè)時(shí)間復(fù)雜度趨于 O(n)肖方。在這兩種情況下,雖然時(shí)間復(fù)雜度都是 O(m×n)未状,但是真實(shí)的時(shí)間復(fù)雜度可能相差很大俯画。

1. 分治法

概念:

將一個(gè)難以直接解決的大問題,分割成一些規(guī)模較小的相同問題司草,以便各個(gè)擊破艰垂,分而治之。

思想策略:

對(duì)于一個(gè)規(guī)模為n的問題埋虹,若該問題可以容易地解決(比如說規(guī)模n較胁略鳌)則直接解決,否則將其分解為k個(gè)規(guī)模較小的子問題搔课,這些子問題互相獨(dú)立且與原問題形式相同胰柑,遞歸地解這些子問題,然后將各子問題的解合并得到原問題的解爬泥。

特征:

  1. 該問題的規(guī)募硖郑縮小到一定的程度就可以容易地解決 。
  2. 該問題可以分解為若干個(gè)規(guī)模較小的相同問題袍啡,即該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)踩官。
  3. 利用該問題分解出的子問題的解可以合并為該問題的解。
  4. 該問題所分解出的各個(gè)子問題是相互獨(dú)立的葬馋,即子問題之間不包含公共的子問題卖鲤。

第一條特征是絕大多數(shù)問題都可以滿足的,因?yàn)閱栴}的計(jì)算復(fù)雜性一般是隨著問題規(guī)模的增加而增加畴嘶;
第二條特征是應(yīng)用分治法的前提它也是大多數(shù)問題可以滿足的蛋逾,此特征反映了遞歸思想的應(yīng)用;窗悯、
第三條特征是關(guān)鍵区匣,能否利用分治法完全取決于問題是否具有第三條特征,如果具備了第一條和第二條特征,而不具備第三條特征亏钩,則可以考慮用
貪心法或動(dòng)態(tài)規(guī)劃法莲绰。
第四條特征涉及到分治法的效率,如果各子問題是不獨(dú)立的則分治法要做許多不必要的工作姑丑,重復(fù)地解公共的子問題蛤签,此時(shí)雖然可用分治法,但一般用動(dòng)態(tài)規(guī)劃法較好栅哀。

基本步驟:

1 分解:將原問題分解為若干個(gè)規(guī)模較小震肮,相互獨(dú)立,與原問題形式相同的子問題留拾;
2 解決:若子問題規(guī)模較小而容易被解決則直接解戳晌,否則遞歸地解各個(gè)子問題
3 合并:將各個(gè)子問題的解合并為原問題的解。

適用分治法求解的經(jīng)典問題:

1)二分搜索
2)大整數(shù)乘法
3)Strassen矩陣乘法
4)棋盤覆蓋
5)合并排序
6)快速排序
7)線性時(shí)間選擇
8)最接近點(diǎn)對(duì)問題
9)循環(huán)賽日程表
10)漢諾塔

2. 回溯法

概念:

回溯算法實(shí)際上一個(gè)類似枚舉的搜索嘗試過程痴柔,主要是在搜索嘗試過程中尋找問題的解沦偎,當(dāng)發(fā)現(xiàn)已不滿足求解條件時(shí),就“回溯”返回咳蔚,嘗試別的路徑豪嚎。
回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索屹篓,以達(dá)到目標(biāo)疙渣。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo)堆巧,就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法泼菌,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為“回溯點(diǎn)”谍肤。
許多復(fù)雜的,規(guī)模較大的問題都可以使用回溯法哗伯,有“通用解題方法”的美稱荒揣。

思想策略:

在包含問題的所有解的解空間樹中,按照 深度優(yōu)先搜索 的策略焊刹,從根結(jié)點(diǎn)出發(fā)深度探索解空間樹系任。當(dāng)探索到某一結(jié)點(diǎn)時(shí),要先判斷該結(jié)點(diǎn)是否包含問題的解虐块,如果包含俩滥,就從該結(jié)點(diǎn)出發(fā)繼續(xù)探索下去,如果該結(jié)點(diǎn)不包含問題的解贺奠,則逐層向其祖先結(jié)點(diǎn)回溯霜旧。(其實(shí)回溯法就是 對(duì)隱式圖的深度優(yōu)先搜索 算法)。
若用回溯法求問題的所有解時(shí)儡率,要回溯到根挂据,且根結(jié)點(diǎn)的所有可行的子樹都要已被搜索遍才結(jié)束以清。

特征:

(1) 針對(duì)所給問題,確定問題的解空間:首先應(yīng)明確定義問題的解空間崎逃,問題的解空間應(yīng)至少包含問題的一個(gè)(最優(yōu))解掷倔。
(2) 確定結(jié)點(diǎn)的擴(kuò)展搜索規(guī)則
(3) 以深度優(yōu)先方式搜索解空間,并在搜索過程中用剪枝函數(shù)避免無效搜索个绍。

適用回溯法求解的經(jīng)典問題:

八皇后問題今魔,
圖的著色問題,
裝載問題障贸,
批處理作業(yè)調(diào)度問題错森,
再再論背包問題,
最大團(tuán)問題篮洁,
連續(xù)郵資問題涩维,
符號(hào)三角形問題,

3. 分支限界法

概述:

類似于回溯法袁波,也是一種在問題的解空間樹T上搜索問題解的算法瓦阐。但在一般情況下,分支限界法與回溯法的求解目標(biāo)不同篷牌∷回溯法的求解目標(biāo)是找出T中滿足約束條件的所有解,而分支限界法的求解目標(biāo)則是找出滿足約束條件的一個(gè)解枷颊,或是在滿足約束條件的解中找出使某一目標(biāo)函數(shù)值達(dá)到極大或極小的解戳杀,即在某種意義下的最優(yōu)解。

策略:

在擴(kuò)展結(jié)點(diǎn)處夭苗,先生成其所有的兒子結(jié)點(diǎn)(分支)信卡,然后再從當(dāng)前的活結(jié)點(diǎn)表中選擇下一個(gè)擴(kuò)展對(duì)點(diǎn)。為了有效地選擇下一擴(kuò)展結(jié)點(diǎn)题造,以加速搜索的進(jìn)程傍菇,在每一活結(jié)點(diǎn)處,計(jì)算一個(gè)函數(shù)值(限界)界赔,并根據(jù)這些已計(jì)算出的函數(shù)值丢习,從當(dāng)前活結(jié)點(diǎn)表中選擇一個(gè)最有利的結(jié)點(diǎn)作為擴(kuò)展結(jié)點(diǎn),使搜索朝著解空間樹上有最優(yōu)解的分支推進(jìn)淮悼,以便盡快地找出一個(gè)最優(yōu)解咐低。

與回溯法的區(qū)別:

回溯法:【方式不同】深度優(yōu)先搜索 堆棧活結(jié)點(diǎn)的所有可行子結(jié)點(diǎn)被遍歷后才被從棧中彈出找出滿足約束條件的所有解 【目標(biāo)不同】敛惊。
分支限界法:【方式不同】廣度優(yōu)先或最小消耗優(yōu)先搜索 隊(duì)列渊鞋、優(yōu)先隊(duì)列每個(gè)結(jié)點(diǎn)只有一次成為活結(jié)點(diǎn)的機(jī)會(huì)找出滿足約束條件的一個(gè)解或特定意義下的最優(yōu)解 【目標(biāo)不同】。

4. 貪心法

概念:

在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇锡宋。也就是說儡湾,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解执俩。

思想策略:

貪心算法沒有固定的算法框架徐钠,算法設(shè)計(jì)的關(guān)鍵是貪心策略的選擇。必須注意的是役首,貪心算法不是對(duì)所有問題都能得到整體最優(yōu)解尝丐,選擇的貪心策略必須具備無后效性,即某個(gè)狀態(tài)以后的過程不會(huì)影響以前的狀態(tài)衡奥,只與當(dāng)前狀態(tài)有關(guān)爹袁。所以對(duì)所采用的貪心策略一定要仔細(xì)分析其是否滿足無后效性。

基本步驟:

1.建立數(shù)學(xué)模型來描述問題矮固。
2.把求解的問題分成若干個(gè)子問題失息。
3.對(duì)每一子問題求解,得到子問題的局部最優(yōu)解档址。
4.把子問題的解局部最優(yōu)解合成原來解問題的一個(gè)解盹兢。

適用貪心法求解的經(jīng)典問題:

活動(dòng)選擇問題,
錢幣找零問題守伸,
再論背包問題绎秒,
小船過河問題,
區(qū)間覆蓋問題尼摹,
銷售比賽见芹,
Huffman編碼,
Dijkstra算法(求解最短路徑)窘问,
最小生成樹算法

5. 動(dòng)態(tài)規(guī)劃

概念:

每次決策依賴于當(dāng)前狀態(tài)辆童,又隨即引起狀態(tài)的轉(zhuǎn)移。一個(gè)決策序列就是在變化的狀態(tài)中產(chǎn)生出來的惠赫,所以,這種多階段最優(yōu)化決策解決問題的過程就稱為動(dòng)態(tài)規(guī)劃故黑。

思想策略:

將待求解的問題分解為若干個(gè)子問題(階段)儿咱,按順序求解子階段,前一子問題的解场晶,為后一子問題的求解提供了有用的信息混埠。在求解任一子問題時(shí),列出各種可能的局部解诗轻,通過決策保留那些有可能達(dá)到最優(yōu)的局部解钳宪,丟棄其他局部解。依次解決各子問題,最后一個(gè)子問題就是初始問題的解吏颖。

特征:

能采用動(dòng)態(tài)規(guī)劃求解的問題的一般要具有3個(gè)性質(zhì):
(1) 最優(yōu)化原理:如果問題的最優(yōu)解所包含的子問題的解也是最優(yōu)的搔体,就稱該問題具有最優(yōu)子結(jié)構(gòu),即滿足最優(yōu)化原理半醉。
(2) 無后效性:即某階段狀態(tài)一旦確定疚俱,就不受這個(gè)狀態(tài)以后決策的影響。也就是說缩多,某狀態(tài)以后的過程不會(huì)影響以前的狀態(tài)呆奕,只與當(dāng)前狀態(tài)有關(guān)。
(3)有重疊子問題:即子問題之間是不獨(dú)立的衬吆,一個(gè)子問題在下一階段決策中可能被多次使用到梁钾。(該性質(zhì)并不是動(dòng)態(tài)規(guī)劃適用的必要條件,但是如果沒有這條性質(zhì)逊抡,動(dòng)態(tài)規(guī)劃算法同其他算法相比就不具備優(yōu)勢(shì))

基本步驟:

(1) 分析最優(yōu)解的性質(zhì)姆泻,并刻畫其結(jié)構(gòu)特征。
(2) 遞歸的定義最優(yōu)解秦忿。
(3) 以自底向上或自頂向下的記憶化方式(備忘錄法)計(jì)算出最優(yōu)值
(4) 根據(jù)計(jì)算最優(yōu)值時(shí)得到的信息麦射,構(gòu)造問題的最優(yōu)解

適用動(dòng)態(tài)規(guī)劃求解的經(jīng)典問題:

矩陣連乘,
走金字塔
最長公共子序列(LCS) 灯谣,
最長遞增子序列(LIS) 潜秋,
凸多邊形最優(yōu)三角剖分 ,
背包問題 胎许,
雙調(diào)歐幾里得旅行商問題

【參考】
作者:Kevins life
原文:https://blog.csdn.net/ght886/article/details/80289142
作者:Katou_Megumi
鏈接:http://www.reibang.com/p/399a92e8b389

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峻呛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辜窑,更是在濱河造成了極大的恐慌钩述,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穆碎,死亡現(xiàn)場(chǎng)離奇詭異牙勘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)所禀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門方面,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人色徘,你說我怎么就攤上這事恭金。” “怎么了褂策?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵横腿,是天一觀的道長颓屑。 經(jīng)常有香客問我,道長耿焊,這世上最難降的妖魔是什么揪惦? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮搀别,結(jié)果婚禮上丹擎,老公的妹妹穿的比我還像新娘。我一直安慰自己歇父,他們只是感情好蒂培,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榜苫,像睡著了一般护戳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垂睬,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天媳荒,我揣著相機(jī)與錄音,去河邊找鬼驹饺。 笑死钳枕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赏壹。 我是一名探鬼主播鱼炒,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蝌借!你這毒婦竟也來了昔瞧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤菩佑,失蹤者是張志新(化名)和其女友劉穎自晰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稍坯,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酬荞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞧哟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袜蚕。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡型雳,死狀恐怖翠霍,靈堂內(nèi)的尸體忽然破棺而出瞄桨,到底是詐尸還是另有隱情,我是刑警寧澤雄可,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布凿傅,位于F島的核電站,受9級(jí)特大地震影響数苫,放射性物質(zhì)發(fā)生泄漏聪舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一虐急、第九天 我趴在偏房一處隱蔽的房頂上張望箱残。 院中可真熱鬧,春花似錦止吁、人聲如沸被辑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盼理。三九已至,卻和暖如春俄删,著一層夾襖步出監(jiān)牢的瞬間宏怔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工畴椰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臊诊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓斜脂,卻偏偏與公主長得像抓艳,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秽褒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容