我想出了一種算法,如果我的頂點索引從最低座標排序到最高,我可以讓線性時間將我的有孔多邊形變成梯形。用於在多邊形輪廓中排序頂點的線性時間算法
我得到簡單的多邊形作爲輪廓。他們有一定的秩序,可能在大多數時間被利用。
因此,給出這些條件,是否存在近似線性時間的排序算法?
我想出了一種算法,如果我的頂點索引從最低座標排序到最高,我可以讓線性時間將我的有孔多邊形變成梯形。用於在多邊形輪廓中排序頂點的線性時間算法
我得到簡單的多邊形作爲輪廓。他們有一定的秩序,可能在大多數時間被利用。
因此,給出這些條件,是否存在近似線性時間的排序算法?
我想你想要的答案是「不」,但我也認爲你可能要更仔細地考慮你的問題。
問題是你使用的是連續座標,所以原則上你不能使用線性排序。 (實際上,您可以使用基數類型來處理固定大小的座標,但實際上這可能比標準的O(N log N)排序慢,這是由於所涉及的開銷...)
理論規則是:無論何時你只能比較你的值的情況下,一般排序不能比O(N log N)快。
您提到了一個未指定的屬性,「可能會被大部分時間利用」。問題是O()符號是一個漸近的,最糟糕的理論屬性,所以「大部分時間」都不會有所作爲。輸入一個特定的屬性往往能以這種方式被利用,但是:
不幸的是,調整你的算法利用你輸入的時候,很容易錯過了一個不起眼的最壞的ca這種情況會在您釋放後很長時間內以意想不到的方式殺死您的表現。關於算法的O()最重要的事情就是阻止它像這樣糟糕地炸燬。
請注意,爲此目的,O(N log N)是近線性,並且使用標準的,行爲良好的庫分類可能是正確的選擇。
線性時間運行的排序算法是計數排序,基數排序和桶排序。
維基也是有幫助的: Sorting algorithms
這兩種都不適合浮點數,如座標... – MartinStettner 2010-05-12 06:26:58
那麼這不是真的,你可以一個接一個地獲得基數排序的小數點,並停止在一定的容差水平。不是最明顯的算法,但我同意你的看法。 – Blindy 2010-05-12 06:33:51
@MartinStettner如果你之前沒有看過這個討論,你應該查看http://www.codercorner.com/RadixSortRevisited.htm。當然,「非常適合」在編碼器的眼中。 – Dolphin 2010-05-12 20:20:01
我不知道你所說的「一定的順序」和「大部分時間」的意思。對於簡單的(即非凸的)普通多邊形,恐怕可能沒有解決方案,因爲點的座標可能是任意順序的(你可以有非常奇怪的「簡單」多邊形...)
當然,如果你正在處理凸多邊形,相對於y座標的線性時間分類將變得很簡單:只需找到最低點,並在左邊和右邊平行移動......
無論如何,除非你有非常大的多邊形,否則一個很好實現的算法可能會比某些線性時間算法快或甚至更快(例如,如果線性算法的常數因子大於日誌n ... )
你的問題有點含糊,但假設如下:
你可以做到以下幾點:
該解決方案不完全是線性的。 – Dolphin 2010-05-12 20:11:54
我最終要遵循這種方法,所以爲了從未回答中得到這個結果,在這裏你得到一些分數。 – Cheery 2010-05-18 17:43:49