算法優化策略


常用算法設計和優化策略

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

  • 分治法:將問題分成相同的獨立子問題求解。在普通的分治之外,還有一種cdq分治(陳丹琦分治),思想是處理左邊區間到右邊區間的影響,歸並算一個例子。

  • 動態規划

    • 第一種用法 本質是:對於一個問題,通過定義狀態來分解問題。利用狀態之間的聯系(轉移方程)進行遞推,最終解決問題。這種用法中,狀態的值就構成了最終答案。
    • 第二種用法 本質是:一個問題的答案由許多子問題得到。我們剝離出影響這些子問題答案的元素,將它考慮在dp狀態中。這樣,一個dp狀態就可以表示若干個子問題,考慮某個dp狀態就相當於考慮若干個子問題。這種用法中,狀態只是用來把類型相同的子問題歸為一類。

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

    只要滿足:1.狀態設計不重不漏 2.轉移方程正確 3.能順利統計答案,那么這個dp就是可寫的。如果在碼代碼的時候, 初始狀態的值設置對了,同時考慮了邊界情況,那么這個dp代碼就是正確的。

    決策單調性:第i個階段,如果從j轉移,那么i以后的階段,都不會從j及以前的階段轉移。

    做題的時候可以考慮先寫出原始的轉移方程,再用各種方法優化,如將一些一環扣一環的轉移壓縮成一個轉移/利用前綴和思想/利用單調隊列或者優先隊列/利用線段樹……

  • 貪心法:動態規划的一種,每個階段的最優解是由上一個階段的最優解得到的。貪心的情況下,局部最優解構成了全局最優解。在找出動態規划的方法以后可以嘗試貪心解法。

  • 收縮法:對於某些問題,可以用反證法證明答案只會收縮到某些邊界處,判斷邊界情況即可。

  • 構造法:最朴素的方法。包括模擬,暴力,暴搜……

  • 等價轉換:化繁為簡,包括問題轉換,問題分解等。例如最值反演。

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

  • 使用數據結構:在不改變主算法的情況下加速算法。包括但不限於並查集,單調X,平衡樹,線段樹,lct……

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

  • 二分答案:將求某個最優值問題轉化為判定性問題,也算在策略內。它的衍生算法還有整體二分,即把詢問和答案一起二分。

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

  • 枚舉基准:尋找基於當前基准的最優值,再取所有基准的最值。某些看似狀壓的題可以用這種方法,在外層枚舉基准狀態,然后神奇解決……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM