【发布时间】:2010-06-28 09:38:22
【问题描述】:
我有无限的数字流,我必须检测第一个重复元素。我想为上述问题使用哈希表,即每当一个数字到达时,检查它是否已经存在于哈希表中。如果有,请停止,否则将该数字添加到哈希表中。现在我的问题是哈希表是存储整数值还是仅存储与这些整数对应的哈希值作为键?
提前致谢
【问题讨论】:
-
我认为set 会是更自然的选择。
标签: c++ data-structures stl hashtable
我有无限的数字流,我必须检测第一个重复元素。我想为上述问题使用哈希表,即每当一个数字到达时,检查它是否已经存在于哈希表中。如果有,请停止,否则将该数字添加到哈希表中。现在我的问题是哈希表是存储整数值还是仅存储与这些整数对应的哈希值作为键?
提前致谢
【问题讨论】:
标签: c++ data-structures stl hashtable
hash_map 是hashed associative container,这意味着它们将键与值相关联。所以是的,你给它的值存储在 hash_map 中。通常,您无法直接访问哈希码。要使用 hash_map 解决您的问题,当您获得 myInt 时,您必须执行myHashMap[myInt] = true;之类的操作。然后对于下一个 int,您必须检查您的 int 是否已存储...
您只需要检查它是否在这里,这可能不是最佳选择。一套看起来很合适。您可能需要检查获取操作的性能,但我认为它在 STL 集中进行了很好的优化。
my2c
【讨论】:
散列函数用于放置 <key,value> 对,因此当您插入一个数字作为键时,它会存储在函数分配的位置,并以关联的数据作为值。
您只需尝试将该整数作为键并增加它的值。
【讨论】:
答案取决于实现限制,但如果数字是 int32 或更小,我首选的方法是延迟分配 512MB(因此只有在您使用它时才会分配单个物理页面,即 /dev/ 的私有 mmap零是unix下的传统方法)并将其用作位集。如果单词大小较小,那么您将不得不求助于某种散列(可能是多级)、k-ary 树的变体或上述的某种组合。
注意多级散列还是
如果您正在查看大于 int32 的任何内容,则您没有提供足够的信息来提供建议。如果你买不起 512MB 的内存来存放你的 bitset,这同样适用。
【讨论】: