File tree Expand file tree Collapse file tree 2 files changed +43
-3
lines changed Expand file tree Collapse file tree 2 files changed +43
-3
lines changed Original file line number Diff line number Diff line change 1
1
class FenwickTree :
2
2
3
3
def __init__ (self , arr ):
4
+ self .nums = [0 ] * (len (arr )+ 1 )
4
5
self .tree = [0 ] * (len (arr )+ 1 )
5
-
6
+
6
7
for i in range (len (arr )):
7
8
self .update (i ,arr [i ])
8
9
9
10
def update (self , index , value ):
10
11
index += 1
12
+ delta = value - self .nums [index ]
13
+ self .nums [index ] = value
11
14
while index <= len (self .tree )- 1 :
12
- self .tree [index ] += value
15
+ self .tree [index ] += delta
13
16
index += index & (- index )
14
17
15
18
def sum_of_n (self , index ):
@@ -25,5 +28,4 @@ def sum_of_n(self, index):
25
28
def sum_of_range (self , start , end ):
26
29
# minus 1 from start since the range is (s, e) inclusive on both ends
27
30
start -= 1
28
- print (self .sum_of_n (end ), self .sum_of_n (start ))
29
31
return self .sum_of_n (end ) - self .sum_of_n (start )
Original file line number Diff line number Diff line change
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 ))
You can’t perform that action at this time.
0 commit comments