在 python 中删除优先级队列的百分比

Removing percentage of a priority queue in python

有没有办法在队列达到一定大小后删除一定比例(比如说 20)的队列?

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

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

heapq中的优先级队列是一个标准的Python列表,增加了一些功能。如果您的优先级队列命名为 mypqueue,您可以删除大约 20% 的项目,这些项目偏向于优先级较低的项目,

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

或更短的替代方案,

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

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

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