我正在另一个论坛上阅读以下帖子,这个帖子似乎对C ++内部有很多关于将数千个密钥插入“字典”的知识非常了解:
e)使用红黑或平衡树和地图完成地图和设置查找 每个项目都是“单独”分配的,所以如果你要分配500,000 仪器[通过符号]带有指向仪器对象类的指针 关联,你有'N'个字节[加上开销] 指针的字符串和4字节[加上开销]。并包括; 所有的一分钟,五秒,一秒钟的价格时间序列 STD中所有这些仪器的仪器和完整的贸易历史 容器。这是一个很大的记忆和很多更多的浪费 小对象分配开销!
f)众所周知,STD Map&使用LowerBound将所有键设置为FIND [Less 比较比较]这很慢。
g)有些天才可能会说“不,他们使用的是 未排序的地图“......他们没有,但即使他们这样做,他们仍然是 对离散分配的元素进行字符串比较。我在C ++中做的是以下(示例);
a)创建一个“自定义”就地String Class-object,它有两个 个性; a)字节数组,和b)模数4的整数数组 并在本土边界上对齐]。 b)使用自定义地图&设置,哪个 是基于2x维度的哈希,其中节点以平面分配 连续记忆区域[可能&可以动态重新调整大小]。 C) String [整数格式]哈希由Integer完成管道化 CPU和密钥比较也是类似的。
使用这些技术,只能在C ++,C或ASM中完成 是至少4-5倍的MAGNITUDE的性能相同 在.NET,C#或Java中完成的事情。
如果我大致知道将要插入多少个键,那么我可以使用哪些技术来设计我自己的unordered_map实现,这比我的特定用法更有效?
(欢迎任何关于设计哈希函数的101s)
答案 0 :(得分:6)
使用unordered_map
您只需为密钥设计哈希函数。 C ++标准库为内置键类型提供了一组哈希函数,例如:hash<int>
或hash<float>
。
如果您在默认情况下取消unordered_map<int,int>
,则使用hash<int>
作为哈希函数。 但是如果您想使用自己的对象作为密钥,则必须提供自己的哈希函数。
优点:
虽然unordered_map<T>
中的插入时间较长,但在从容器中检索O(1)
对时,散列通常会提供(key,value)
复杂度。