我有以下两个类
public class PointClass
{
double x, y, z;
}
和
public class PolyLineClass
{
PointClass startPoint;
PointClass endPoint;
}
和PolyLineClasses数组
polyLineArray[];
假设如果我们以某种顺序连接polyLineArray中的所有行,我们将获得一个封闭的非自相关曲线。
例如
startPt endPt
polyLineArray[0]: (0,0,0) (1,0,0)
polyLineArray[1]: (0,1,0) (0,0,0)
polyLineArray[2]: (1,1,0) (0,1,0)
polyLineArray[3]: (1,0,0) (1,1,0)
如果我们以0-> 3-> 2> 1的顺序遍历数组,我们创建一个闭合曲线(在这个简单的情况下,是一个正方形)。 现在,我所拥有的是以下算法:
1) int i = 0;
2) Get the endPt of polyLineArray[i];
3) search through the array for an element with index j such that
polyLineArray[i].endPoint == polyLineArray[j].startPoint.
4) i = j; Repeat from step2 until all elements in the array have been visited.
上述算法是O(可怕)。有更有效的方法进行排序吗? 如果语言很重要,我在c#编码。
答案 0 :(得分:1)
考虑使用(x,y,z)
作为图形的顶点标签,其边缘恰好是折线阵列中的线段(startPoint, endPoint)
。在顶点标签上定义词典顺序。在O(n log n)
中迭代一次通过折线数组时构建图形。检测n
中O(n)
长度为O(n)
的周期,总计为{{1}}。
答案 1 :(得分:1)
创建一个类
public class EndPoint {
PointClass point ;
int lineIndex ;
}
和一个数组
EndPoint endPoints[] ;
,其长度是polyLineArray
的两倍。
对于行e
的每个结束点i
,创建一个EndPoint {e,i}
并将其添加到endPoints
数组中。然后以point
元素顺序对此数组进行排序。 (这些点可以按组件分类/比较)。
排序完成后,您可以遍历数组并选择EndPoints。这些将成对出现,其中点相等,但行索引将指向在该点处连接的线。您可以遍历已排序的EndPoint阵列,获取一系列链接的PolyLines。