这更像是一个数学问题。
我有一个长度为N的二维坐标列表。(Nx2列表)
坐标是四舍五入的数字并形成一个区域。以下是一个例子:
我想要的是围绕这些点设置边框。如下所示:
执行此操作的一个选项是
浏览列表,并查看每个坐标
检查8个可能的邻居j以查看
如果此点与给定坐标k不重叠。
如果此点与已找到的边框坐标重叠
这很好用,坚果需要N * N * 8计算。我的N = 1000分:800万!
有谁知道如何提高效率?
致以最诚挚的问候,
马丁
答案 0 :(得分:0)
创建一个排序容器,强制执行唯一性(在c ++ STL中,这是一个std :: set)坐标。通过这些点,如果它们尚未存在,则将每个点的八个邻居添加到该集合中。然后再次通过这些点,如果它们在集合中,则从集合中减去它们。剩下的点是边界。那是O(N * log(N))。一般来说,这是你能做的最好的事情。但如果存在其他标准,请参阅我的其他答案以获得更好的算法。
答案 1 :(得分:0)
如果网格的大小受到限制并且也在N的数量级上,那么你可以做得更好并通过制作一个像网格大小的二维数组来获得O(N)。
将网格初始化为零。
对于点列表中的每个点,在网格数组中将点本身设置为负,并将每个不为负的邻居设置为正。
当你完成后,2-D网格数组中正面的每个点都是边界。