class Array(object):
def __init__(self, size=32):
self._size = size
self._items = [None] * size
def __getitem__(self, index):
return self._items[index]
def __setitem(self, index, value):
self._items[index] = value
def __len__(self):
return self._size
def clear(self, value=None):
for _ in range(self._items):
self._items[_] = value
def iter(self):
for _ in self._items:
yield _
class MaxHeap(object):
def __init__(self, maxsize=None):
self.maxsize = maxsize
self._elements = Array(maxsize)
self._count = 0
def __len__(self):
return self._count
def add(self, value):
if self._count >= self.maxsize:
raise Exception('Full of size')
self._elements[self._count] = value
self._count += 1
self._siftup(self._count-1)
def _siftup(self, idx):
'''
用递归的方法满足最大堆的特性
'''
if idx > 0:
parent = (idx-1) // 2
if self._elements[idx] > self._elements[parent]:
self._elements[idx], self._elements[parent] = self._elements[parent],self._elements[idx]
self._siftup(parent)
def extract(self):
if self._count <= 0:
raise Exception("Empty!!")
value = self._elements[0]
self.clear -= 1
self._elements[0] = self._elements[self._count]
self._siftdown(0)
return value
def _siftdown(self, idx):
left = 2 * idx + 1
right = 2 * idx + 2
largest = idx
if (left < self._count
and self._elements[left] >= self._elements[largest]
and self._elements[left] > self._elements[right]):
largest = left
elif right < self._count and self._elements[right] >= self._elements[largest]:
largest = right
if largest != idx:
self._elements[largest],self._elements[idx] = self._elements[idx],self._elements[largest]
self._siftdown(largest)
class Prioriyt_Queue(object):
def __init__(self, maxsize=None):
self.maxsize = maxsize
self._maxheap = MaxHeap(maxsize)
def push(self, priority, value):
entry = (priority, value)
self._maxheap.add(entry)
def pop(self, with_priority=False):
entry = self._maxheap.extract()
if with_priority:
return entry
else:
return entry[1]
def is_empty(self):
return len(self._maxheap) == 0