2013-05-14 65 views
0

數組我有以下兩類排序折線

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

在x,y,z附近使用地址變量,這樣x,y,z,addr指向下一個polypoint,那麼這將是O(n),或者您可以將它們預先分類到另一個數組中,然後使用該排序數組所以你不必每次都排序(這是O(1)) – 2013-05-14 17:26:04

+0

這聽起來像你正在尋找凸包問題。搜索谷歌/維基百科應該給你一些關於使用一般算法的很好的信息。 – Servy 2013-05-14 17:40:12

+0

@huseyintugrulbuyukisik您能詳細解答一個答案嗎?我對你評論的意思感到困惑。 – Calpis 2013-05-14 17:41:42

回答

1

創建類

public class EndPoint { 
    PointClass point ; 
    int lineIndex ; 
} 

和陣列

EndPoint endPoints[] ; 

,其長度兩倍的polyLineArray

對於線i的每個端點e創建EndPoint {e,i}並將其添加到endPoints陣列。然後按point元素順序對此數組進行排序。 (這些點可以分類/比較組件方式)。

排序完成後,您可以遍歷數組並選取EndPoints。這些將成對出現,其中點是相等的,但是線索引將指向在該點加入的線。您可以走路排序的EndPoint陣列來拾取PolyLines的鏈接系列。

1

考慮使用(x,y,z)作爲圖的頂點標籤,該圖的邊緣恰好是折線數組中的線段(startPoint, endPoint)。定義頂點標籤上的字典順序。在O(n log n)中通過折線數組迭代一次來構建圖形。在O(n)中檢測長度爲n的週期,總計爲O(n)

+0

你能解釋哪些頂點標籤是?另外,由於點分佈在三維空間中,因此如何定義字典順序? – Calpis 2013-05-14 18:49:12

+0

'頂點標籤'是圖頂點的名稱。您可以按照您喜歡的任何方式標記圖頂點,但在創建圖時,必須跟蹤已存在的頂點,並且算法中的頂點由它們的座標元組標識。因此您可以將它們用作識別標籤。 3d中的字典順序(實際上在'IR^n'中)可以通過首先按x座標排序,然後按y以及最後按z排序來定義。例如:(1,2,3)<(3,2,1); (1,2,3)<(1,3,2); – collapsar 2013-05-14 18:53:09