使用哈希图将点划分为子区域

Dividing points into subregions using hashmaps

本文关键字:区域 划分 哈希图      更新时间:2023-10-16

我有一个200像素x 200像素的2D光栅,我想把它细分为每个10x10像素的400个"桶"。

然后我有一个点列表(大约200公里(,我想在上面提到的结构中绘制。因此,如果该点落入10x10区域,请将其添加到桶中。

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

我尝试使用stl::undered_map并指定bucket的数量,但这不起作用,它"忽略"了该请求。(我想,因为有太多的项目被映射到同一个区域,但在我的情况下,这不是问题,相反,这就是重点(。

STL有什么方法可以做到这一点吗?

我认为您混淆了两个术语。哈希表意义上有"bucket",这是一些内部实现细节,用于均匀分布元素,这样查找就不会扫描太多无用的元素。还有空间意义上的"桶",即将空间划分为多个区域,使元素恰好属于一个桶。通常,你可以自己控制空间桶系统(你可以选择所有东西的分割位置(,但哈希表不能让你非常精确地控制桶。你可能需要选择一个初始大小,但如果哈希表认为增加该大小以提高性能是个好主意,它几乎肯定会这么做。如果不这样做,查找时间会更糟。

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

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

希望这能有所帮助!

您可以为bucket创建哈希代码,如:

[前4个字节是x][下4个字节为y]

size_t hash = (p.X / 10) << 16 | (p.Y / 10);
map[hash].push_back(hash);

您真正想要的不是"bucket",而是地图。你想要一些类似地图的东西

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)

塔达。这就是你想要的。。。