优先级队列(python)
2024-08-26 11:26:41
# -*- 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']
最新文章
- java 入门 第三季1
- phpMyAdmin:无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装。
- PHP操作MySQL的常用函数
- POJ2823 Sliding Window (单调队列)
- Django – query not equal
- tokudb引擎安装-2
- When Colon Scripting is comming
- poj 3370 Halloween treats(鸽巢原理)
- HDU1029时钟(排序)
- css如何li中选中后加上class属性js控制
- WAS ND集群中的HTTP内存会话复制对Java应用程序序列化编程的要求
- php array_walk_recursive函数的使用
- 设计模式:基于线程池的并发Visitor模式
- replace to
- __proto__ 与 prototype
- 托管ASP.NET Core应用程序到Windows服务中
- [福州大学]W班平时成绩排名
- jQuery简介和基础
- Windows环境下编译Assimp库生成Android可用的.so或.a文件
- builder模式-积木系列
热门文章
- Kubernetes 集群日志管理 Elasticsearch + fluentd(二十)
- centos 安装 swoole_framework 框架
- hadoop进阶---hadoop性能优化(一)---hdfs空间不足的管理优化
- LeetCode 290. 单词规律(Word Pattern) 41
- LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
- 11 Sping框架--AOP的相关概念及其应用
- 使用PHP开发HR系统(4)
- CI中如何配置BootStrap
- 使用jQuery开发accordion手风琴插件