我有几何实体的容器。我们假设有圆,椭圆,直线,圆弧。 对于每个实体,我可以获得实体端点和实体起始点。
实体可以连接,因此实体的端点也可以是另一个实体的端点。
所以我们有实体:startpoint,endpoint,id
我想为每个连接的实体分配相同的ID。
如果三个实体有一个共同点,因为连接实体应该被视为更长的路径。
最有效的方法是什么?到目前为止,我唯一的想法是迭代整个容器并检查每个实体与其他实体的循环。
我希望问题定义明确,标签还可以。如果没有,请评论或编辑。我会尽力提供进一步的细节。
答案 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倍之内。