【问题标题】:How to update priority of an entry in a PriorityQueue?如何更新 PriorityQueue 中条目的优先级?
【发布时间】:2020-08-09 13:59:32
【问题描述】:

我正在使用

from queue import PriorityQueue
pq = PriorityQueue()
pq.put((3, "Harry"))
pq.put((4, "Harry"))
pq.put((2, "Mary"))

这会创建两个“Harry”条目。我是否应该一一删除所有键(用于搜索),然后执行 put 以更新值?

【问题讨论】:

  • 您要更新哪个“哈利”?它们已经按入队顺序“排序”了。
  • 我实际上只想在优先级队列中有一个“Harry”,我想将其优先级从 3 更新到 4。“put”函数调用创建两个“Harry”而不是更新第一个“哈利”。
  • 我不认为PriorityQueue 支持删除项目或更改优先级。
  • 顺便说一句,除非您专门将此队列用作将消息从生产者线程发送到消费者线程的通道,否则您可能应该改用heapqqueue 模块专门用作线程间消息传递系统,它具有对其他用途没有意义的设计选择和开销。
  • stackoverflow.com/a/8706363/56778 解释了如何在堆中删除。 Python 的 PriorityQueueheapq 都不能让您访问实现这一点所需的支持数组。

标签: python priority-queue


【解决方案1】:

PriorityQueuepython documentation 没有直接的方法来搜索 Queue 对象中的值。

编辑:PriorityQueue 被实现为binary heap,因此更改元素中的优先级不会像Jim Mischel 所说的那样更新二叉树:

更改节点的优先级会导致堆可能无效。

【讨论】:

  • 您的代码生成 PriorityQueue,其内容为:(1, 'Harry'), (2, 'Mary'), (3, 'Harry') — 所以似乎不起作用。
  • 另一件事是,虽然queue 属性没有标记为私有,但我不认为使用它是PriorityQueue(或常规Queue)的公共接口的一部分。 )。
  • 我写评论时的代码不会改变项目的优先级。通过优先级队列进行线性搜索 O(n) 似乎也适得其反。
  • 你的 `change_priority_of' 方法不起作用。如果您更改优先级的节点不在添加新“虚拟”节点的树的同一分支上,则添加和删除节点不会影响它。更改节点的优先级会导致可能无效的堆。该堆上的任何进一步操作都有可能中断。
  • stackoverflow.com/a/8706363/56778 解释了如何在堆中删除。 Python 的 PriorityQueueheapq 都不能让您访问实现这一点所需的支持数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2010-12-24
  • 1970-01-01
  • 2012-06-15
  • 2012-02-24
相关资源
最近更新 更多