# -*- coding:utf-8 -*-

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 i in range(len(self._items)):
self._items[i] = value def __iter__(self):
for item in self._items:
yield item 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')
self._elements[self._count] = value
self._count += 1
self._siftup(self._count-1) def _siftup(self, ndx):
if ndx > 0:
parent = int((ndx-1)/2)
if self._elements[ndx] > self._elements[parent]:
self._elements[ndx], self._elements[parent] = self._elements[parent], self._elements[ndx]
self._siftup(parent) def extract(self):
if self._count <= 0:
raise Exception('empty')
value = self._elements[0]
self._count -= 1
self._elements[0] = self._elements[self._count]
self._siftdown(0)
return value def _siftdown(self, ndx):
left = 2 * ndx + 1
right = 2 * ndx + 2
# determine which node contains the larger value
largest = ndx
if (left < self._count and # 有左孩子
self._elements[left] >= self._elements[largest] and
self._elements[left] >= self._elements[right]): # 原书这个地方没写实际上找的未必是largest
largest = left
elif right < self._count and self._elements[right] >= self._elements[largest]:
largest = right
if largest != ndx:
self._elements[ndx], self._elements[largest] = self._elements[largest], self._elements[ndx]
self._siftdown(largest) class PriorityQueue(object):
def __init__(self, maxsize):
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 def test_priority_queue():
size = 5
pq = PriorityQueue(size)
pq.push(5, 'purple')
pq.push(0, 'white')
pq.push(3, 'orange')
pq.push(1, 'black') res = []
while not pq.is_empty():
res.append(pq.pop())
assert res == ['purple', 'orange', 'black', 'white']

最新文章

  1. java 入门 第三季1
  2. phpMyAdmin:无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装。
  3. PHP操作MySQL的常用函数
  4. POJ2823 Sliding Window (单调队列)
  5. Django – query not equal
  6. tokudb引擎安装-2
  7. When Colon Scripting is comming
  8. poj 3370 Halloween treats(鸽巢原理)
  9. HDU1029时钟(排序)
  10. css如何li中选中后加上class属性js控制
  11. WAS ND集群中的HTTP内存会话复制对Java应用程序序列化编程的要求
  12. php array_walk_recursive函数的使用
  13. 设计模式:基于线程池的并发Visitor模式
  14. replace to
  15. __proto__ 与 prototype
  16. 托管ASP.NET Core应用程序到Windows服务中
  17. [福州大学]W班平时成绩排名
  18. jQuery简介和基础
  19. Windows环境下编译Assimp库生成Android可用的.so或.a文件
  20. builder模式-积木系列

热门文章

  1. Kubernetes 集群日志管理 Elasticsearch + fluentd(二十)
  2. centos 安装 swoole_framework 框架
  3. hadoop进阶---hadoop性能优化(一)---hdfs空间不足的管理优化
  4. LeetCode 290. 单词规律(Word Pattern) 41
  5. LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
  6. LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
  7. 11 Sping框架--AOP的相关概念及其应用
  8. 使用PHP开发HR系统(4)
  9. CI中如何配置BootStrap
  10. 使用jQuery开发accordion手风琴插件