代码之家  ›  专栏  ›  技术社区  ›  R A

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

  •  1
  • R A  · 技术社区  · 7 年前

    有没有一种方法可以在队列达到一定大小时移除队列的某个百分比(比如20)?

    这个问题源于这样一个问题:使用搜索算法将根父板的子节点保存在优先级队列中。有太多不同的节点需要通过,因此需要20多个小时才能找到解决方案。我希望在队列中进行粗略的裁剪,以缩短节点数,以便更快地找到解决方案,同时有可能丢弃将导致该目标的关键节点。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Rory Daulton    7 年前

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

    优先级队列 heapq 是一个添加了一些函数的标准python列表。如果您的优先级队列命名为 mypqueue 您可以删除大约20%的项目,加权到那些具有较低优先级的项目。

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

    或者稍微短一点的替代品,

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

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

    当然,这可以成为它自己的一个功能。您还可以根据python的列表轻松创建一个新类,当队列的大小达到一定数量时,该类将自动执行此操作。我把这些留给你。