unordered_map它是如何工作的/优化设计

unordered_map how it works/optimizing the design?

本文关键字:工作 优化 map 何工作 unordered      更新时间:2023-10-16

我在另一个论坛上阅读了以下帖子,该帖子来自一个似乎对C++内部结构了解很多关于在"字典"中插入数千个键的人:

e) 地图和设置查找是用红黑或平衡树和每个项目都是"单独"分配的,因此如果您要分配 500,000带有指向仪器的指针的仪器 [按符号] 对象类关联,您有"N"个字节 [加上开销]指针的字符串和 4 个字节 [加上开销]。并包括;一分钟、五秒、一秒的价格时间序列STD中所有这些工具的工具和完整的交易历史器皿。这是很多内存和更多的浪费到小对象分配开销!

f) 臭名昭著的是,STD Map & Set 使用下限 Begin 遍历所有键以查找 [收起比比较],这是慢得像地狱。

g) 一些天才可能会说:"不,他们使用未排序的地图"...好吧,他们没有,但即使他们这样做了,他们仍然对离散分配的元素执行字符串比较。

我在C++中所做的如下(示例);

a) 创建一个"自定义"就地字符串类对象,它有两个个性;a) 一个字节数组,和 b) 一个整数数组 [模数 4并在本机边界上对齐]。b) 使用自定义地图和设置,它基于哈希的 2x 维度,节点分配在平面中连续内存区域[可以动态调整大小]。c)字符串 [整数格式] 哈希由整数完成,以管道CPU 和密钥比较以类似的方式完成。

使用这些技术,只能在C++,C或ASM中完成至少是相同性能的 4-5 个数量级在.NET,C#或Java中完成的事情。

http://www.elitetrader.com/vb/showthread.php?s=1eb70fb998d8a51d22050ea53d24db21&threadid=204368&perpage=6&pagenumber=3

如果我大致知道我将插入多少个密钥,那么我可以使用哪些技术来设计自己的unordered_map实现,该实现比针对我的特定用途的标准实现更有效?

(任何关于设计哈希函数的 101 都是非常欢迎的)

要使用unordered_map 你只需要为你的密钥设计一个哈希函数。C++标准库为内置密钥类型提供了一组哈希函数,例如:hash<int>hash<float>。如果你对一个unordered_map<int,int>进行解冻,默认情况下它会使用 hash<int> 作为哈希函数。但是如果你想使用自己的对象作为键,你必须提供自己的哈希函数


优势:尽管unordered_map<T>中的插入时间较大,但在从容器中检索(key,value)对时,哈希通常会提供O(1)的复杂性。