常用算法設計和優化策略(本蒟蒻不定期更新)
阿新 • • 發佈:2018-03-02
遞歸 還要 定期 兩個 順序 結構 等價 狀態 logs
常用算法設計和優化策略(本蒟蒻不定期更新)
下面是紫書上講的常用算法設計策略和優化策略:
分治法:將問題分成相同的獨立子問題求解。拆分出的問題必須有最優子結構性質(子問題求出的是最優解)
動態規劃。本質是:對於一個問題,通過劃分階段,定義狀態與狀態間的關系,來分解問題。利用單階段問題之間的聯系,或者同一階段狀態之間的聯系,一個一個階段往下決策,最終解決問題。
拆分出的問題必須滿足最優子結構性質和無後效性(當前階段以前的狀態不會影響以後的狀態,只與當前階段有關)。動歸的目的是避免重疊子問題。遞推和遞歸(記憶化搜索)是實現動歸的手段。
註:DAG上的動歸也是有階段的。當前階段的唯一狀態就是這個點,上一階段的狀態是這個點的兒子(們)。不要以為有些動態規劃是沒有階段的。
貪心法:動態規劃的一種,每個階段只有一種狀態。
構造法:最樸素的方法。
中途相遇法:一種枚舉的方法。通常比多個相遇法還要優秀。
問題分解:將兩個不相關的問題剝離開來分別求解。
等價轉換:化繁為簡。
假設法:對於有對稱性的問題,利用對稱性避免討論。
使用數據結構:在不改變主算法的情況下加速算法。
數形結合:將代數的關系轉化成幾何的關系。
二分答案:將求某個最優值轉化為判定最優值,也算在策略內。
掃描法:帶有順序的枚舉法,通常維護一些重要的量從而簡化計算。
枚舉基準:尋找基於當前基準的最優值,再取所有基準的最值。
滑動窗口:通過某個數據結構維護單調性,高效去除冗余狀態。
各位dalao有什麽想吐槽的請盡情砸向評論區~~
常用算法設計和優化策略(本蒟蒻不定期更新)