樹狀陣列 介紹

2021-07-26 05:05:34 字數 1263 閱讀 9862

樹狀陣列是一種形如大樹的資料結構。樹狀陣列和線段樹很像,但能用樹狀陣列解決的問題,基本上都能用線段樹解決,而線段樹能解決的樹狀陣列不一定能解決。相比較而言,樹狀陣列超快,**簡潔,記憶體超少,幾乎沒缺點。

可以發現:

c[1] =a[1] 

------------------------------c[1b]管1個

c[2] =a[1]+a[2]--------------------------c[10b]管2

個c[3] =a[3]-------------------------------c[11b]管1

個c[4] =a[1]+a[2]+a[3]+a[4]----------------c[100b]管4

個c[5] =a[5]-------------------------------c[101b]管1

個c[6] =a[5]+a[6]--------------------------c[110b]管2

個c[7] =a[7]-------------------------------c[111b]管1

個 c[8] =a[1]+a[2]+…+a[8]------------------c[1000b]管8

個 ......

......

......

......

......

c[16]=a[1]+a[2]+…+a[16] ---------------c[10000b]管16

這裡有乙個有趣的性質:如果c[x],x

轉為二進位制,後面有連續k個

0,那麼c[x]

管2^k個

,而且分別是

a[x]+a[x-1]+a[x-2]+ … +a[x–2^k+1]。

想要得到c[x]的管理區域非常簡單,只需要x&-x 即可,這是利用了計算機是以補碼的形式儲存數字的特性,使之一步到位,簡單便捷。

知道了c[x]的管理範圍和它的編號後,我們就可以求出:

1、離c[x]最近並且管理c[x]的管理者,它是x+lowbit(x)

2、在c[x]之前並且恰好不管理c[x]的管理者,它是x-lowbit(x)

推薦:《樹狀陣列—改點求段》

《樹狀陣列—改段求段》

《樹狀陣列—改段求點》

C 樹狀陣列介紹

使用陣列來模擬樹形結構 大部分基於區間上的更新和求和問題 修改和查詢的複雜度為o logn 比線段樹係數少得多,比傳統陣列要快,而且容易編寫。我們使用a陣列表示原來的陣列,c陣列表示我們的樹狀陣列 可以表示為 c i a i 2k 1 a i 2k 2 a i k為i的二進位制中從最低位到高位連續零...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...