使用哈希图将点划分为子区域
Dividing points into subregions using hashmaps
我有一个200像素x 200像素的2D光栅,我想把它细分为每个10x10像素的400个"桶"。
然后我有一个点列表(大约200公里(,我想在上面提到的结构中绘制。因此,如果该点落入10x10区域,请将其添加到桶中。
现在,在我看来,这是一个哈希表可以做得很好的事情。我想知道这是否可能使用STL?
我尝试使用stl::undered_map并指定bucket的数量,但这不起作用,它"忽略"了该请求。(我想,因为有太多的项目被映射到同一个区域,但在我的情况下,这不是问题,相反,这就是重点(。
STL有什么方法可以做到这一点吗?
我认为您混淆了两个术语。哈希表意义上有"bucket",这是一些内部实现细节,用于均匀分布元素,这样查找就不会扫描太多无用的元素。还有空间意义上的"桶",即将空间划分为多个区域,使元素恰好属于一个桶。通常,你可以自己控制空间桶系统(你可以选择所有东西的分割位置(,但哈希表不能让你非常精确地控制桶。你可能需要选择一个初始大小,但如果哈希表认为增加该大小以提高性能是个好主意,它几乎肯定会这么做。如果不这样做,查找时间会更糟。
如果您想将空间分割成一个网格,然后将点分布到该网格中,最好的方法是创建一个std::unordered_map
s的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)
塔达。这就是你想要的。。。
- 如何将输出数字划分为奇数和偶数
- 将QGraphicsItem的移动区域限制在多边形区域内
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- C++无符号短裤的划分导致 int
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 如何在 C++ 中将数组划分为不同的数组
- 提升区域设置规范化带状字符,但不规范化重音
- 分类还是划分枚举?
- 如何将代码划分为多个.cpp文件 C++.
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 将一系列已排序的元素划分为相邻组
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 英特尔将指令存储在重叠的内存区域
- 如何给主窗口区域DKGRAY_BRUSH?
- 矢量擦除多个区域,2 x 擦除与单个分配?
- 将图像划分为区域,并为其指定标签?使用指针
- 如何在矩形子区域中划分OpenCV Mat
- 使用哈希图将点划分为子区域
- 如何划分白板区域