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
posted @ 2021-02-08 18:39  e-yi  阅读(22)  评论(0)    收藏  举报  来源