From 3b3e067d95c2cd79af56d98dc950d845568017c2 Mon Sep 17 00:00:00 2001 From: Harsheet-saxena Date: Thu, 26 Mar 2020 17:52:48 +0530 Subject: [PATCH 1/5] heap supports Array type --- pydatastructs/trees/heaps.py | 20 +++++++++++++++----- pydatastructs/trees/tests/test_heaps.py | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pydatastructs/trees/heaps.py b/pydatastructs/trees/heaps.py index ee69c7b99..7e6d3f3d9 100644 --- a/pydatastructs/trees/heaps.py +++ b/pydatastructs/trees/heaps.py @@ -1,6 +1,6 @@ from pydatastructs.utils.misc_util import _check_type, NoneType, TreeNode, BinomialTreeNode from pydatastructs.linear_data_structures.arrays import (ArrayForTrees, - DynamicOneDimensionalArray) + DynamicOneDimensionalArray, Array) from pydatastructs.miscellaneous_data_structures.binomial_trees import BinomialTree __all__ = [ @@ -24,7 +24,7 @@ class DHeap(Heap): Parameters ========== - elements : list, tuple + elements : list, tuple, Array Optional, by default 'None'. List/tuple of initial TreeNode in Heap. @@ -84,9 +84,15 @@ def __new__(cls, elements=None, heap_property="min", d=4): raise ValueError("%s is invalid heap property"%(heap_property)) if elements is None: elements = DynamicOneDimensionalArray(TreeNode, 0) - else: + elif type(elements) in (list,tuple): if not all(map(lambda x: _check_type(x, TreeNode), elements)): - raise ValueError("Expect a list/tuple of TreeNode got %s"%(elements)) + raise ValueError("Expected a list/tuple/Array of TreeNode got %s"%(elements)) + elements = DynamicOneDimensionalArray(TreeNode, len(elements), elements) + elif _check_type(elements, Array): + if(not _check_type(elements[0], TreeNode)): + raise ValueError(f'Expected a list/tuple/Array of TreeNode got {type(elements[0])}') + else: + raise ValueError(f'Expected a list/tuple/Array of TreeNode got {type(elements)}') obj.heap = elements obj._last_pos_filled = obj.heap._last_pos_filled obj._build() @@ -326,7 +332,7 @@ class BinomialHeap(Heap): Parameters ========== - root_list: list/tuple + root_list: list/tuple/Array By default, [] The list of BinomialTree object references in sorted order. @@ -531,3 +537,7 @@ def delete(self, node): """ self.decrease_key(node, self.find_minimum().key - 1) self.delete_minimum() + +if __name__ == "__main__": + from pydatastructs import OneDimensionalArray + h = BinaryHeap(OneDimensionalArray(TreeNode,[TreeNode(i,i) for i in range(5)])) diff --git a/pydatastructs/trees/tests/test_heaps.py b/pydatastructs/trees/tests/test_heaps.py index ed9fedff4..60c786687 100644 --- a/pydatastructs/trees/tests/test_heaps.py +++ b/pydatastructs/trees/tests/test_heaps.py @@ -41,7 +41,7 @@ def test_BinaryHeap(): TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3), TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36) ] - min_heap = BinaryHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min") + min_heap = BinaryHeap(elements=elements, heap_property="min") assert min_heap.extract().key == 1 expected_sorted_elements = [2, 3, 7, 17, 19, 25, 36, 100] @@ -86,7 +86,7 @@ def test_TernaryHeap(): TreeNode(1, 1), TreeNode(2, 2), TreeNode(3, 3), TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36) ] - min_heap = TernaryHeap(elements=DynamicOneDimensionalArray(TreeNode, 9, elements), heap_property="min") + min_heap = TernaryHeap(elements=elements, heap_property="min") expected_extracted_element = min_heap.heap[0].key assert min_heap.extract().key == expected_extracted_element From 71051cfe50f4d97598addd155b6ca90ece2f5847 Mon Sep 17 00:00:00 2001 From: Harsheet-saxena Date: Thu, 26 Mar 2020 18:04:11 +0530 Subject: [PATCH 2/5] added tests --- pydatastructs/trees/tests/test_heaps.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pydatastructs/trees/tests/test_heaps.py b/pydatastructs/trees/tests/test_heaps.py index 60c786687..9cba52ddc 100644 --- a/pydatastructs/trees/tests/test_heaps.py +++ b/pydatastructs/trees/tests/test_heaps.py @@ -55,6 +55,17 @@ def test_BinaryHeap(): ] assert raises(ValueError, lambda: BinaryHeap(elements = non_TreeNode_elements, heap_property='min')) + + non_TreeNode_elements = DynamicOneDimensionalArray(int, 0) + non_TreeNode_elements.append(1) + non_TreeNode_elements.append(2) + assert raises(ValueError, lambda: + BinaryHeap(elements = non_TreeNode_elements, heap_property='min')) + + non_heapable = "[1, 2, 3]" + assert raises(ValueError, lambda: + BinaryHeap(elements = non_heapable, heap_property='min')) + def test_TernaryHeap(): max_heap = TernaryHeap(heap_property="max") assert raises(IndexError, lambda: max_heap.extract()) From 35cca77c7025cf95f4450f893795400a8485588f Mon Sep 17 00:00:00 2001 From: Harsheet-saxena Date: Thu, 26 Mar 2020 18:06:05 +0530 Subject: [PATCH 3/5] removed ifmain --- pydatastructs/trees/heaps.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pydatastructs/trees/heaps.py b/pydatastructs/trees/heaps.py index 7e6d3f3d9..bba40255e 100644 --- a/pydatastructs/trees/heaps.py +++ b/pydatastructs/trees/heaps.py @@ -537,7 +537,3 @@ def delete(self, node): """ self.decrease_key(node, self.find_minimum().key - 1) self.delete_minimum() - -if __name__ == "__main__": - from pydatastructs import OneDimensionalArray - h = BinaryHeap(OneDimensionalArray(TreeNode,[TreeNode(i,i) for i in range(5)])) From 0600e83adbdd53700e5dca64d99373e4b6cd6931 Mon Sep 17 00:00:00 2001 From: czgdp1807 Date: Tue, 31 Mar 2020 23:32:17 +0530 Subject: [PATCH 4/5] made updates --- pydatastructs/trees/heaps.py | 7 ++----- pydatastructs/trees/tests/test_heaps.py | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pydatastructs/trees/heaps.py b/pydatastructs/trees/heaps.py index bba40255e..afdbe84e3 100644 --- a/pydatastructs/trees/heaps.py +++ b/pydatastructs/trees/heaps.py @@ -84,13 +84,10 @@ def __new__(cls, elements=None, heap_property="min", d=4): raise ValueError("%s is invalid heap property"%(heap_property)) if elements is None: elements = DynamicOneDimensionalArray(TreeNode, 0) - elif type(elements) in (list,tuple): - if not all(map(lambda x: _check_type(x, TreeNode), elements)): - raise ValueError("Expected a list/tuple/Array of TreeNode got %s"%(elements)) + elif _check_type(elements, (list,tuple)): elements = DynamicOneDimensionalArray(TreeNode, len(elements), elements) elif _check_type(elements, Array): - if(not _check_type(elements[0], TreeNode)): - raise ValueError(f'Expected a list/tuple/Array of TreeNode got {type(elements[0])}') + elements = DynamicOneDimensionalArray(TreeNode, len(elements), elements._data) else: raise ValueError(f'Expected a list/tuple/Array of TreeNode got {type(elements)}') obj.heap = elements diff --git a/pydatastructs/trees/tests/test_heaps.py b/pydatastructs/trees/tests/test_heaps.py index 9cba52ddc..dece2f132 100644 --- a/pydatastructs/trees/tests/test_heaps.py +++ b/pydatastructs/trees/tests/test_heaps.py @@ -53,13 +53,13 @@ def test_BinaryHeap(): TreeNode(1, 1), (2, 2), TreeNode(3, 3), TreeNode(17, 17), TreeNode(19, 19), TreeNode(36, 36) ] - assert raises(ValueError, lambda: + assert raises(TypeError, lambda: BinaryHeap(elements = non_TreeNode_elements, heap_property='min')) non_TreeNode_elements = DynamicOneDimensionalArray(int, 0) non_TreeNode_elements.append(1) non_TreeNode_elements.append(2) - assert raises(ValueError, lambda: + assert raises(TypeError, lambda: BinaryHeap(elements = non_TreeNode_elements, heap_property='min')) non_heapable = "[1, 2, 3]" From 18550160129a838c19c1753b4d6f8480c3094375 Mon Sep 17 00:00:00 2001 From: czgdp1807 Date: Tue, 31 Mar 2020 23:35:18 +0530 Subject: [PATCH 5/5] minor doc update --- pydatastructs/trees/heaps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydatastructs/trees/heaps.py b/pydatastructs/trees/heaps.py index afdbe84e3..4d6eb1ad5 100644 --- a/pydatastructs/trees/heaps.py +++ b/pydatastructs/trees/heaps.py @@ -26,7 +26,7 @@ class DHeap(Heap): elements : list, tuple, Array Optional, by default 'None'. - List/tuple of initial TreeNode in Heap. + list/tuple/Array of initial TreeNode in Heap. heap_property : str