我需要实现一个具有超过100M记录的优先级队列的应用程序。我的问题是我无法将所有这些数据保存在内存中,因此我需要将其存储在磁盘上。是否有任何缓存解决方案,我可以将所有这些信息存储到磁盘?
答案 0 :(得分:1)
我认为您可以通过使用B树进行一些小修改来解决这个问题。
B-tree专门设计用于以最小化定位任何元素所需的磁盘读取次数的方式在磁盘上存储已排序的元素。因为它们按排序顺序存储它们的元素,所以可以通过正常执行插入并通过获取树中最左边的元素(即最左边的叶节点的第一个元素)来查找最小元素,将它们用作优先级队列。
在d阶的B树中,您可以使用O(log d n)磁盘读写来找到最小元素,其中n是元素的总数。插入和删除也只需要O(log d n)磁盘读写。
但是,通过将指针存储到B树中最左边的叶节点,可以显着提高速度。此节点将存储最小键加上接近最小值的其他键。如果您有此指针,则可以通过获取节点中的第一个元素来查找读取的单个磁盘中的最小值。这也加快了extract-min操作:您可以直接从该节点删除密钥而无需搜索它。可能需要进行一些B树重新平衡操作才能完成这项工作,尽管您可以证明这些操作很少发生,以至于摊销进行删除的工作只有O(1)。
换句话说,使用带有指向最左边叶子的指针的B树在磁盘读写方面具有以下时间复杂性:
希望这有帮助!