| 1. 首先我們得知道一個問題,那就是線段樹得作用并
不只是用來存儲線段的,也可以存儲點(diǎn)的值等等.
| 2. 對于靜態(tài)的線段樹,空間上需要的數(shù)組有:當(dāng)前結(jié)點(diǎn)
的數(shù)據(jù)值,左兒子編號,右兒子編號.至少這么三個數(shù)組
3. | 而在時間上雖然是NlogN的復(fù)雜度,但是系數(shù)很大.|
4. 實現(xiàn)起來的時候編程復(fù)雜度大,空間復(fù)雜度大,時間
效率也不是很理想.
所以這個時候樹狀數(shù)組成了一個很好的選擇.
給定一個初始值都為0的序列,動態(tài)地修改一些
位置上的數(shù)字,加上一個數(shù),減去一個數(shù),或者乘上
一個數(shù),然后動態(tài)地提出問題,問題的形式是求出
一段數(shù)字的和.
如果直接用樸素方法做的話,修改的復(fù)雜度是O(1),
詢問的復(fù)雜度是O(N),M次詢問的復(fù)雜度是M*N.
M,N的范圍可以有100000以上!!!!
有沒有更好的方法???
呵呵, 肯定有啦, 就是我要說的樹狀數(shù)組!!!
具體的樹狀數(shù)組的解釋請看上面, 那么這個2k怎么求? 是怎么
來的?
K的計算可以這樣:
|2k=x and (x & (x-1))
|以6為例
| (6)10=(0110)2
|xor 6-1=(5)10=(0101)2
| (0011)2
|and (6)10=(0110)2
| (0010)2
所以:
由數(shù)字的機(jī)器碼可以更簡單的優(yōu)化成: x & (-x)
對于上面那一題,每次修改與詢問都是對C數(shù)組做處理.
空間復(fù)雜度有3N降為N,時間效率也有所提高.編程復(fù)雜
度更是降了不少.