C 樹狀陣列介紹

2021-10-11 00:12:08 字數 1197 閱讀 8531

使用陣列來模擬樹形結構

大部分基於區間上的更新和求和問題

修改和查詢的複雜度為o(logn),比線段樹係數少得多,比傳統陣列要快,而且容易編寫。

我們使用a陣列表示原來的陣列,c陣列表示我們的樹狀陣列

可以表示為

c[i] = a[i-2k+1] + a[i-2k+2]+…+a[i];

k為i的二進位制中從最低位到高位連續零的長度

c[1] = a[1] 1 = 1 k=0

c[2] = a[1] + a[2] 2 = 10 k=1

c[3] = a[3] 3 = 11 k =0

c[4] = a[1]+a[2]+a[3]+a[4] 4 = 100 k=2

當我們要求前n項的和時,sum(n) = c(i) + c(i-lowbits(i)) + c(i-lowbits(i) - lowbits(i-lowbits(i))) +…

4 = 100 -4 = 100 4&-4 = 100 -> 4

6 = 110 -6 = 010 6&-6 = 010 -> 2

7 = 111 -7= 001 7&-7= 1 ->1

8 =1000 -8 =1000 8&-8 = 1000 -> 8

10 = 1010 -10 = 0110 10&-10 = 10 ->2

所以 sum(7)= c(7) + c(6) + c(4) + c(0)

lowbits就是求乙個數的二進位制&它負數的二進位制時,最低非0的位置, x&(-x)

直接給出結論

更多的細節可以參考這篇部落格 樹狀陣列詳解 - xenny - (cnblogs.com)

下面給出乙個樹狀陣列

int n;

int a[

1005

],c[

1005];

//對應原陣列和樹狀陣列

intlowbit

(int x)

void

updata

(int i,

int k)

}int

getsum

(int i)

return res;

}cin>>n;

for(

int i =

1; i <= n; i++

)

樹狀陣列 介紹

樹狀陣列是一種形如大樹的資料結構。樹狀陣列和線段樹很像,但能用樹狀陣列解決的問題,基本上都能用線段樹解決,而線段樹能解決的樹狀陣列不一定能解決。相比較而言,樹狀陣列超快,簡潔,記憶體超少,幾乎沒缺點。可以發現 c 1 a 1 c 1b 管1個 c 2 a 1 a 2 c 10b 管2 個c 3 a ...

C 樹狀陣列模板

前言 昨日學習了一波樹狀陣列,學習好了演算法步驟和原理後,自己寫了c 的板子,大家可複製貼上使用即可。樹狀陣列 是一種用於高效處理對乙個儲存數字的列表進行更新及求字首和的資料結構。關於樹狀陣列的演算法步驟 樹狀陣列 binary indexed tree 看這一篇就夠了,大家看這篇就好了。樹狀陣列模...

c 陣列增加內容 樹狀陣列

樹狀陣列,又名二叉索引樹 binary indexed tree 利用該結構能夠有效地解決區間和查詢問題,並且查詢的時間複雜度是o log n 字首和查詢 如圖所示,在原始陣列的基礎上我們引入乙個輔助陣列c,c i 代表的含義是陣列i的值以及所有遞迴的前驅之和,整個輔助陣列看上去像一顆樹,因此得名....