具有增量更新的快速优先级队列

时间:2014-11-18 10:23:34

标签: haskell data-structures priority-queue

我正在尝试使用最小化策略在Haskell中编写负载均衡器(部分是为了好玩..)。我需要一个优先级队列,其中只需要执行以下操作即可快速'

  • 读取最小键
  • +1最小钥匙
  • -1 on any key

如果我有一个带指针的命令式语言,我可能会来:

Head
  |
Priority 0 -> Item <-> Item <-> Item <-> Item
  |
Priority 1 -> Item <-> Item
  |
Priority 4 -> Item <-> Item <-> Item

优先级使用双向链表连接,每个优先级的项目也是如此。每个Item都包含指向头部优先级的链接。这种结构会有复杂性:

  • O(1)用于读取最小密钥 - 从头下排队第一位
  • O(1)for +1 - 删除第一优先级下的第一个项目,将其插入较低级别(可能创建一个新级别)
  • O(1)for -1 - 如果我们有一个指向该项目的指针,我们可以立即访问优先级,从双向链表中删除该项并将其插入另一个

是否有一些(功能性?)数据结构的行为大致相同?项目数量最多约为几百个。

1 个答案:

答案 0 :(得分:1)

在我看来,符合您需求的常见结构是Hinze (2001)中所述的优先搜索队列。提供这种结构的更好的hackage包之一是:http://hackage.haskell.org/package/psqueues

这可能没有完全针对您的工作流程进行调整,但它肯定不会破旧!