【问题标题】:Representing sparse integer sets?表示稀疏整数集?
【发布时间】:2008-12-11 21:31:41
【问题描述】:

什么是一种以紧凑和快速的方式表示稀疏整数集(实际上是 C 内存地址)的好方法。我已经知道诸如位向量和游程编码之类的显而易见的事情。但我想要比每个集合元素一个单词更紧凑的东西。我需要添加和删除元素并测试成员资格。我不需要其他集合操作,比如联合。

很多年前我读过一个这样的图书馆,但后来忘记了它的名字。我认为它是由 HP 作为开源发布的,并且有一个女性的名字。

【问题讨论】:

  • 每个指针位
  • 你没有说你将在集合中存储多少个地址。这很关键。你也不要说它们是否来自malloc。
  • 您可以查看我提出的类似问题的答案:stackoverflow.com/questions/36106/…
  • 地址通常不是来自 malloc()。在一种用法中,集合中可能有几个 100k 成员(在 32 位机器上)。

标签: algorithm set


【解决方案1】:

您指的是一个 judy 数组。这是一个惠普项目。我认为它们在 ruby​​ 中使用并且在 c 中可用。非常有趣的数据结构。利用分配(至少)字对齐这一事实,具有用于密集和稀疏范围的单独结构。

http://judy.sourceforge.net/index.html

【讨论】:

  • 谢谢。 “朱迪”确实是我想的那个。我永远不会记得那个名字。
【解决方案2】:

一个非常紧凑的数据结构将是一个布隆过滤器,也许是一个计数布隆过滤器来支持删除。

http://en.wikipedia.org/wiki/Bloom_filter

布隆过滤器由 Burton H. Bloom 在 1970 年构思,是一种节省空间的概率数据结构,用于测试元素是否是集合的成员。假阳性是可能的,但假阴性是不可能的。元素可以添加到集合中,但不能删除(尽管这可以通过计数过滤器解决)

【讨论】:

  • 谢谢。我知道这些,但我不能接受误报(误报是可以接受的,但不太理想)。
【解决方案3】:

如果您只需要插入、删除和测试成员资格,那么哈希表应该非常适合您。你可以找到一些很好的散列函数来散列 32 位整数here

【讨论】:

  • 不够紧凑-1
【解决方案4】:

如果您希望结构小于数据集,您可能应该查看某种树形排列。使 4 路的每个级别的树键从高端开始的 2 位开始,它可能会很好地压缩(如果指针具有任何程度的空间局部性)。诀窍是将其编码得足够紧凑(节点数组的索引?数组映射树?)。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2012-12-20
    相关资源
    最近更新 更多