1. 程式人生 > >關於倍增思想的幾點總結

關於倍增思想的幾點總結

倍增思想的概念:

  • 每次通過倍增加速狀態轉移、預處理或查詢(很多時候能把時間複雜度降到O(logN))

倍增的注意事項:

  • 在理解倍增之前,個人建議先對二進位制有一定的理解
  • 有時候要注意一下預處理的過程,不要出問題

倍增思想的例題(難度從低到高):

倍增思想的適用範圍(個人整理):

  • 在變化規則相同的情況下加速狀態轉移(如:快速冪,LCA(倍增法))
  • 加速區間操作(如:ST表,字尾陣列)

關於倍增思想的總結:

  • 兔子跳:很多時候,倍增思想的使用過程就像兔子跳躍的過程一樣(設兔子單次跳躍的距離為d,假設在每次跳躍完成後,d=d^2).學習這隻兔子的跳躍過程,我們就可以嘗試把極高的時間複雜度優化成O(NlogN).
  • 倍增很多時候是在查詢過程中使用的,也就是說,預處理往往需要至少O(NlogN)的時間複雜度,而查詢的時間複雜度依情況而定(單次查詢的時間複雜度通常為O(1)至O(logN))
  • 在許多情況下,倍增的基礎與二進位制運算有關(如:快速冪),就算不直接相關,往往也借用了類似快速冪的思想.
  • 圖論:在大多數情況下,圖論中的點或邊都可以按某種方式排序.如果問題的解要求O(NlogN)的時間複雜度,可以考慮倍增思想.在使用倍增思想的情況下,可以結合DP的"最優子結構"和ST表的思想嘗試求解.
  • DP 記憶化:倍增很多時候也需要借用DP的"記憶化"思想,從而在查詢中以下標代表2^i的方式進行查詢.
  • 爆炸:使用倍增的優化方式往往可以爆炸性的優化程式的執行速度(比如:從O(2^{n})
    優化到O(n{log_{2}}^{n})
  • 二進位制:在使用倍增思想的過程中,可以結合二進位制進行考慮.二進位制轉換為十進位制的過程往往可以帶來一些創造性的思考.比如位運算,也可以很好的幫助程式碼的實現.(如:(1<<i)在ST表和倍增求LCA中的應用和(i=i>>1,i&1)在快速冪中的應用)
  • 加速DP狀態轉移:有時候可以使用倍增的方法優化DP(如:快速冪),使用這種方法可以參考快速冪的實現.(關於使用倍增思想加速DP狀態轉移可以參考《淺析倍增思想在資訊學競賽中的應用》