目錄
- 算法基礎(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ù)雜度最好的算法是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ú)立且與原問題形式相同胰柑,遞歸地解這些子問題,然后將各子問題的解合并得到原問題的解爬泥。
特征:
- 該問題的規(guī)募硖郑縮小到一定的程度就可以容易地解決 。
- 該問題可以分解為若干個(gè)規(guī)模較小的相同問題袍啡,即該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)踩官。
- 利用該問題分解出的子問題的解可以合并為該問題的解。
- 該問題所分解出的各個(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