樹狀陣列理論與實踐
阿新 • • 發佈:2022-04-13
一、問題的引入
(1)快速求字首和 \(O(log_2n)\)
(2)修改某一個數 \(O(log_2n)\)
這兩個需求,如果我們採用如下方式:
-
陣列
求字首和是\(O(n)\),修改某一個數是\(O(1)\) -
字首和陣列
求字首和是\(O(1)\),修改某一個數是\(O(n)\)
如果用上面兩種方法,一般是按最壞的情況進行評估,如果有\(m\)次詢問,那麼就是\(O(m*n)\)的時間複雜度
魚和熊掌不可得兼,樹狀陣列可以在二者之間達到一個平衡點。
換句話說,這個玩意在需求場景為:一邊修改,一邊求字首和時最有效。
還是前面的問題,就可以降到\(O(m*log_2n)\)
二、怎麼解決的?
用二進位制思想來解決問題的,x=2vk+2(vk-1)+...+2^(vi)
vk>=v(k-1)>=v(k-2)>=...>=vi k<=logx
=================================================
線段樹
我一看就知道是線段樹的題目,但是往後做就非常難寫。
樹狀陣列
基本原理 -->擴充套件 --> +差分
--> +差分+推公式
例題,這玩意一般是不好想到是樹狀陣列,而不是發現是樹狀陣列而不會寫。