【问题标题】:Dividing points into subregions using hashmaps使用哈希图将点划分为子区域
【发布时间】:2011-11-04 22:23:19
【问题描述】:

我有一个 200 像素 x 200 像素的 2D 栅格,我想将其细分为每 10x10 像素的 400 个“桶”。

然后我有一个点列表(大约 200k),我想在上述结构中进行映射。所以如果该点落入 10x10 的区域,则将其添加到存储桶中。

现在在我看来,哈希表可以做得很好。我想知道这是否可以使用 STL?

我尝试使用 stl::unordered_map 并指定存储桶的数量,但这不起作用,它“忽略”了该请求。 (因为我认为映射到同一区域的项目太多,但在我的情况下,这不是问题,相反,这就是重点)。

有没有办法用 STL 做到这一点?

【问题讨论】:

  • 因此您想将画布分成 400 块,并希望单独跟踪它们。每个块可以包含该块范围内的点。对吧?

标签: c++ algorithm data-structures hash


【解决方案1】:

我认为您混淆了两个术语。在哈希表的意义上有“桶”,这是一些用于均匀分布元素的内部实现细节,这样查找往往不会扫描太多无用的元素。在空间意义上也有“桶”,它们是将空间划分为区域,以便元素恰好属于一个桶。通常,您将自己控制空间分桶系统(您可以选择所有内容的拆分位置),但哈希表不会让您非常精确地控制桶。您可能会选择一个初始大小,但如果哈希表认为增加该大小以提高性能是个好主意,它几乎肯定会这样做。否则,查找时间会大大缩短。

如果您想将空间分割成一个网格,然后将点分布到该网格中,最好的方法是创建一个std::unordered_maps 的二维数组(使用原始数组或使用一些网格线性化) ,每一个都只在一个特定的空间区域中保存点。那样的话,如果你想查找一个元素,你可以去地图只为那个桶保存点,然后让地图查找值,此时它会咨询自己的内部分桶系统来找到你想要的点想。这意味着,如果您想拆分点以便您可以对空间区域进行有趣的查询,这些点将存储在专门用于这些区域的存储桶中,但在这些存储桶中,它们存储在哈希表中查找这些点需要更少的时间。

或者,您可能需要考虑使用四叉树或 kd 树等空间数据结构,它们可以有效地存储元素并让您有效地查询空间桶中的每个点。

希望这会有所帮助!

【讨论】:

  • 有时,最大的挑战是了解他们“需要”什么,而不是与他们“想要”什么混淆。用很少的提示就能很好地理解。 :)
  • 与所有空间数据结构一样,关于使用正确结构的真正问题归结为结构的预期用途。 kd-tree 在用于 log(n) 点搜索或最近邻的自适应存储方面非常出色。在渲染领域,它们很受 RayTracers 的欢迎。在物理领域,它们有时用于修剪基元以进行碰撞检测。正如我在下面回答的那样,对于基于整数的点,您可以为点创建一个哈希方案并使用哈希表进行存储,但正如这个答案中提到的,可能不是最好的方法。
  • 你是绝对正确的。我把这个打出来有点太累了,有点太晚了。当我今天早上考虑它时,我意识到我的错误:)。
【解决方案2】:

您可以为存储桶创建哈希码,例如:

[前 4 个字节是 x][低 4 个字节是 y]

size_t hash = (p.X / 10) << 16 | (p.Y / 10);

map[hash].push_back(hash);

【讨论】:

    【解决方案3】:

    您真正想要的不是“桶”而是地图。 你想要地图之类的东西

    typedef pair<int,int> P
    typedef set<P>  PS
    typedef map<P,PS>  PSM  // say the point at right edgexbottomedge defines the BLOCK you want.
     PSM psm(400)
    

    多田。这就是你要找的...

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 2018-05-08
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2021-02-24
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多