【发布时间】:2013-05-14 17:22:39
【问题描述】:
我有以下两个类
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# 编码。
【问题讨论】:
-
在 x,y,z 附近使用地址变量,使得 x,y,z,addr 指向下一个多点,那么这将是 O(n) 或者您可以将它们预先排序到另一个数组中然后使用该排序数组,这样你就不必每次都排序(这是 O(1))
-
听起来您正在寻找凸包问题。在 google/wikipedia 上搜索应该会给你一些关于使用一般算法的好信息。
-
@huseyintugrulbuyukisik 您能否详细说明答案?我对您的评论的意思感到困惑。
-
@Servy 点创建的曲线不一定是凸的。它可能是凹的,所以如果我没记错的话,我认为凸包问题不会适用于此。
-
@Calpis 那么你有凹壳问题。同样的建议。两者都是一回事。转到谷歌/维基百科。