資料結構 樹狀陣列小結

2022-05-04 10:12:08 字數 905 閱讀 3933

樹狀陣列又叫二叉索引樹

參考《訓練指南》p194

動態求連續區間和,可以動態更新資料,支援以下兩種操作:

1、 對某一元素進行更新操作。

2、 查詢某一連續區間的元素和。

對於正整數x,我們定義lowbit(x)為「x的二進位制表示中最右邊的1所表示的值」,例如lowbit(11001100) =100 (這裡的11001100、100都是二進位制表示),在程式實現中lowbit(x) = x&-x ,原因如下。

x  0000 0000 1100 1100

-x 1111 1111 0011 0100 ---反碼加1,稱為補碼

lowbit(16) = 16

lowbit(8) = 8

lowbit(4) = 4

lowbit(2) = 2

lowbit(1) = 1

a陣列下標從1開始。

每一層lowbit值相同,下面構造輔助陣列c,c[i] = a[i-lowbit(i)+1] + a[i-lowbit(i)+2] +…..+ a[i]。

c[1]=a[1]

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

c[3]=a[3]

c[12]=a[9]+a[10]+a[11]+a[12]

c[i]就是以i結尾的白條(看上圖)

兩個操作的**如下:

int sum(int x)   //

求字首和,x向左上爬

return

ret;

}

void add(int x,int d)  

}

不難證明,兩個操作都是log(n),而預處理操作相當於執行了n次add操作,所以總複雜度是nlog(n)。

完結。

資料結構 樹狀陣列

區間資訊的維護與查詢專題 樹狀陣列 1.問題 動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。add x,d 操作 讓ax增加d.query l,r 計算al al 1 ar.對普通陣列進行 一次修改或 特定區間 求和,時間複雜度為o n n...

資料結構 樹狀陣列

原陣列 字首和 範圍和 原陣列更改陣列元素在求和效率較低,引入樹狀陣列 假設原陣列a 樹狀陣列c 樹狀陣列 的三種操作 1.lowbit 子葉數 二進位制最低位的1代表多少 實現 int lowbit int n 求 lowbit x returnx x 2.update a i k 假設a i 是...

資料結構 樹狀陣列

講到了線段樹,那就順便講講樹狀陣列吧。假設乙個長度為 12 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...