【问题标题】:what is the most memory efficient datastructure for maintaining a sordted <5k list of integers?用于维护排序的 <5k 整数列表的最节省内存的数据结构是什么?
【发布时间】:2013-08-18 19:59:39
【问题描述】:

我有许多排序整数列表,每个列表都少于 3600 个项目。我想尽可能地将它们保存在内存中,所以我正在寻找一种节省空间的数据结构。

最常见的操作是插入、成员资格测试和范围查询。

整数将主要在 1 到 100 亿范围内,但理论上可能存在一些极端情况,整数会低得多。

我一直在研究跳过列表,它们非常好,但我觉得那里可能有更有效的结构。

【问题讨论】:

  • 数组不让我在插入时保持排序,对吧?
  • 嗯...您可以在已排序的数组中插入一个元素,以便它进入正确的位置。
  • 多少个列表?整数的范围是多少?有重复吗?操作是否有所需的时间复杂度,或者尽可能快?可以说什么元素被访问的频率(使写入磁盘成为可能)吗?
  • 这些美国电话号码有可能吗?
  • 不,他们不是。它们实际上是来自当前在此范围内的另一个表的自动增量 ID。由于我主要存储当前 ID(最后 3600 个),因此我希望这些数字在此范围内,因此请设置或采用可能指向较早 ID 的异常值。

标签: algorithm list sorting data-structures tree


【解决方案1】:

这实际上取决于访问模式和查找相对于修改的比例。当查找比修改(在您的情况下,显然是插入)更常见时,这很常见,您实际上可以摆脱排序数组,这将为您提供最佳的内存效率。

如果插入实际上更常见,排序数组可能不会这样做,您将不得不求助于更复杂的数据结构。 B 树听起来像是一个可能的候选者,因为它们将许多节点打包在一起,因此不会像 AVL、跳过列表或红黑树那样受到链接开销的影响。

我认为研究基数树会同样有趣,尤其是当列表中碰巧有很多连续整数时,因为这些范围会被基数树“压缩”。

值得注意的是,布隆过滤器可以帮助进一步优化您的会员查询。在某种程度上,它们是成员查询中最节省空间的数据结构,但由于是概率性的,您只能将它们与其他一些确定性数据结构结合使用,除非您当然可以返回不正确的答案:-)。

【讨论】:

  • 非常感谢,radix trie 是我还没有考虑过的东西,看起来很有趣!
  • 我不认为布隆过滤器与确定性辅助数据结构一起使用时不会提高空间效率。您不会使用比辅助数据结构更多的空间,因此仅使用该结构会更节省空间吗?并且范围查询不起作用。
  • 嗯,这基本上就是我所说的 - 它们可以“帮助进一步优化您的会员查询”。我接下来要说的只是指出它们可以被视为最节省空间的数据成员查询的结构。我从来没有说过将布隆过滤器与确定性数据结构结合使用会更节省空间,这显然不是真的,除非您认为可以使用负内存使用的数据结构? ;-)
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2011-02-19
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多