内存树/索引结构,用于快速查找和增加整数键的插入

时间:2012-10-13 10:45:37

标签: data-structures tree b-tree avl-tree red-black-tree

背景:我将插入大约十亿个键值对。我需要一个内存索引,我可以同时查找(32位整数)值(唯一的,64位整数)键。没有更新,没有删除和没有遍历。钥匙通常会逐渐增加。

哪种索引结构最适合处理?

我能想到的要求是:

  • 由于密钥增加,它需要有效的重新平衡
  • 需要有效地使用存储器以适合于ram,优选地< 28GB
  • 它需要非常有效的查找

1 个答案:

答案 0 :(得分:0)

对于这个问题,可能没有比简单的排序向量更有效的数据结构。 (实际上,考虑到对齐问题并且取决于访问特性,您可能希望将键和值放在单独的向量中。)但是存在许多实际问题,特别是如果您不知道数据有多大。如果你确实知道这一点,或者如果你准备好预先分配太多空间然后如果你获得的数据超过这个空间就会死掉,那么这很好,尽管你仍然需要担心保持向量的排序。 / p>

可能更好的方法是保持索引范围的二叉搜索树,其中BST的叶子指向数据的“块”(即向量)。 (这基本上是B+ tree。)团块可能相当大;我想说的是你希望在几分钟内收到的数据量,或几千个条目。它们不必具有相同的尺寸。 (B + -trees通常比这更小,但是由于你的数据“大部分已经排序”,你应该能够使用更大的数据。不要太大;不要只是减少开销和可能的缓存-thrashing。)

由于您的数据“大部分已排序”,您可以暂时累积数据,将其保存在普通的有序地图中(假设您有这样的事情),或者甚至在使用插入排序的向量中。当此缓冲区变得足够大时,您可以将其作为单个块附加到主数据结构,重新分区最后一个块来处理重叠。

如果您有理由确定您很少会获得无序密钥,那么将保留第二个传统的无序数据元素BST。任何无法通过重新分配新丛和前一个丛而无法容纳的元素都可以添加到此BST中。要进行查找,请在主结构和无序结构之间进行并行查找。

如果你是偏执或对无序数据的数量不够确定,只需使用标准的B + -tree插入算法,该算法包括创建具有一点保留但未使用空间的块以允许插入(一些百分比;你想避免空间开销),并在必要时拆分一块。