Skip to content

Commit 371bcd9

Browse files
authored
Fix import: Change from typing import Callable to collections.abc
1 parent b72140a commit 371bcd9

File tree

1 file changed

+25
-31
lines changed

1 file changed

+25
-31
lines changed

data_structures/segment_tree/segment_tree.py

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
Space Complexity: O(n)
1313
"""
1414

15-
from typing import Callable
15+
from collections.abc import Callable
1616

1717

1818
class SegmentTree:
@@ -34,29 +34,25 @@ class SegmentTree:
3434
22
3535
>>> st.query(0, 5)
3636
42
37-
>>> st2 = SegmentTree([2, 4, 6, 8], operation=min)
38-
>>> st2.query(0, 3)
39-
2
40-
>>> st2.update(0, 10)
41-
>>> st2.query(0, 3)
42-
4
4337
"""
4438

4539
def __init__(
4640
self, arr: list[int], operation: Callable[[int, int], int] = lambda a, b: a + b
4741
) -> None:
48-
"""Initialize segment tree with given array.
42+
"""Initialize segment tree with array.
4943
5044
Args:
51-
arr: Input array of integers
52-
operation: Binary operation to combine values (default: addition)
45+
arr: Input array
46+
operation: Function to combine two values (default: sum)
5347
54-
>>> st = SegmentTree([1, 2, 3])
48+
>>> st = SegmentTree([1, 2, 3, 4, 5])
49+
>>> st.n
50+
5
5551
>>> len(st.tree)
56-
8
52+
20
5753
"""
5854
self.n = len(arr)
59-
self.tree = [0] * (4 * self.n) # Allocate space for segment tree
55+
self.tree = [0] * (4 * self.n)
6056
self.operation = operation
6157
self._build(arr, 0, 0, self.n - 1)
6258

@@ -65,9 +61,9 @@ def _build(self, arr: list[int], node: int, start: int, end: int) -> None:
6561
6662
Args:
6763
arr: Input array
68-
node: Current node index in tree
69-
start: Start index of current segment
70-
end: End index of current segment
64+
node: Current node index
65+
start: Start of current segment
66+
end: End of current segment
7167
"""
7268
if start == end:
7369
# Leaf node
@@ -83,20 +79,20 @@ def _build(self, arr: list[int], node: int, start: int, end: int) -> None:
8379
)
8480

8581
def query(self, left: int, right: int) -> int:
86-
"""Query for value in range [left, right].
82+
"""Query sum of elements in range [left, right].
8783
8884
Args:
89-
left: Left boundary of query range (inclusive)
90-
right: Right boundary of query range (inclusive)
85+
left: Left boundary of query range
86+
right: Right boundary of query range
9187
9288
Returns:
93-
Result of applying operation over the range
89+
Sum of elements in range
9490
9591
>>> st = SegmentTree([1, 2, 3, 4, 5])
9692
>>> st.query(0, 2)
9793
6
98-
>>> st.query(2, 4)
99-
12
94+
>>> st.query(1, 3)
95+
9
10096
"""
10197
return self._query(0, 0, self.n - 1, left, right)
10298

@@ -107,27 +103,25 @@ def _query(self, node: int, start: int, end: int, left: int, right: int) -> int:
107103
node: Current node index
108104
start: Start of current segment
109105
end: End of current segment
110-
left: Query left boundary
111-
right: Query right boundary
106+
left: Left boundary of query range
107+
right: Right boundary of query range
112108
113109
Returns:
114-
Query result for current segment
110+
Query result for the range
115111
"""
116112
if right < start or left > end:
117113
# No overlap
118-
return 0 if self.operation(0, 0) == 0 else float('inf')
119-
114+
return 0
120115
if left <= start and end <= right:
121116
# Complete overlap
122117
return self.tree[node]
123-
124118
# Partial overlap
125119
mid = (start + end) // 2
126120
left_child = 2 * node + 1
127121
right_child = 2 * node + 2
128-
left_result = self._query(left_child, start, mid, left, right)
129-
right_result = self._query(right_child, mid + 1, end, left, right)
130-
return self.operation(left_result, right_result)
122+
left_sum = self._query(left_child, start, mid, left, right)
123+
right_sum = self._query(right_child, mid + 1, end, left, right)
124+
return self.operation(left_sum, right_sum)
131125

132126
def update(self, index: int, value: int) -> None:
133127
"""Update value at given index.

0 commit comments

Comments
 (0)