C ++(Hashmap风格)数据结构是否适用于此场景?

时间:2011-07-27 08:49:08

标签: c++ data-structures hash

人们已经提出了关于各种数据结构效率的类似问题,但我读过的内容并不完全适用于我的场景,所以我想知道人们是否有针对有效满足以下标准的人提出建议:

  • 每个元素都有一个唯一键。会有没有冲突的可能性,因为每个元素都会散列到不同的键。 编辑: * 密钥是32位uint。 *
  • 元素都是唯一的,因此可以被认为是集合
  • 所需的唯一操作是添加和获取,删除。这些需要很快,因为它们在典型的运行中将被使用100,000次!
  • 保留元素的顺序是无关
  • 速度比内存消耗更重要......尽管它也不可能 贪婪!

我正在开发一家将在商业上使用该程序的公司,因此任何第三方数据结构都没有版权保护或任何东西,但如果STL的数据结构能够有效地完成工作,那么这将是完美的

我知道有无数的Hashmap / Dictionary风格的C ++数据结构,其实现是为了满足不同的标准而构建的,所以如果有人可以为这种情况提出一个理想的建议,那么我将非常感激。

非常感谢

修改

我发现这篇文章似乎暗示unordered_map会很好吗?

  

hash_map和unordered_map通常用哈希表实现。   因此不保持订单。 unordered_map插入/删除/查询   将是O(1)(常数时间),其中map将是O(log n),其中n是   数据结构中的项目数。所以unordered_map更快,而且   如果你不关心物品的顺序应该是首选   在地图上。有时您想维护订单(按键排序)   而那张地图将是您的选择。

5 个答案:

答案 0 :(得分:2)

看起来前缀树(每个节点末端都有元素)也适合这种情况。它快速,甚至比哈希映射更快,因为没有进行哈希值计算,并且获得一个值纯粹为O(n),其中n是密钥长度。它有点内存耗尽,但在同一节点路径中共享密钥的公共前缀。

编辑:我假设键是字符串,而不是像整数那样的简单值

答案 1 :(得分:2)

至于内置解决方案,我建议使用google :: dense_hash_map。它们非常快,特别是对于数字键。您必须决定将保留为“empty_key”的特定密钥。此外,这是一个非常好的comparison 不同的哈希映射实现。

摘录

Library         Linux-intCPU (sec)  Linux-strCPU (sec)   Linux PeakMem (MB)
glib            3.490               4.720                24.968
ghthash         3.260               3.460                61.232
CC’s hashtable  3.040               4.050                129.020
TR1             1.750               3.300                28.648
STL hash_set    2.070               3.430                25.764
google-sparse   2.560               6.930                5.42/8.54
google-dense    0.550               2.820                24.7/49.3
khash (C++)     1.100               2.900                6.88/13.1
khash (C)       1.140               2.940                6.91/13.1
STL set (RB)    7.840               18.620               29.388
kbtree (C)      4.260               17.620               4.86/9.59
NP’s splaytree  11.180              27.610               19.024

但是,在设置“deleted_key”时,此地图也可以执行删除。因此,也许可以创建更高效​​的自定义解决方案。但除了那个小点之外,任何哈希映射都应该完全符合您的需求(请注意,“map”是一个有序的树图,因此速度较慢)。

答案 2 :(得分:1)

你需要的东西听起来像哈希集,C ++将其作为std::tr1::unordered_set或Boost.Unordered。

P.S。但请注意,TR1不是尚未标准,您可能需要获得Boost才能实现。

答案 3 :(得分:0)

听起来std::unordered_set符合条款,但没有 更多地了解钥匙,很难说。我很好奇 如何保证不会发生碰撞: 这意味着一个小的(小于表的大小),有限集 键。如果是这种情况,则将键映射到的效率可能更高 一个小的int,并使用std::vector(对于条目没有空插槽 本)。

答案 4 :(得分:0)

您正在寻找的是unordered_set。您可以在Boost,TR1或C ++ 0x中找到一个。如果你希望将密钥与一个值相关联,那么unordered_map就是这样 - 同样在Boost / TR1 / C ++ 0x中。