演算法分析與設計基礎
阿新 • • 發佈:2022-02-27
---
title: 演算法分析與設計基礎
tags: 小結
category: /小書匠/日記/2022-02
renderNumberedHeading: true
grammar_cjkRuby: true
---
歡迎使用 **{小書匠}(xiaoshujiang)編輯器**,您可以通過 `小書匠主按鈕>模板` 裡的模板管理來改變新建文章的內容。
# 目錄:
[TOC]
# 演算法分析與設計
## 演算法基本概括
### 分析部分:
>1. **正確性證明**
>2. **迴圈不變數的應用**(Loop invariants)
>3. **動態規劃、貪心等演算法的正確性證明**
>4. **時間複雜度**
>5. **worst-case(輸入最差)**
>6. **average-case(對輸入的分佈求期望)**:隨機變數
>7. **expected-case(任意輸入,對程式隨機數發生器的輸出求期望)**:隨機變數
>8. **amortized analysis(輸入最差,對不同操作求平均)**
>9. **遞迴時間複雜度分析**:主定理等方法
>10. **問題時間複雜度下界**:一個問題最好能做到多少(譬如基於比較的排序 [公式] )
### 設計部分:
>**問題求解**:針對一個問題,我們要學習如何定義解空間(定義數學問題)。演算法的目的就是在解空間中找到滿足條件的解。設計好的演算法能幫助我們更快的找到解。這往往是通過對解空間(問題)的觀察、理解幫助我們縮小解空間,套用學習過的演算法
1. **列舉**:遍歷(窮舉)解空間尋找解。可以利用數學約束減小需要搜尋的解空間,以好的次序遍歷等方法優化
2. **搜尋**:從解空間中一點出發,以特定的次序遍歷結構化的解空間(如圖)
3. **打表**:把(原問題或子問題)解空間中的部分結果儲存下來,以空間換時間
4. **倍增**:保留 [公式] 處的值以快速構造所有的情況
5. **迭代**:從解空間中一點出發,保證每次都向解“靠近”,最終收斂到解
6. **遞迴**:將原問題規約到一個較小規模的問題上(甚至從規模 n 到規模 n-1,當然這可以用迴圈實現,這裡的遞迴是數學上的設計而非需要棧幀的遞迴)以下的分治法、動歸等都是在遞迴的基礎上,基於解空間的特性設計的更好的方法
7. **遞推**:從較小規模的問題出發,獲得原問題的解。遞推和遞迴可以比作綜合法和分析法,動態規劃的實現既可以用遞迴(記憶化搜尋)也可以用遞推(Bottom-up)
8. **分治**:將原問題規約到多個規模相近的問題上。首先劃分(Divide),再用相同方法解決子問題(Conquer),最後合併子問題的答案獲得(Merge)
9. **二分**:無需 Merge 的分治法,通常在劃分的兩個子問題空間中,原問題的解落在確定的一個子問題內部
10. **動態規劃**:原問題的 最優 解可以由子問題的最優解組合而成(optimal sbustructure)。相比於分治,動態規劃在每步採取不同的劃分策略(make a decision)會導致不同的結果(快排在哪裡劃分不會影響正確性),程式上體現在最外層的迴圈。其優點在於可以避免反覆求解相同的子問題(overlapping subproblem)
11. **貪心**:原問題的 最優 解可以通過區域性最優的策略(decision)規約到一個較小規模的問題上。可以看做是在動態規劃中存在一種最優的劃分子問題的方案
圖論演算法:圖的引入使為了更好的結構化問題,理解解空間,主要是利用上面的演算法設計,針對不同的問題設計出的演算法,不再展開