【问题标题】:Removing percentage of a priority queue in python在python中删除优先级队列的百分比
【发布时间】:2018-06-11 13:17:15
【问题描述】:

有没有办法在队列达到一定大小后移除一定百分比(比如 20 个)?

这个问题源于使用搜索算法将根父板的子节点保存在优先级队列中的问题。有这么多不同的节点要经过,需要20多个小时才能找到解决方案。我想粗略削减队列以缩短节点数量,以便更快地找到解决方案,但有可能会丢弃导致该目标的基本节点。

【问题讨论】:

  • 对删除哪 20% 有任何限制吗?例如,最高优先级的 20%?那些优先级最低的?随意?在优先级之间平均分配?等等。另外,你指的是哪个优先级队列——heapq 是在标准库中,还是在另一个?此外,您是否希望自动删除,或者监督例程是否可以在需要时调用删除?
  • 最高优先级 20% 是防止删除最重要节点的好规则。我已将我的优先级队列(从队列中导入)更改为 heapq。这工作得更快。这将有助于我的运行时。应该测试均匀分布或随机分布,看看哪个效果更好,这个项目需要反复试验,因为问题非常复杂。最简单的方法是在达到一定阈值后自动删除。
  • 您可以实现min-max heap,这将允许您删除最低优先级的 20%,保留最重要的项目。

标签: python queue priority-queue


【解决方案1】:

假设您不关心要删除哪些 20% 的项目,所以我选择删除那些在队列中不成比例地具有最低优先级的项目。我们还假设 Python 标准库中的优先级队列为heapq。最后,让我们假设这个删除是由调用例程完成的,只要他们选择这样做,而不是由优先级队列结构本身自动完成。

heapq 中的优先级队列是一个标准的 Python 列表,添加了一些函数。如果您的优先级队列命名为mypqueue,您可以删除大约 20% 的项目,优先考虑那些优先级较低的项目,使用

mypqueue = mypqueue[:len(mypqueue) * 4 // 5]

或稍短的替代方案,

mypqueue[len(mypqueue) * 4 // 5:] = []

这只是将列表截断为其长度的 4/5,移除列表的末尾。这是可行的,因为堆的属性保留在此截断中,所以如果 mypqueue 是基于堆的优先级队列,它仍然是。

当然,这可以放入它自己的函数中。您还可以轻松地根据 Python 的列表创建一个新类,当队列大小达到一定数量时,它会自动执行此操作。我会把这些留给你。

【讨论】:

  • 一个有趣的解决方案,尽管删除的项目不一定会偏向最低优先级的项目。除去 20%,您知道它们都是叶节点,但很有可能它们中的许多将是相当高优先级的项目。但你确实限定了你的答案并说:“假设你不在乎哪 20%。”
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多