提高不变的无序地图的查询访问性能

Improving query access performance for unordered maps that are unchanging

我正在寻找有关改进无序地图的查询时间访问的建议。我的代码基本上只包含 2 个步骤。在第一步中,我填充无序地图。第一步之后,不再有条目添加到映射中。第二步,只查询无序映射。由于地图本质上是不变的,是否可以采取一些措施来加快查询时间? 例如,stl 是否提供任何可以调整映射中的内部分配以改进查询时间访问的功能?换句话说,有可能不止一个键被映射到无序映射中的同一个桶。如果为映射分配了更多内存,那么发生此类冲突的可能性就会降低。从这个意义上说,我很好奇在知道无序映射将保持不变的情况下是否可以做任何事情。

您有两个可以旋转的旋钮:哈希函数和映射中的桶数。一个固定在 compile-time(散列函数),另一个您可以(稍微)修改 run-time。

一个好的散列函数将给你很少的冲突(non-equal 具有相同散列值的值)。如果您有很多碰撞,那么您实际上可以做很多事情来改善您的查找时间。最坏的情况(所有输入散列为相同的值)给你 O(N) 查找时间。所以这就是你要集中精力的地方。

一旦你有了一个好的散列函数,你就可以玩桶数游戏(通过rehash),这可以进一步减少碰撞。

如果测量表明这对您很重要,那么我建议对标准库之外的其他哈希 table 实现进行测量,例如google's。使用 封闭哈希 又名 开放寻址 可能更适合您,尤其是如果您的哈希 table 条目足够小,可以直接存储在哈希 table 个桶。

更一般地说,Marshall 建议找到一个好的散列函数。不过要小心 - 有时通常 "bad" 的哈希函数比 "good" 的哈希函数表现得更好,如果它能很好地与你的键的某些属性一起工作的话。例如,如果您倾向于使用递增的数字,也许有一些间隙,那么一个身份(又名微不足道的)散列函数只是 returns 密钥可以 select 散列桶,其碰撞比密码少得多散列 pseudo-randomly(但可重复)在不相关的桶中散布具有尽可能少的差异的密钥。如果您正在查找几个附近的键值,身份散列也可以提供帮助,因为它们的存储桶也可能在附近,您将获得更好的缓存利用率。但是,您没有告诉我们关于您的键、值、条目数等的任何信息 - 所以我会把剩下的留给您。