【问题标题】:Is it possible to have two priority queues "in sync" in Scala?在 Scala 中是否可以有两个“同步”优先级队列?
【发布时间】:2011-06-26 20:00:52
【问题描述】:

我有一组具有两种优先级的对象。 我可以创建两个按它们排序的 PriorityQueue。 问题是,当我从其中一个元素中取出元素时,它显然不会从另一个元素中消失。

是否可以“同步”创建 2 个队列,这样当元素从一个队列中移除时,它也会从另一个队列中移除?

【问题讨论】:

  • 这看起来是 ScalaSTM nbronson.github.com/scala-stm/index.html 的一个不错的用例
  • 我不想涉及任何并发。
  • 这只是根据类名的猜测,但也许SynchronizedPriorityQueue 可以做到?
  • 当你说你不想涉及任何并发时,你的意思是你不需要在超过 1 个线程中使用它吗?
  • 我的程序是单线程的。我需要的是一种从优先级队列中删除非顶级元素的方法。

标签: scala scala-2.8 priority-queue deque


【解决方案1】:

这需要一种特殊的数据结构。标准库中可用的标准“底层二进制堆”优先级队列无法解决问题,因为它不知道所需元素在另一个二进制堆中的“位置”。

当您尝试实现 Dijkstra 算法或 A* 时,会发生类似的问题。有效的技巧是使用 2 棵有序树,就像它们是队列一样 - 您可以弹出第一个元素,然后可以在另一棵树中搜索它。

【讨论】:

  • 我不必那么高效。我只需要一种从优先级队列中删除非顶级元素的方法。
  • 当然,如果您的意思是 - 通过优先级队列线性搜索元素,然后将其删除(O(n)),添加到 API 中可能是有意义的。也许提交一张票。
【解决方案2】:

如果您不需要对数运算,只需使用double linked list 作为队列。他们不保证先进先出,但提供你需要的东西。

您可以轻松地将其中两个封装在一个类中。

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2023-04-02
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2019-10-22
    • 2022-01-06
    • 2022-11-15
    相关资源
    最近更新 更多