【发布时间】:2017-12-01 07:43:17
【问题描述】:
我有一个包含 130000 个元素的数据集,我有两个不同的数据结构,即双向链表和哈希表。在将数据集元素插入到链表中时,我使用尾指针将节点放在链表的末尾。在将数据集元素插入哈希表时,我受益于带有探测功能的开放寻址方法。对于数据集中的最后 10 个元素,我面临 110000 次碰撞。
但是,两个不同数据结构的插入总运行时间之差等于 0.0981 秒。
链表 = 0.028521 秒
哈希表 = 0.120102 秒
是指针操作慢还是探测方法很快?
【问题讨论】:
-
如果您有 10 个元素的 110000 次碰撞,那么就有问题了。哈希表可以达到多满是有限制的……您的哈希表有多大?你怎么试探?但问题也可能是哈希函数(不太可能)。
-
就个人而言,在大多数情况下最适合我的是使用单链表的缓存友好的单独链接实现。 “缓存友好”和“链表”可能看起来有些矛盾,但您可以分配列表节点以使它们通常是连续的。例如,链表可以用
next列表指针来实现,它只是一个数组的 32 位索引(实际上我就是这样做的)。如果您有空间进行后期处理,您甚至可以重建哈希表,以确保存储桶中的每个相邻节点都是连续的。 -
理论上不一定是最优的,但我发现它是实现高性能解决方案的最简单方法,无需过多考虑。哈希表本身也只是一个桶头索引数组,它用
next索引索引一个节点。列表节点存储在一个巨大的数组中(std::vector,即)。我喜欢这个解决方案的原因是内存使用是非常可预测的。每个桶 4 个字节,每个插入的节点 4 个字节。
标签: c++ performance list data-structures hash