【问题标题】:CHDataStructures: Priority Queue?CHDataStructures:优先队列?
【发布时间】:2011-08-21 19:15:19
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • +close,过于本地化:我认为 SO 不是向特定人员提问的最合适场所。尝试电子邮件或项目页面的“讨论”。
  • 嗯,这实际上是一个普遍的问题。这只是关于 CHDataStructures,我可以删除第一句话以防万一有人知道答案。如果您认为这对 CHDataStructures 过于具体,请查看有关 CHDataStructures 的其他问题,它们是否都过于本地化?

标签: chdatastructures


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2011-12-20
    • 2010-12-28
    • 2012-03-28
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多