优先队列

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




posted @ 2020-04-16 17:34  ColaIce  阅读(87)  评论(0)    收藏  举报