代码之家  ›  专栏  ›  技术社区  ›  captncraig

识别重复值的数据结构

  •  3
  • captncraig  · 技术社区  · 15 年前

    我正在运行一个相当大的搜索,并正在获取System.OutofMemoryException。

    问题是,我为以前访问过的每个状态存储了一个字符串键 HashSet<sting> . 一旦达到大约700万个元素,它就会崩溃。我的想法是,我不需要检索字符串,只需要识别它是否存在于集合中。

    我似乎记得这类东西有一个专门的数据结构,但我一辈子都记不起它的名字。如果我没记错的话,它有相当稳定的内存需求,你可以给它添加元素,它可以在一定程度上告诉你你是否已经为它增加了一些价值。我是在编造这个,还是存在这个。有什么小窍门吗?

    5 回复  |  直到 15 年前
        1
  •  2
  •   nos    15 年前

    在.NET中没有用于此的标准集合,但可以存储 阿洛特 字符串中的 Trie ,使用的空间比哈希表/集小得多

        2
  •  3
  •   Karmastan    15 年前

    你可能在想 Bloom filter . 当您检查字符串是否在集合中时,它会给出一个概率结果。如果是的话,你总能找到它。如果不是,您仍然可能检测到它是,这取决于在您的设置中还有什么。它的内存需求会根据您添加的唯一元素的数量而变化,但是 远的 低于哈希集所需的值。

        3
  •  2
  •   josh    15 年前

    我想你是说 trie 数据结构。trie可以用来替换哈希表,它具有以下优点:

    • 与不完善的哈希表相比,在最坏的情况下(O(M)时间),在trie中查找数据更快。不完善的哈希表可能存在键冲突。键冲突是将不同键映射到哈希表中相同位置的哈希函数。不完全哈希表中最糟糕的查找速度是O(n)时间,但更典型的是O(1),O(m)时间用于计算哈希。
    • 一个trie中没有不同键的冲突。
    • trie中类似于存储键冲突的哈希表存储桶的存储桶只有在单个键与多个值关联时才有必要。
    • 不需要提供哈希函数或更改哈希函数,因为有更多的键添加到trie中。
    • trie可以按键提供条目的字母顺序。
        4
  •  1
  •   Hut8    15 年前
        5
  •  0
  •   Abe Miessler    15 年前

    你在说字典课吗?

    http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

    来自msdn的摘录:

    字典中的每个键必须根据 字典中的相等比较器。一 键不能为空,但值可以 如果值类型tValue是 参考类型。

    你可以使用 ContainsKey 方法,在插入新记录之前检查是否已插入条目。