【问题标题】:Priority queue which can be stored on disk?可以存储在磁盘上的优先级队列?
【发布时间】:2011-04-06 20:48:19
【问题描述】:

我需要实现一个具有超过 100M 记录的优先级队列的应用程序。我的问题是我无法将所有这些数据保存在内存中,因此我需要将其存储在磁盘上。是否有任何缓存解决方案可以将所有这些信息存储到磁盘?

【问题讨论】:

  • 您找到解决此问题的方法了吗?我很想听听!

标签: caching data-structures priority-queue disk


【解决方案1】:

我认为您可以通过使用 B 树并稍作修改来解决此问题。

B-trees 专门设计用于将排序的元素存储在磁盘上,以最大限度地减少定位任何元素所需的磁盘读取次数。因为它们按排序顺序存储元素,所以您可以将它们用作优先队列,方法是正常执行插入操作,并通过获取树中最左边的元素(即最左边叶节点的第一个元素)来找到最小元素。

在 d 阶的 B-tree 中,您可以使用 O(logd n) 磁盘读取和写入找到最小元素,其中 n 是元素的总数。插入和删除也只需要 O(logd n) 次磁盘读取和写入。

但是,您可以通过存储指向 B 树中最左侧叶节点的指针来显着加快此速度。该节点将存储最小密钥以及接近最小值的其他密钥。如果你有这个指针,你可以通过获取节点中的第一个元素来查找单个磁盘读取中的最小值。这也加快了 extract-min 操作:您可以直接从该节点删除密钥,而无需搜索它。可能需要一些 B-tree 重新平衡操作来完成这项工作,尽管您可以证明这些操作发生的频率非常低,以至于执行删除的摊销工作只需 O(1)。

换句话说,使用带有指向最左边叶子的指针的 B 树在磁盘读取和写入方面具有以下时间复杂度:

  • find-min: O(1)
  • 插入:O(logd n)
  • extract-min: O(1) 摊销

希望这会有所帮助!

【讨论】:

  • 不错的答案。我突然想到你也可以在磁盘上实现一个跳过列表,并且操作将具有相同的界限。尽管 extract-min 可能为 O(1)(未摊销)。但鉴于 B 树的行为众所周知,我倾向于使用您的方法。
  • @JimMischel 跳过列表的主要问题是获得所有指针更改所需的磁盘写入次数。跳过列表通常需要 O(log n) 磁盘读取/写入操作,这可能比 B-tree 大得多。
  • O(log n) 读取,当然。但是每个节点的平均指针数为 2,因此每次插入/删除不应超过 2 次写入。就是说,我明白你的意思。我想知道是否有某种方法可以减少读取次数。值得思考的事情。
猜你喜欢
  • 2016-09-23
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多