python 动态优先级 优先队列 代码
基本来自官方文档的示例https://docs.python.org/zh-cn/3/library/heapq.html (3.9.1)
- 使用entry_finder索引所有存在的项目
- 当从堆中去除某个项时,仅把该项(的task)标作REMOVED
- 更新时使用add_task函数输入原task和新的priority
- heapq在比较元组时,会按顺序将元组的第k项作为第k关键词进行比较。所以[priority, count, task]中count的作用是为了比较priority相同的项目。由于我们会修改”删除”项目的task为REMOVED,所以标记删除的项目和正常项目的task是无法比较的,如[1,(1,2,3)]、[1,’<removed-task>']两项比较时就会报错(因为(1,2,3)无法和字符串比较)。这里用了count保证在比较到count这个第二关键词时就会结束(也许有特殊情况?)。
- 我的修改点在于给count赋值的地方加了一个负号。因为heapq是最小堆,所以原有的实现会把正常项目放到标记删除的项目前面,导致标记删除的项目在堆中堆积。
pq = [] # list of entries arranged in a heap
entry_finder = {} # mapping of tasks to entries
REMOVED = '<removed-task>' # placeholder for a removed task
counter = iter

浙公网安备 33010602011771号