#!/usr/bin/python
""" A modeule containing Priority Queue class and corresponding functions"""
def getList():
return [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
def getRandomList():
import random
random.seed()
l = []
for i in range(10):
l.append(random.choice(range(10)))
return l
class PriorityQueue(object):
def __init__(self, l):
self._l = l
self.buildMaxHeap()
@property
def l(self):
return self._l
@l.setter
def l(self, l):
self._l = l
@l.deleter
def l(self):
del self._l
def getLeft(self, index):
"""Get the index of left child
Args:
index (int), index of current node
Returns:
int, index of the left child
"""
return index*2+1
def getRight(self, index):
"""Get the index of right child
Args:
index (int), index of current node
Returns:
int, index of the right child
"""
return index*2+2
def getParent(self, index):
return int((index-1)/2)
def maxHeapify(self, index, n):
"""Max heapify the tree
Args:
i (int), index of current node
n (int), index of the last node
"""
left = self.getLeft(index)
right = self.getRight(index)
largest = index
if left <= n and self._l[left] > self._l[index]:
largest = left
if right <= n and self._l[right] > self._l[largest]:
largest = right
if largest != index:
self._l[largest], self._l[index] = self._l[index], self._l[largest]
self.maxHeapify(largest, n)
def buildMaxHeap(self):
for i in range(len(self._l)/2 - 1, -1, -1):
self.maxHeapify(i, len(self._l)-1)
def heapMax(self):
"""Returns the largest node"""
if len(self._l) <= 0:
return None
return self._l[0]
def extractMax(self):
"""Removes and returns the largest node"""
if len(self._l) <= 0:
return None
self._l[0], self._l[len(self._l)-1] = self._l[len(self._l)-1], self._l[0]
self.maxHeapify(0, len(self._l)-2)
return self._l.pop()
def increaseKey(self, i, key):
"""Increase the value of a node"""
if self._l[i] > key:
return
self.l[i] = key
while i > 0 and self._l[self.getParent(i)] < self._l[i]:
self._l[self.getParent(i)], self._l[i] = self._l[i], self._l[self.getParent(i)]
i = self.getParent(i)
def insert(self, v):
import sys
self._l.append(-sys.maxint-1)
self.increaseKey(len(self._l)-1, v)
def dequeue(self):
return self.extractMax()
def enqueue(self, v):
self.insert(v)
def __str__(self):
return str(self._l)
def main():
# Generate a random list
l = getRandomList()
print(l)
# Build a priority queue
queue = PriorityQueue(l)
print(queue)
# dequeue
m = queue.dequeue()
print(queue)
# enqueue
queue.enqueue(10)
print(queue)
if __name__ == '__main__':
main()