【问题标题】:Is there any possibility that std::unordered_map collides?std::unordered_map 是否有可能发生冲突?
【发布时间】:2022-01-21 20:21:03
【问题描述】:

我在这里看到一个帖子,您可以“遇到生日问题”。同时使用std::unordered_map

When should I use unordered_map and not std::map

这真的让我感到惊讶,这与说 std::unordered_map 使用不安全是一样的。真的吗?如果我不解释自己,让我举个例子:

unordered_map<size_t, size_t> m;
for (size_t i = 0; i < 100; ++i)
    m[i] = i;
for (size_t i = 0; i < 100; ++i)
    if (m[i] != i)
        cerr << "ERROR!" << endl;

如果此代码在main 中,是否有可能打印ERROR!

【问题讨论】:

  • 碰撞不会破坏它,它们只会使搜索碰撞元素的速度变慢。
  • 取决于您所说的不安全是什么意思。碰撞的可能性是真实的,但这并不意味着您在每种情况下都会遇到这种情况。但要牢记这一点。
  • 如果您确实想查看一些病态行为的案例(不仅限于 unordered_map,它也会影响 map),请尝试使用 double 作为键类型并插入 NaN 键。

标签: c++ dictionary hashmap hash-collision


【解决方案1】:

std::unordered_map 有碰撞的可能吗?

发生冲突的不是容器,而是您为容器提供的哈希函数。

是的,所有哈希函数——当它们的输出范围小于输入域时——都会发生冲突。

有没有可能打印错误!?

不,这是不可能的。哈希函数将多个值放入一个桶中是完全正常的。这将在散列冲突的情况下发生,但它也会发生在不同的散列值上。查找函数将使用线性搜索获得正确的值。密钥的标识由相等函数确定,而不是由散列函数确定。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多