forked from k4zmu2a/SpaceCadetPinball
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtree.py
More file actions
50 lines (37 loc) · 1.33 KB
/
tree.py
File metadata and controls
50 lines (37 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class SumTree:
def __init__(self, size):
self.nodes = [0] * (2 * size - 1)
self.data = [None] * size
self.size = size
self.count = 0
self.real_size = 0
@property
def total(self):
return self.nodes[0]
def update(self, data_idx, value):
idx = data_idx + self.size - 1 # child index in tree array
change = value - self.nodes[idx]
self.nodes[idx] = value
parent = (idx - 1) // 2
while parent >= 0:
self.nodes[parent] += change
parent = (parent - 1) // 2
def add(self, value, data):
self.data[self.count] = data
self.update(self.count, value)
self.count = (self.count + 1) % self.size
self.real_size = min(self.size, self.real_size + 1)
def get(self, cumsum):
assert cumsum <= self.total
idx = 0
while 2 * idx + 1 < len(self.nodes):
left, right = 2*idx + 1, 2*idx + 2
if cumsum <= self.nodes[left]:
idx = left
else:
idx = right
cumsum = cumsum - self.nodes[left]
data_idx = idx - self.size + 1
return data_idx, self.nodes[idx], self.data[data_idx]
def __repr__(self):
return f"SumTree(nodes={self.nodes.__repr__()}, data={self.data.__repr__()})"