【问题标题】:hash function to size of buckets for unordered containers?散列函数到无序容器的桶大小?
【发布时间】:2017-06-21 06:47:22
【问题描述】:

要将一个元素放入,比如说,一个无序集合,我们计算它的哈希并将其放入相应的桶中。然而,我们通常有比散列函数的值范围少得多的桶。 buckets和hash值的对应关系是如何计算的?似乎使用了一些函数来反映 (0 ... size_t) -> (0 ... size_of_buckets - 1)。但是即使对于好的散列函数,使用这样的函数也可能导致大量的冲突。

【问题讨论】:

  • 为什么要创建自己的散列容器?是学校还是类似的任务?因为否则你应该使用std::unordered_map
  • 我不想创建自己的。我想知道 std::unordered_map 究竟是如何工作的。正如我所写的那样,理论上这会对性能产生重大影响。

标签: c++ unordered


【解决方案1】:

我不确定标准中是否定义了 std::unordered_map 的确切行为。但是,基本原则是这样的:始终保持桶的数量大于容器的大小乘以一个小数(这个小数是 1.0/load_factor)。这样,碰撞应该很少见。

对于哈希表,通常有两种计算bucket_index的方法:

  1. 桶数选择为 2 的幂:计算哈希,然后通过位操作提取其一些较低/较高位。这种方法需要一个“好的”散列函数,其中每一位都是随机的
  2. 桶的数量被选择为素数:计算哈希,然后通过模运算,计算bucket_index。这种方法不需要“太好”的哈希函数

对于方法 1.,如果哈希函数质量不好,你会得到很多冲突。对于方法 2.,即使使用质量不太好的哈希函数,通常也很少发生冲突。但是,方法 1. 通常更快,因为位运算比 mod 快得多(但有一些技术可以使它成为 faster),而且质量足够好的哈希函数通常很便宜。

【讨论】:

    【解决方案2】:

    许多哈希表被构建为足够通用以支持许多不同的哈希函数,因此它们中的大多数不会“计算”哈希函数的范围和桶数之间的对应关系。

    但是,桶的数量取决于哈希表的内部结构(冲突解决技术等),尤其是这个称为load factor 的值,当达到负载因子限制时,实现通常会增加桶按预定的常数因子。

    您应该更多地查看std::unordered_map 界面并尝试使用以下功能以了解更多信息

    http://en.cppreference.com/w/cpp/container/unordered_map/max_bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_size http://en.cppreference.com/w/cpp/container/unordered_map/max_load_factor http://en.cppreference.com/w/cpp/container/unordered_map/load_factor

    【讨论】:

    • @downvoter 为什么投反对票?考虑发表评论以解释您的反对意见
    • 我想是因为没有给出问题的答案。什么意思是没有计算出对应关系。如果没有对应关系,那么我们不知道将具有给定哈希的元素放在哪个桶中。
    猜你喜欢
    • 2015-10-10
    • 2012-10-02
    • 1970-01-01
    • 2021-09-30
    • 2016-06-16
    • 2010-10-19
    • 2013-12-07
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多