概述
修改和查詢複雜度為log(n)的資料結構,所有奇數字的數和原數字置相同,偶數字置是原陣列若干位置的和。
假如原陣列a(a1, a2, a3, a4 ...),和其對應的樹狀陣列c(c1, c2, c3, c4 ...)有如下關係:
陣列的有幾個位置組成由座標的最低位決定,所謂的最低位,就是二進位制數的最右邊的乙個1開始,加上後面的0(如果有的話)組成的數字,例如1到8的最低位如下面所。
座標 二進位制 最低位
1 0001 1
2 0010 2
3 0011 1
4 0100 4
5 0101 1
6 0110 2
7 0111 1
8 1000 8
最低位的計算方法有兩種,一種是x&(x^(x–1))
,另一種是利用補碼特性x&-x。
找節點的父節點 ;
publicview codeclass
numarray
}public
void init(int i, int
val)
}public
void update(int i, int
val)
public
int getsum(int
i)
return
res;
}public
int sumrange(int i, int
j) }
樹狀陣列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 下...
樹狀陣列 二維樹狀陣列模板
樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...