我需要一个优先级队列,我猜在框架中,CHMutableArrayHeap和CHBinaryHeap可以完成这项工作,对吗?
但是,如果我向队列发送具有相同优先级的对象,则CHMutableArrayHeap和CHBinaryHeap都无法维护其添加顺序。
例如,我有obj1到obj10的对象,它们的优先级是相同的。在将这10个对象从1到10逐个添加到队列中之后,它们的位置与添加顺序不同,obj4可能会出现在obj1之前。
那么,Quinn,如果我希望优先队列保持添加顺序,如果优先级相同,你会建议什么?
由于
答案 0 :(得分:3)
(抱歉,我几乎没有看到这个问题。)
堆的本质是它根本不保留插入顺序,因此您必须(1)在另一个数据结构上构建优先级队列或(2)用另一个跟踪的数据结构补充堆插入顺序。但是,堆通常是实现优先级队列的最有效(和首选)方式,所以我不知道使用其他东西是否是个好主意。我说这个的主要原因是你希望插入速度非常快,这是堆提供的;添加到已排序的数组不会。
一种可能性是为每个优先级维护队列(例如CHCircularBufferQueue)。 (我想你想要创建一个管理队列的包装器结构,这样调用者就不必直接处理它们。)你可以将队列存储在一个由包含优先级的NSNumber键入的字典中,但是我不知道性能会是什么样子。这显然不能非常有效地扩展到极其广泛的优先级,并且可能不会针对大量插入和删除,但在小情况下它可能是可行的。只是一个想法。
另一个想法是创建一个包含优先级和插入时间的包装类,然后按顺序对它们进行比较。在这种情况下,您可能希望使用有序集(例如二叉树)来存储它们。但是,增加的开销意味着你将无法获得与堆相同的性能,但我认为这是维持插入顺序的权衡。
更新:我发现了以下相关问题: