具有多个密钥的高效优先级队列?

时间:2016-03-15 11:04:03

标签: python priority-queue

我遇到了一个问题,我很确定有人已经遇到并解决了,但我找不到解决方案。

我有许多对象,每个对象都有几个键。说:

  • (1,2):A
  • (3,3):B
  • (4,4):C
  • (5,1):D

我需要一个"优先级队列"类似的数据结构,它允许我分别按优先级为每个键有效地返回对象。例如,如果我通过第一个键返回它们,我会得到(A,B,C,D),而通过第二个键,我会得到(D,A,B,C)。但是,我还需要能够混合。例如,通过键交替返回,从第一个键开始,给我(A,D,B,C)。显然,通过第一个键弹出一个对象应该删除第二个键。

一个天真的解决方案是在更改查找键时使用数据,但对于我的目的来说它太慢了。另一种方法是使用堆并遍历另一个堆,为每个对象删除,但据我所知,这也很慢。是否有一个有效优先级队列的算法,允许我通过多个不同的键删除对象?

如果有一个python的实现,那将是非常好的,但算法将是一个非常好的开始。

1 个答案:

答案 0 :(得分:1)

我认为最好的方法是为每个密钥设置一个单独的堆。当你删除一个堆的第一个元素时,你不能有效地从其他堆中删除它,但是你可以用某种方式“标记”它(例如通过改变它,或者通过将它添加到a1 a2 a3 0 0 0 0 0 0 a1 a2 a3 a1 a2 a3 0 0 0 a1 a2 a3 a1 a2 a3 a1 a2 a3 如果如果它最终会在其他地方再次弹出,那么它可以被忽略。

这可能会使你的堆积膨胀,因为它会保持无用的值,但我认为它仍然比移除和重新加速更快。