【发布时间】:2009-04-10 22:06:28
【问题描述】:
我很快就会遇到一个有趣的问题,我已经开始考虑算法。我想得越多,我就越害怕,因为我认为它会可怕地扩展 (O(n^4)),除非我能变得聪明。我很难对这个变得聪明。这是问题的简化描述。
我有 N 个多边形(其中 N 可以很大 >10,000,000),它们存储为 M 个顶点的列表(其中 M 大约为 100)。我需要为每个多边形创建一个在其他多边形之间共享的任何顶点的列表(将多边形视为周围感兴趣的区域,有时是这些区域但彼此相对)。我看到这样的东西
Polygon i | Vertex | Polygon j | Vertex
1 1 2 2
1 2 2 3
1 5 3 1
1 6 3 2
1 7 3 3
这意味着多边形 1 中的顶点 1 与多边形 2 中的顶点 2 相同,多边形 1 中的顶点 2 与多边形 2 中的顶点 3 相同。同样,多边形 1 中的顶点 5 与顶点相同1 在多边形 3....
为简单起见,我们可以假设多边形从不重叠,它们最接近的是在边缘接触,并且所有顶点都是整数(以便于测试等式)。
我现在唯一能做的就是对于每个多边形,我必须遍历所有多边形和顶点,给我一个 O(N^2*M^2) 的缩放比例,这在我的情况。我可以有非常大的多边形文件,所以我什至不能将它们全部存储在 RAM 中,这意味着要多次读取文件。
这是我目前的伪代码
for i=1 to N
Pi=Polygon(i)
for j = i+1 to N
Pj=Polygon(j)
for ii=1 to Pi.VertexCount()
Vi=Pi.Vertex(ii)
for jj=1 to Pj.VertexCount()
Vj=Pj.Vertex(jj)
if (Vi==Vj) AddToList(i,ii,j,jj)
end for
end for
end for
end for
我假设这已经出现在图形社区中(我没有花太多时间在那里,所以我不了解文献)。有任何想法吗?
【问题讨论】:
-
忘了说 - 这只是 2D!
标签: geometry