1.分治法
關鍵詞:遞歸(遞歸式)、大問題分解成子問題(子問題相互獨立,且與原問題相同)、合並(子問題的解合並成原問題的解)
步驟:
1.分解。將原問題分解成一系列子問題。
2.求解。遞歸地求解各子問題。若子問題足夠小,則直接求解。(遞歸式)
3.合並。將子問題的解合並成原問題的解
示例:歸並排序;最大子段和問題;循環賽日程安排
2.動態規划法
關鍵詞:遞歸(遞歸式)、表記錄(已解決的子問題的答案)、根據子問題求解原問題的解(子問題不獨立)、最優解(可選項)
步驟:
1.找出最優解的性質,刻畫其結構特征;
2.遞歸地定義最優解;
3.以自底向上的方式計算出最優值;
4.根據計算最優值時得到的信息,構造一個最優解
只需求出最優值,步驟4可以省略;若需求出問題的一個最優解,則必須執行步驟4。
適用環境:
1.最優子結構。一個問題的最優解包含了其子問題的最優解。
2.重疊子問題。原問題的遞歸算法可以反復地解同樣的子問題,而不是總是產生新的子問題
示例:0-1背包問題;矩陣鏈乘問題;最長公共子序列(LCS);
3.貪心法
關鍵詞:局部最優(較好的近似最優解,貪心)、簡單、根據當前信息最選擇,且不改變、
使用環境:
1.最優子結構。一個問題的最優解包含了其子問題的最優解。
2.貪心選擇性質。問題的整體最優解可以通過一系列局部最優的選擇(貪心選擇)來得到
示例:活動選擇問題、背包問題、多機調度問題
4.回溯法
關鍵詞:通用的解題法、解空間樹(深度優先遍歷)、界限函數、所有解(找出滿足條件的所有解)
步驟:
1.針對所給問題,定義問題的解空間。問題的解空間應至少包含問題的一個(最優)解
2.確定易於搜索的解空間結構。通常將解空間表示為樹、圖;解空間樹的第i層到第i+1層邊上的標號給出了變量的值;從樹根到葉子的任一路徑表示解空間的一個元素。
3.以深度優先的方式搜索整個解空間。如果當前寬展節點處為死節點,則回溯至最近的一個活節點處。(以此方式遞歸搜索)
算法框架:非遞歸、遞歸
界限函數:回溯法的核心。盡可能多、盡可能早地“殺掉”不可能產生最優解的活節點。好的界限函數可以大大減少問題的搜索空間,大大提高算法的效率。
示例:0-1背包、N皇后問題
5.分支界限法
關鍵字:解空間(廣度優先、最小耗費優先)、界限函數(隊列式、優先隊列式)
步驟:
1.針對所給問題,定義問題的解空間。問題的解空間應至少包含問題的一個(最優)解
2.確定易於搜索的解空間結構。通常將解空間表示為樹、圖;解空間樹的第i層到第i+1層邊上的標號給出了變量的值;從樹根到葉子的任一路徑表示解空間的一個元素。
3.以廣度優先或最小耗費優先的方式搜索整個解空間。每個活節點只有一次機會成為擴展節點,活節點一旦成為擴展節點,其余兒子節點被加入活節點表中。(以此方式遞歸搜索)
界限函數:分支界限法的核心。盡可能多、盡可能早地“殺掉”不可能產生最優解的活節點。好的界限函數可以大大減少問題的搜索空間,大大提高算法的效率。
1.隊列式(FIFO)分支界限法。先進先出
2.優先隊列式分支界限法。組織一個優先隊列,按優先級選取。通常用最大堆來實現最大優先隊列,最小堆來實現最小優先隊列。
6.概率算法
關鍵詞:隨機性選擇、小概率錯誤(運行時間大幅減少)、不同解(對同一問題求解兩次,可能得到完全不同的解,且所需時間、結果可能會有相當大的差別)
基本特征:
1.輸入包括兩部分。一,原問題的輸入;二,供算法進行隨機選擇的隨機數序列
2.運行過程中,包括一處或多處隨機選擇,根據隨機值來決定算法的運行
3.結果不能保證一定是正確的,但可以限制出錯率。
4.不同的運行過程中,對於相同的輸入實例可以有不同的結果,執行時間也可能不同。
分類:
1.數值概率算法。常用於數值問題的求解。近似解,近似解的精度隨計算時間的增加不斷提高。
2.蒙特卡羅(Monte Carlo)算法。精確解,解未必是正確的,正確的概率依賴於算法所用的時間。一般情況下,無法有效地判定所得到的解是否肯定正確。
3.拉斯維加斯(LasVegas)算法。一旦找到解,一定是正確解。找到的概率隨計算時間的增加而提高。對實例求解足夠多次,使求解失效的概率任意小。
4.舍伍德(Sherwood)算法。總能求得問題的一個解,且所求得的解總是正確的。設法消除最壞情形與特定實例之間的關聯性。多用於最快情況下的計算復雜度與其在平均情況下的計算復雜度差別較大。
7.近似算法
關鍵詞:近似解、解的容錯界限(近似最優解與最優解之間相差的程度)、不存在多項式時間算法
基本思想:放棄求最優解,用近似最優解替代最優解。使算法簡化,時間復雜度降低
衡量性能的標准:
1.算法的時間復雜度。時間復雜度必須是多項式階的
2.解的近似程度。與近似算法本身、問題規模、不同的輸入實例有關。
示例:NP問題、定點覆蓋問題、TSP、子集和數問題、