【问题标题】:Is this method bad for using 2D coordinates as keys in std::unordered_map?这种方法不适合在 std::unordered_map 中使用 2D 坐标作为键吗?
【发布时间】:2017-08-26 13:40:57
【问题描述】:

我需要将二维坐标作为键存储在 std::unordered_map 中。 我知道坐标的每个分量不会超过 16 位。

像这样将坐标对 (x,y) 合并到 uint32_t 是不好的做法

uint32_t coordinate_id = (x << 16) | y;

并使用坐标id 作为地图的“散列”? 还是我应该使用专用的哈希函数来计算密钥? 如果我没有遗漏任何东西,上面提供的方法不会导致任何冲突。

【问题讨论】:

  • 您打算将这些coordinate_ids 用作地图的键,还是将它们的计算用作哈希函数?你能用地图的定义和插入示例来澄清一下吗?

标签: c++ hash hashmap unordered-map


【解决方案1】:

您的方法肯定会奏效。如果组件可以超过 16 位,它甚至可以工作:允许哈希冲突。

这里的问题是你的散列并不比整数的恒等函数好。点坐标的更改将导致散列的易于预测更改。而如果点坐标遵循某种规律,则很容易在该规律和桶选择算法之间产生相关性。
想象一下,如果unordered_map 创建了 100 个桶,并根据哈希的最后两位数字将项目放入桶中。而且你的点的 y 坐标可以被 100 整除。你所有的 ponts 都将进入同一个桶,这违背了哈希表的目的!

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 2012-07-09
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多