1. 程式人生 > 其它 >樹狀陣列理論與實踐

樹狀陣列理論與實踐

嗶哩嗶哩講解視訊

一、問題的引入

(1)快速求字首和 \(O(log_2n)\)
(2)修改某一個數 \(O(log_2n)\)

這兩個需求,如果我們採用如下方式:

  • 陣列
    求字首和是\(O(n)\),修改某一個數是\(O(1)\)

  • 字首和陣列
    求字首和是\(O(1)\),修改某一個數是\(O(n)\)

如果用上面兩種方法,一般是按最壞的情況進行評估,如果有\(m\)次詢問,那麼就是\(O(m*n)\)的時間複雜度

魚和熊掌不可得兼,樹狀陣列可以在二者之間達到一個平衡點。
換句話說,這個玩意在需求場景為:一邊修改,一邊求字首和時最有效。

還是前面的問題,就可以降到\(O(m*log_2n)\)

,這比\(O(m*n)\)要快的非常多。

二、怎麼解決的?

用二進位制思想來解決問題的,x=2vk+2(vk-1)+...+2^(vi)
vk>=v(k-1)>=v(k-2)>=...>=vi k<=logx

=================================================

線段樹
我一看就知道是線段樹的題目,但是往後做就非常難寫。

樹狀陣列
基本原理 -->擴充套件 --> +差分
--> +差分+推公式
例題,這玩意一般是不好想到是樹狀陣列,而不是發現是樹狀陣列而不會寫。