0% found this document useful (0 votes)
232 views18 pages

Fenwick Tree

The document describes a binary indexed tree (fenwick tree) data structure. It can be used to efficiently count the total number of elements in a given range of indices by storing cumulative frequencies. The tree is an array where each element represents the sum of elements in its index's binary range. It supports updating a value in O(logN) time and querying a range sum in O(logN) time through operations that traverse the binary representations of indices. The approach can be extended to two dimensions for problems involving counting points within a rectangular region.

Uploaded by

Anirban Roy
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
232 views18 pages

Fenwick Tree

The document describes a binary indexed tree (fenwick tree) data structure. It can be used to efficiently count the total number of elements in a given range of indices by storing cumulative frequencies. The tree is an array where each element represents the sum of elements in its index's binary range. It supports updating a value in O(logN) time and querying a range sum in O(logN) time through operations that traverse the binary representations of indices. The approach can be extended to two dimensions for problems involving counting points within a rectangular region.

Uploaded by

Anirban Roy
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 18

(binary indexed tree)

The Problem
There are several boxes Labeled from 1 to N We can Add N marble(s) into ith box

We say box #i has frequency N

We want to know Total number of marbles in box #1 to #j

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

pic from www.topcoder.com

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)

Tree[6] = f(5) + f(6)


Tree[3] = f(3)

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

Index of the array

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

The last 1 of 12 is at position 2 (0-indexed) 12 22 + 1 = 9 = (1001)2

Read Cumulative Freq


c(13) = tree[13] + tree[12] + tree[8] In base-2 c(11012) = tree[11012] + tree[11002] + tree[10002]
pic from www.topcoder.com

Update Freq
Update f(5) by -1 involve Tree[16] (100002) Tree[8] (010002) Tree[6] (001102) Tree[5] (001012)

pic from www.topcoder.com

Read actual Freq


What is f(12)? Easy, its c(12) c(11)

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

Ex.. 2s Compliment of 7 is 0111 1000 1001

Finding the last 1 x = a1b b = consecutive of 0 Ex X = 4 = 0100 a=0 b = 00

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

= (a1b) + 1 = a0b + 1 = a0(0...0) + 1 = a0(1...1) + 1 = a1(0...0) = a1b.

So, if we & x and x a1b & a1b. We got the last 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

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

pic from www.topcoder.com

You might also like