Fenwick Tree
Fenwick Tree
The Problem
There are several boxes Labeled from 1 to N We can Add N marble(s) into ith box
Fenwick Tree
Operation void create(int n); void update(int idx, int val); int freqTo(int idx); int freqAt(int idx);
O(N) O(log N) O(log N) O(log N)
Storage
Data An int array of size N
Fenwick Tree
How it works? Each element in the array stores cumulative frequency of consecutive list of boxes Range of boxes that is stored is related to binary value of the index
Define
f(x) = number of marble in
box x c(x) = summation of number of marble in box #1 to box #x tree[x] = element x in the array
Storage Solution
Tree*16+ = f(1) + f(2) + + f(16) Tree*12+ = f(9) + f(10) + + f(12)
f(16) = 2
Cumulative Freq
tree[16] = 29 Cumulative frequency From 1 to 16 tree[14] Cumulative frequency From 13 to 14
pic from www.topcoder.com
Actual frequency
The last 1
A node at the index X will store freq of boxes in the range X 2r+1 to X Where r is the position of the last digit of 1
Ex
X = 12 (1100)2 Node will store freq from 9 to 12
Update Freq
Update f(5) by -1 involve Tree[16] (100002) Tree[8] (010002) Tree[6] (001102) Tree[5] (001012)
easier Tree[12] = f(9) + f(10) + f(11) + f(12) Tree[11] = f(11) Tree[10] = f(9) + f(10) Hence, f(12) = Tree[12] Tree[11] Tree[10]
pic from www.topcoder.com
Twos compliment
A method to represent negative A twos compliment of X is
(compliment of x) + 1
0111 0110 0101 0100 0011 0010 0001 0000 1111 1110 1101 1100 1011 1010 1001 1000
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8
Twos compliment
Now, lets see twos compliment
more closely -x
0111 0110 0101 0100 0011 0010 0001 0000 1111 1110 1101 1100 1011 1010 1001 1000
7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8
Code
int freqTo(int idx) { int sum = 0; while (idx > 0){ sum += tree[idx]; idx -= (idx & -idx); } return sum; }
void update(int idx ,int val) { while (idx <= MaxVal){ tree[idx] += val; idx += (idx & -idx); } }
from www.topcoder.com
Code
int freqAt(int idx){ int sum = tree[idx]; if (idx > 0) { int z = idx - (idx & -idx); y = idx - 1; while (y != z){ sum -= tree[y]; y -= (y & -y); } } return sum; }
from www.topcoder.com
2D BIT
Box is arrange at x-y coordinate
Operation Update(x,y,val) (add val marble in position (x,y)) How many points in the range (x1,y1) to (x2,y2)
2D BIT