合并/连接几何实体

时间:2012-06-22 12:29:19

标签: algorithm

我有几何实体的容器。我们假设有圆,椭圆,直线,圆弧。 对于每个实体,我可以获得实体端点和实体起始点。

实体可以连接,因此实体的端点也可以是另一个实体的端点。

所以我们有实体:startpoint,endpoint,id

我想为每个连接的实体分配相同的ID。

如果三个实体有一个共同点,因为连接实体应该被视为更长的路径。

最有效的方法是什么?到目前为止,我唯一的想法是迭代整个容器并检查每个实体与其他实体的循环。

我希望问题定义明确,标签还可以。如果没有,请评论或编辑。我会尽力提供进一步的细节。

2 个答案:

答案 0 :(得分:1)

对于少数实体:

for ( u32 i = 0; i < numEntities; i++ )
{
   for ( u32 j = i+1; j < numEntities; j++ )
   {
       if ( hasCommonEndpoint( entity[i], entity[j] ))
          setSameId( entity[i], entity[j] ) 
   }
}

这会缩放为O(n ^ 2),因此如果您拥有大量实体,它将会爆炸。它还假定在端点上匹配的实体在任何其他端点上都不匹配。如果发生这种情况,那么您需要允许实体拥有多个ID。

请注意,内部循环开始于j&gt;我,所以你不要多次比较同一个实体。这将把时间缩短一半。

如果你有大量的实体,你会想做类似的事情:

HashTable<endpointHash, entity> dict; 
for ( u32 i = 0; i < numEntities; i++ )
{
   dict.insert( entity[i].endpointHash(), entity[i] );
}

其中HashTable托管具有相同端点哈希的端点的所有实体的列表。然后,对于每个列表,以与第一个循环相同的方式迭代列表匹配端点的元素。这将大致更好地扩展O(n)+ O(m ^ 2),其中N大且M小。实际性能取决于散列函数的质量和散列区的数量。

答案 1 :(得分:1)

除了@ RafaelBaptista建议的端点哈希之外,有效的通用解决方案还需要disjoint-set datastructure,这解决了为连接的实体组分配单个ID的问题。

正如链接中所提到的,有效的不相交集算法“实际上是线性的” - 形式上,它可能比线性慢一点,但对于实际问题大小,差异在5倍之内。