1. 程式人生 > 其它 >演算法分析與設計基礎

演算法分析與設計基礎

--- 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)規約到一個較小規模的問題上。可以看做是在動態規劃中存在一種最優的劃分子問題的方案 圖論演算法:圖的引入使為了更好的結構化問題,理解解空間,主要是利用上面的演算法設計,針對不同的問題設計出的演算法,不再展開