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

Efficient priority queue with multiple keys?

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

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

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

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

如果有 python 的实现,那就太好了,但是算法将是一个很好的开始。

我认为最好的方法是为每个键设置一个单独的堆。当你移除一个堆的第一个元素时,你不能有效地将它从其他堆中移除,但你可以 "mark" 它以某种方式(例如通过改变它,或者将它添加到 set 如果它是可散列的),这样如果它最终在其他地方再次弹出,它可以被忽略。

这可能会使您的堆膨胀一点,因为它会保留无用的值,但我认为它仍然比删除和重新堆放要快得多。