# pqueue implemented as heap
# items must have the item.value filled
class container:
def __init(self):
pass
class heap:
def __init__(self):
self.__items = [None]
self.__items_len = 0
def isempty(self):
return self.__items_len==0;
def min(self):
if self.__items_len == 0:
raise IndexError("pop from an empty heap")
return self.__items[1];
def append(self,new):
# just not to be always checking if reached the first element
self.__items[0]=new
self.__items_len +=1
hole = self.__items_len;
self.__items.append(None)
# percolate up
while new.value < self.__items[hole/2].value:
self.__items[hole] = self.__items[hole/2]
hole /=2
self.__items[hole] = new
def pop(self):
if self.__items_len == 0:
raise IndexError("pop from an empty heap")
min = self.__items[1]
self.__items[1] = self.__items[self.__items_len]
self.__percolate_down(1)
self.__items_len -=1
return min
def importlist(self,elements):
self.__items = [None]
self.__items_len = 0
for element in elements:
self.__items.append(element)
self.__items_len +=1
for i in range(self.__items_len/2,0,-1):
self.__percolate_down(i)
def __percolate_down(self,hole):
tmp = self.__items[hole]
while hole*2 <= self.__items_len:
child = hole*2
if (child != self.__items_len and
self.__items[child+1].value < self.__items[child].value):
child+=1
if self.__items[child].value<tmp.value:
self.__items[hole] = self.__items[child]
else:
break
hole = child
self.__items[hole]=tmp
#values = [10,45,12,9,8,7,4,5,1,2,3]
#keys = ['A','B','C','D','E','F','G','H','I','J','K']
#pq = heap()
#objs=[]
#for k in range(len(keys)):
# obj = container()
# obj.value = values[k]
# obj.key = keys[k]
# objs.append(obj)
# pq.append(obj)
#pq.importlist(objs)
#print pq.min().key , pq.pop().value
#print pq.min().key , pq.pop().value