Binary Indexed Tree
- Able to
- Answer sum query within interval.
- Update within fixed-size array.
- Variant
- Answer prefix query of min/max.
- Code
Example
_____ 0 _________________________
/ | | \ \
1 2 4 8 ____ 16 ____ (1 bit)
| / \ / | \ / | | \
3 5 6 9 10 12 17 18 20 24 (2 bits)
| | | \ | | \
7 11 13 14 19 21 22 (3 bits)
| |
15 23 (4 bits)
Tree structure
- Each node takes index as key.
ith level contains indices withibits, e.g.- First layer has 1(1), 2(10), 4(100), 8(1000).
- Second layer has 3(11), 5(101), 6(110), 9(1001), 10(1010).
- Third layer has 7(111), 11(1011).
- Partial prefix sums are computed and stored in nodes.
Range of node
- Prefix sums does NOT all start from
i=0 - For a current node
cand its parentp, it computes sum within[p, c) - For example,
6has parent4, so this node stores sum within[4, 6)
Compute prefix sum
- Find the leaf node and sum up till root
- e.g. To compute
[0, 7)- Sum up node 7, 6, 4.
- Rationale is that [0, 7) = [000, 100) + [100, 110) + [110, 111)
Find parent
- Easy way to tell parent is to flip the right most 1, e.g.
11 = (1011)_2 --> (1010)_2 = 1010 = (1010)_2 --> (1000)_2 = 8
- Here’s a quicker way to find parent
x - (x & -x)- As we know
-xis~x+1 &ing that with original will only remain the rightmost1.
Update value
- When value of some index is updated, multiple nodes need to be updated.
- Find the leaf interval and the other intervals that contains this interval.
- Only two levels are affected.
- One is the current level, all the right siblings are affected.
- The other one is the first level, all the stems on the right are affected.
- e.g. When 8 is updated,
- The leaf interval is like
[?, 1001), so node 9 is first found. - It’s right sibling includes
1010 [8, 10),1100 [8, 12). - It’s right ancestors includes
10000 [0, 16),100000 [0, 32), …
- The leaf interval is like
Find next
- Easy way to find next is to add the right most 1, e.g.
1001 + 0001 = 1010(next sibling)1010 + 0010 = 1100(next sibling)1100 + 0100 = 10000(next ancestor)
Initialize
- Init the array of the same size with all 0’s, whose BIT is also all zeros.
- Update values one by one.
Written on August 16, 2016