使用散列图将点划分为子区域

时间:2011-08-27 01:23:04

标签: c++ algorithm data-structures hash

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

然后我有一个我希望在上述结构中映射的点列表(大约200k)。因此,如果该点落入10x10区域,请将其添加到存储桶中。

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

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

有没有办法用STL做这个?

3 个答案:

答案 0 :(得分:5)

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

如果要将空间分割成网格然后将点分配到该网格中,最好的方法是创建{{1}的2D数组(使用原始数组或使用某些网格线性化) } s,每个只在一个特定的空间区域中保存点。这样,如果你想查找一个元素,你会转到地图上的那个存储点,然后让地图查找该值,然后查询它自己的内部存储系统以找到你的点。想。这意味着如果你想分割点以便你可以对空间区域进行有趣的查询,这些点存储在专门用于这些区域的存储桶中,但是在这些存储桶中它们存储在哈希表中以进行制作查找这些点需要更少的时间。

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

希望这有帮助!

答案 1 :(得分:0)

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

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

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

map[hash].push_back(hash);

答案 2 :(得分:0)

你真正想要的不是'桶'而是地图。 你想要像地图地图这样的东西

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)

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