1. 程式人生 > >常用算法設計和優化策略(本蒟蒻不定期更新)

常用算法設計和優化策略(本蒟蒻不定期更新)

遞歸 還要 定期 兩個 順序 結構 等價 狀態 logs

常用算法設計和優化策略(本蒟蒻不定期更新)

下面是紫書上講的常用算法設計策略和優化策略:

  • 分治法:將問題分成相同的獨立子問題求解。拆分出的問題必須有最優子結構性質(子問題求出的是最優解)

  • 動態規劃。本質是:對於一個問題,通過劃分階段,定義狀態與狀態間的關系,來分解問題。利用單階段問題之間的聯系,或者同一階段狀態之間的聯系,一個一個階段往下決策,最終解決問題。

    拆分出的問題必須滿足最優子結構性質和無後效性(當前階段以前的狀態不會影響以後的狀態,只與當前階段有關)。動歸的目的是避免重疊子問題。遞推和遞歸(記憶化搜索)是實現動歸的手段。

    註:DAG上的動歸也是有階段的。當前階段的唯一狀態就是這個點,上一階段的狀態是這個點的兒子(們)。不要以為有些動態規劃是沒有階段的。

  • 貪心法:動態規劃的一種,每個階段只有一種狀態。

  • 構造法:最樸素的方法。

  • 中途相遇法:一種枚舉的方法。通常比多個相遇法還要優秀。

  • 問題分解:將兩個不相關的問題剝離開來分別求解。

  • 等價轉換:化繁為簡。

  • 假設法:對於有對稱性的問題,利用對稱性避免討論。

  • 使用數據結構:在不改變主算法的情況下加速算法。

  • 數形結合:將代數的關系轉化成幾何的關系。

  • 二分答案:將求某個最優值轉化為判定最優值,也算在策略內。

  • 掃描法:帶有順序的枚舉法,通常維護一些重要的量從而簡化計算。

  • 枚舉基準:尋找基於當前基準的最優值,再取所有基準的最值。

  • 滑動窗口:通過某個數據結構維護單調性,高效去除冗余狀態。

各位dalao有什麽想吐槽的請盡情砸向評論區~~

常用算法設計和優化策略(本蒟蒻不定期更新)