人们已经提出了关于各种数据结构效率的类似问题,但我读过的内容并不完全适用于我的场景,所以我想知道人们是否有针对有效满足以下标准的人提出建议:
我正在开发一家将在商业上使用该程序的公司,因此任何第三方数据结构都没有版权保护或任何东西,但如果STL的数据结构能够有效地完成工作,那么这将是完美的
我知道有无数的Hashmap / Dictionary风格的C ++数据结构,其实现是为了满足不同的标准而构建的,所以如果有人可以为这种情况提出一个理想的建议,那么我将非常感激。
非常感谢
修改
我发现这篇文章似乎暗示unordered_map会很好吗?
hash_map和unordered_map通常用哈希表实现。 因此不保持订单。 unordered_map插入/删除/查询 将是O(1)(常数时间),其中map将是O(log n),其中n是 数据结构中的项目数。所以unordered_map更快,而且 如果你不关心物品的顺序应该是首选 在地图上。有时您想维护订单(按键排序) 而那张地图将是您的选择。
答案 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中。