【问题标题】:How to I count key collisions when using boost::unordered_map?使用 boost::unordered_map 时如何计算键冲突?
【发布时间】:2011-01-16 08:51:11
【问题描述】:

我有一个包含 15 个无符号长整数的数据结构,我使用 hash_combine 定义了一个哈希函数,如下所示:

 friend std::size_t hash_value(const TUPLE15& given)
    {
      std::size_t seed = 0;

      boost::hash_combine(seed, val1);
      boost::hash_combine(seed, val2);
      ...
      return seed;
    }

我在 boost::unordered_map 中插入了大量值,但性能不够好。可能,我可以使用替代散列函数做得更好。为了确认这一点,我需要检查我遇到了多少次碰撞。我该怎么做?

【问题讨论】:

    标签: c++ boost hashtable


    【解决方案1】:

    比较元组的数量与唯一哈希值的数量如何?

    set<size_t> hash_values;
    BOOST_FOREACH(const TUPLE15& tuple, tuples)
        hash_values.insert(hash_value(tuple));
    size_t collisions = tuple_map.size() - hash_values.size();
    

    size_t collisions = 0;
    for (size_t bucket = 0; bucket != tuples.bucket_count(); ++bucket)
        if (tuples.bucket_size(bucket) > 1)
            collisions += tuples.bucket_size(bucket) - 1;
    

    【讨论】:

    • 您的第二个示例计算包含冲突的存储桶数,而不是实际的冲突数...将其更改为 collisions += tuples.bucket_size(bucket)-1;?
    • @gospes:你说得对,我现在已经修好了。谢谢。
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 2014-02-26
    • 2021-05-30
    • 2016-08-29
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多