Skip to content

Commit 5c04a72

Browse files
committed
[Featurette] Added mutable Fenwick Tree, and unittests for Fenwick Tree.
1 parent a43989a commit 5c04a72

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

structures/fenwick_tree.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
class FenwickTree:
22

33
def __init__(self, arr):
4+
self.nums = [0] * (len(arr)+1)
45
self.tree = [0] * (len(arr)+1)
5-
6+
67
for i in range(len(arr)):
78
self.update(i,arr[i])
89

910
def update(self, index, value):
1011
index += 1
12+
delta = value - self.nums[index]
13+
self.nums[index] = value
1114
while index <= len(self.tree)-1:
12-
self.tree[index] += value
15+
self.tree[index] += delta
1316
index += index & (-index)
1417

1518
def sum_of_n(self, index):
@@ -25,5 +28,4 @@ def sum_of_n(self, index):
2528
def sum_of_range(self, start, end):
2629
# minus 1 from start since the range is (s, e) inclusive on both ends
2730
start -= 1
28-
print(self.sum_of_n(end), self.sum_of_n(start))
2931
return self.sum_of_n(end) - self.sum_of_n(start)

tests/test_fenwick.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import unittest
2+
from structures.fenwick_tree import FenwickTree
3+
4+
class TestFenwickTree(unittest.TestCase):
5+
6+
def test_basic_sum(self):
7+
lst = [1,5,7,6,4]
8+
sums = [1,6,13,19,23]
9+
tree = FenwickTree(lst)
10+
11+
for i in range(len(lst)):
12+
self.assertEqual(sums[i],tree.sum_of_n(i))
13+
14+
def test_sum_range(self):
15+
lst = [1,3,8,2,10,6]
16+
17+
tree = FenwickTree(lst)
18+
19+
self.assertEqual(11,tree.sum_of_range(1,2))
20+
self.assertEqual(20,tree.sum_of_range(2,4))
21+
self.assertEqual(30,tree.sum_of_range(0,5))
22+
23+
def test_modified_tree(self):
24+
lst = [1,2,3,4,5]
25+
sums = [1,3,6,10,15]
26+
27+
tree = FenwickTree(lst)
28+
29+
for i in range(len(lst)):
30+
self.assertEqual(sums[i],tree.sum_of_n(i))
31+
32+
tree.update(1,10)
33+
tree.update(3,1)
34+
35+
sums = [1,11,14,15,20]
36+
37+
for i in range(len(lst)):
38+
self.assertEqual(sums[i],tree.sum_of_n(i))

0 commit comments

Comments
 (0)