1

我需要一个优先级队列,我猜在框架中,CHMutableArrayHeap 和 CHBinaryHeap 可以完成这项工作,对吧?

但是,如果我将具有相同优先级的对象发送到队列,CHMutableArrayHeap 和 CHBinaryHeap 都无法维持它们的添加顺序。

例如,我有对象 obj1 到 obj10,它们的优先级是相同的。我把这10个对象从1到10一个一个加入队列后,它们的位置和加入顺序不一样,obj4可能排在obj1前面。

那么,Quinn,如果我想要一个优先级队列来保持添加顺序,如果优先级相同,你有什么建议?

谢谢

4

1 回答 1

3

(对不起,我刚看到这个问题。)

堆的本质是它根本不保留插入顺序,因此您必须(1)在另一个数据结构上构建优先级队列或(2)用另一个跟踪插入顺序的数据结构来补充堆。但是,堆通常是实现优先级队列的最有效(也是首选)方式,所以我不知道使用其他东西是否是个好主意。我这么说的主要原因是您希望插入速度非常快,这是堆提供的;添加到排序数组不会。

一种可能性是为每个优先级维护一个队列(例如 CHCircularBufferQueue)。(我想你想创建一个管理队列的包装器结构,这样调用者就不必直接处理它们。)你可以将队列存储在由包含优先级的 NSNumber 键入的字典中,但我不知道表演会是什么样子。这显然不能非常有效地扩展到非常广泛的优先级范围,并且可能不适用于大量插入和删除,但在小情况下它可能是可行的。只是一个想法。

另一个想法是创建一个包装类来存储优先级和插入时间,然后按顺序比较它们。在这种情况下,您可能希望使用排序集(例如二叉树)来存储它们。但是,增加的开销意味着您不会获得与堆相同的性能,但我认为这是维护插入顺序的权衡。

更新:我发现了这些相关问题:

https://stackoverflow.com/questions/tagged/priority-queue

于 2011-09-07T04:48:35.707 回答