class MaxHeap_TestCase_1_Pop_With_Predictable_SmallSet_Of_Elements( unittest.TestCase): """ Create only. No heap modification. Small predictable set of elements. """ def setUp(self): self._heap = Heap(min_heap=False) self._heap.add_items([3, 1, 2]) def test_heap_status(self): self.assertFalse(self._heap.is_min_heap, 'heap must be a max heap.') self.assertTrue( assert_max_heap_property(self._heap._get_heap_as_list()), 'heap property must be satisfied.') self.assertTrue([None, 3, 1, 2] == self._heap._get_heap_as_list(), 'heap contents are not same as expected.') #Pop self._heap.get() # self.assertTrue( assert_max_heap_property(self._heap._get_heap_as_list()), 'heap property must be satisfied.') self.assertTrue([None, 2, 1] == self._heap._get_heap_as_list(), 'heap contents are not same as expected.') def tearDown(self): unittest.TestCase.tearDown(self)
class MaxHeap_TestCase_1000_Pops_With_RandomSet_Of_1000_Elements( unittest.TestCase): """ Create only. No heap modification. Small predictable set of elements. """ def setUp(self): self._heap = Heap(min_heap=False) def test_heap_status_on_push_pop(self): self.assertFalse(self._heap.is_min_heap, 'heap must be a max heap.') for i in range(1000): self._heap.add_item(randint(0, 1000)) self.assertTrue( assert_max_heap_property(self._heap._get_heap_as_list()), 'heap property must be satisfied.') #pop all for i in range(1000): self._heap.get() self.assertTrue( assert_max_heap_property(self._heap._get_heap_as_list()), 'heap property must be satisfied.') def tearDown(self): unittest.TestCase.tearDown(self)
class PriorityQueue(object): ''' Priority Q based on Heaps. You can set min heap of max heap. Default is Max Heap. 1) Iterating yields (item, priority) tuples ''' def __init__(self, reverse_priority = False): ''' creates a priority queue such that priority 10 is processed first than priority 2. If you want to reverse this set reverse_priority so that item with priority 2 is processed first ''' self._heap = Heap(min_heap = reverse_priority)#create the heap as needed. Default Max heap def add_item(self, item = None, priority = None): if item == None: return #we are not wasting time self._heap.add_item(PriorityQueueEntry(item = item, priority = priority)) def get(self): priority_q_entry = self._heap.get() if priority_q_entry == None: return None return priority_q_entry.item def __len__(self): return self._heap.heap_size def __iter__(self): for priority_q_entry in self._heap: yield (priority_q_entry.item, priority_q_entry.priority)
''' Created on Oct 25, 2015 @author: hari ''' from __future__ import print_function from builtins import str from pycoils.trees.heap import Heap if __name__ == '__main__': # A max heap. for a min heap use minHeap = True (is default) max_heap = Heap(min_heap = False) elements = [0, 4, 3, 2, 5, 1, 6] print('Adding elements to heap: %s' % elements) for element in elements: max_heap.add_item(element) print('Getting element from max heap') element = max_heap.get() print('Top element from heap is %s' % str(element)) print('Iterating through heap') for element in max_heap: print('heap popped %s' % str(element))