有效地找到二元组点周围的边框

时间:2018-03-28 14:26:43

标签: math

这更像是一个数学问题。

我有一个长度为N的二维坐标列表。(Nx2列表)

坐标是四舍五入的数字并形成一个区域。以下是一个例子:

enter image description here

我想要的是围绕这些点设置边框。如下所示:

enter image description here

执行此操作的一个选项是

  1. 浏览列表,并查看每个坐标

  2. 检查8个可能的邻居j以查看

  3. 如果此点与给定坐标k不重叠。

  4. 如果此点与已找到的边框坐标重叠

  5. 这很好用,坚果需要N * N * 8计算。我的N = 1000分:800万!

    有谁知道如何提高效率?

    致以最诚挚的问候,

    马丁

2 个答案:

答案 0 :(得分:0)

创建一个排序容器,强制执行唯一性(在c ++ STL中,这是一个std :: set)坐标。通过这些点,如果它们尚未存在,则将每个点的八个邻居添加到该集合中。然后再次通过这些点,如果它们在集合中,则从集合中减去它们。剩下的点是边界。那是O(N * log(N))。一般来说,这是你能做的最好的事情。但如果存在其他标准,请参阅我的其他答案以获得更好的算法。

答案 1 :(得分:0)

如果网格的大小受到限制并且也在N的数量级上,那么你可以做得更好并通过制作一个像网格大小的二维数组来获得O(N)。

将网格初始化为零。

对于点列表中的每个点,在网格数组中将点本身设置为负,并将每个不为负的邻居设置为正。

当你完成后,2-D网格数组中正面的每个点都是边界。