用于识别重复值的数据结构

时间:2010-08-11 20:54:27

标签: c# data-structures

我正在运行一个相当大的搜索,并且收到一个System.OutOfMemoryException。

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

我似乎记得这种事情的专门数据结构,但我记不起它的名字。如果我没记错的话,它有相当恒定的内存要求并且你向它添加元素,并且它可以在某种程度上确定你是否已经为它添加了一些值。我是在做这个,还是存在。有什么提示吗?

5 个答案:

答案 0 :(得分:3)

你可能在想Bloom filter。当您检查字符串是否在集合中时,它会为您提供概率结果。如果是的话,你总能找到它。如果不是,您仍然可能会检测到它,具体取决于您设置中的其他内容。它的内存要求会根据您添加的唯一元素的数量而发生变化,但它的低于HashSet所占用的内容。

答案 1 :(得分:2)

在.NET中没有标准的集合,但你可以在Trie中存储很多的字符串,使用的空间比例如少得多。哈希表/集

答案 2 :(得分:2)

我认为你的意思是trie数据结构。可以使用trie替换哈希表,它具有以下优点:

  • 与不完美的哈希表相比,查找特里结构中的数据在最坏的情况下(O(m)时间)更快。不完美的哈希表可能存在关键冲突。密钥冲突是将不同密钥的哈希函数映射到哈希表中的相同位置。不完美哈希表中的最坏情况查找速度是O(N)时间,但更典型的是O(1),花费O(m)时间来评估哈希值。
  • trie中没有不同键的碰撞。
  • 只有当一个密钥与多个值相关联时,才需要存储类似于存储密钥冲突的哈希表存储桶的trie中的存储桶。
  • 不需要提供哈希函数或更改哈希函数,因为更多的键被添加到trie中。
  • 特里可以按键按字母顺序排列。

答案 3 :(得分:1)

答案 4 :(得分:0)

你在谈论词典课吗?

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

摘自MSDN:

  

词典中的每个键都必须是唯一的   字典的平等比较。一个   key不能为null,但值可以   如果值类型TValue是a   参考类型。

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