樹狀陣列又叫二叉索引樹
參考《訓練指南》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 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...