Skip to content

Commit b792463

Browse files
committed
Heaps uses DynamicOneDimensionalArray
1 parent 6ad68dc commit b792463

File tree

3 files changed

+26
-19
lines changed

3 files changed

+26
-19
lines changed

pydatastructs/linear_data_structures/arrays.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ def delete(self, idx):
255255
def size(self):
256256
return self._size
257257

258+
def __len__(self):
259+
return self._size
260+
258261
class ArrayForTrees(DynamicOneDimensionalArray):
259262
"""
260263
Utility dynamic array for storing nodes of a tree.

pydatastructs/trees/heaps.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,16 @@ def __new__(cls, elements=None, heap_property="min", d=4):
8282
else:
8383
raise ValueError("%s is invalid heap property"%(heap_property))
8484
if elements is None:
85-
elements = []
85+
elements = DynamicOneDimensionalArray(TreeNode, 0)
86+
# elements = []
8687
obj.heap = elements
87-
obj._last_pos_filled = len(elements) - 1
88+
obj._last_pos_filled = obj.heap._last_pos_filled
8889
obj._build()
8990
return obj
9091

9192
def _build(self):
9293
for i in range(self._last_pos_filled + 1):
93-
self.heap[i].left, self.heap[i].right = \
94+
self.heap[i]._leftmost, self.heap[i]._rightmost = \
9495
self.d*i + 1, self.d*i + self.d
9596
for i in range((self._last_pos_filled + 1)//self.d, -1, -1):
9697
self._heapify(i)
@@ -143,7 +144,7 @@ def insert(self, key, data):
143144
self.heap.append(new_node)
144145
self._last_pos_filled += 1
145146
i = self._last_pos_filled
146-
self.heap[i].left, self.heap[i].right = self.d*i + 1, self.d*i + self.d
147+
self.heap[i]._leftmost, self.heap[i]._rightmost = self.d*i + 1, self.d*i + self.d
147148

148149
while True:
149150
parent = (i - 1)//self.d
@@ -171,22 +172,23 @@ def extract(self):
171172
else:
172173
element_to_be_extracted = TreeNode(self.heap[0].key, self.heap[0].data)
173174
self._swap(0, self._last_pos_filled)
174-
self.heap[self._last_pos_filled] = TreeNode(float('inf') if self.heap_property == 'min'
175-
else float('-inf'), None)
176-
self._heapify(0)
177-
self.heap.pop()
175+
# self.heap[self._last_pos_filled] = TreeNode(float('inf') if self.heap_property == 'min'
176+
# else float('-inf'), None)
177+
self.heap.delete(self._last_pos_filled)
178178
self._last_pos_filled -= 1
179+
self._heapify(0)
180+
# self.heap.pop
179181
return element_to_be_extracted
180182

181183
def __str__(self):
182184
to_be_printed = ['' for i in range(self._last_pos_filled + 1)]
183185
for i in range(self._last_pos_filled + 1):
184186
node = self.heap[i]
185-
if node.left <= self._last_pos_filled:
186-
if node.right <= self._last_pos_filled:
187-
children = [x for x in range(node.left, node.right + 1)]
187+
if node._leftmost <= self._last_pos_filled:
188+
if node._rightmost <= self._last_pos_filled:
189+
children = [x for x in range(node._leftmost, node._rightmost + 1)]
188190
else:
189-
children = [x for x in range(node.left, self._last_pos_filled + 1)]
191+
children = [x for x in range(node._leftmost, self._last_pos_filled + 1)]
190192
else:
191193
children = []
192194
to_be_printed[i] = (node.key, node.data, children)
@@ -303,6 +305,7 @@ class TernaryHeap(DHeap):
303305
==========
304306
305307
.. [1] https://en.wikipedia.org/wiki/D-ary_heap
308+
.. [2] https://ece.uwaterloo.ca/~dwharder/aads/Algorithms/d-ary_heaps/Ternary_heaps/
306309
"""
307310
def __new__(cls, elements=None, heap_property="min"):
308311
obj = DHeap.__new__(cls, elements, heap_property, 3)

pydatastructs/trees/tests/test_heaps.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from pydatastructs.trees.heaps import BinaryHeap, TernaryHeap, BinomialHeap, DHeap
2+
from pydatastructs.linear_data_structures.arrays import DynamicOneDimensionalArray
23
from pydatastructs.miscellaneous_data_structures.binomial_trees import BinomialTree
34
from pydatastructs.utils.misc_util import TreeNode, BinomialTreeNode
45
from pydatastructs.utils.raises_util import raises
@@ -25,10 +26,11 @@ def test_BinaryHeap():
2526
"(3, 3, []), (25, 25, []), (1, 1, []), "
2627
"(2, 2, []), (7, 7, [])]")
2728

28-
expected_extracted_element = max_heap.heap[0].key
29-
assert max_heap.extract().key == expected_extracted_element
29+
assert max_heap.extract().key == 100
3030

3131
expected_sorted_elements = [36, 25, 19, 17, 7, 3, 2, 1]
32+
l=max_heap.heap[0].left
33+
l=max_heap.heap[0].right
3234
sorted_elements = []
3335
for _ in range(8):
3436
sorted_elements.append(max_heap.extract().key)
@@ -39,7 +41,7 @@ def test_BinaryHeap():
3941
TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3),
4042
TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36)
4143
]
42-
min_heap = BinaryHeap(elements = elements, heap_property="min")
44+
min_heap = BinaryHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min")
4345
assert min_heap.extract().key == 1
4446

4547
expected_sorted_elements = [2, 3, 7, 17, 19, 25, 36, 100]
@@ -77,7 +79,7 @@ def test_TernaryHeap():
7779
TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3),
7880
TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36)
7981
]
80-
min_heap = TernaryHeap(elements=elements, heap_property="min")
82+
min_heap = TernaryHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min")
8183
expected_extracted_element = min_heap.heap[0].key
8284
assert min_heap.extract().key == expected_extracted_element
8385

@@ -104,8 +106,7 @@ def test_DHeap():
104106
'(36, 36, []), (17, 17, []), (3, 3, []), (19, 19, []), '
105107
'(1, 1, []), (2, 2, []), (7, 7, [])]')
106108

107-
expected_extracted_element = max_heap.heap[0].key
108-
assert max_heap.extract().key == expected_extracted_element
109+
assert max_heap.extract().key == 100
109110

110111
expected_sorted_elements = [36, 25, 19, 17, 7, 3, 2, 1]
111112
sorted_elements = []
@@ -118,7 +119,7 @@ def test_DHeap():
118119
TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3),
119120
TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36)
120121
]
121-
min_heap = DHeap(elements=elements, heap_property="min")
122+
min_heap = DHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min")
122123
assert min_heap.extract().key == 1
123124

124125
expected_sorted_elements = [2, 3, 7, 17, 19, 25, 36, 100]

0 commit comments

Comments
 (0)