8

假設我在一般位置有n條線段。我怎樣才能快速計算出n個分段中的每個分段有多少個n-1相交?有沒有一種有效的方法來計算給定的一組線段之間的交點數量?

我可以在O(n )的時候做到這一點。我可以在O((n + k)log n)時間內使用相當直接的掃描線算法(Bentley-Ottmann)找到所有交點,其中k是這樣的交點的數量,然後將我發現的交點聚集成一堆計數。

我不需要找到的交叉點,雖然;我只想知道有多少。我看不出如何修改掃描線算法,因爲它需要爲每個交集重新排列樹中的兩個東西,而且我也想不到任何其他不會遇到相同問題的技術。

我也有興趣聽到如何計算有多少總交叉點。

回答

6

我很難相信在一般情況下你可以比賓利奧特曼做得更好。如果您不關心線段相交的位置,您可以簡化計算,但是我沒有看到如何在不發現它們的情況下計算交叉點。

本質上,Bentley Ottman是一種簡化交叉路口搜索空間的方法。還有其他一些方法可能適用於線段的特定佈置,但除非您的線段之間存在某種可預測的幾何關係,否則您將無法比第一種方法更好地使用某種巧妙的方法找到候選交點並將其與個別覈對每位候選人。

除非您的問題域具有某些可能會提供可開發子結構的特定功能,否則我認爲您最好的速度選擇是使Bentley Ottman(或某種類似的掃描算法)適用於並行執行。 (將線段剪成樂隊是很簡單的,找出一組最佳樂隊也會很有趣。)當然,這是一個實用的而不是學術的練習;並行算法可能最終會完成更多的工作;它只是利用硬件在(固定因素)時間內完成工作。

+1

我有...很難相信掃描線方法可以被打敗。考慮到我可以計算n個線段之間的交點數量,這些線段的左端點都具有x座標0,右端點都具有x座標1;這只是數組中倒數的經典問題。所以,至少在某些特殊情況下,我應該能夠尋找這種底層結構並以某種方式利用它。 – tmyklebu

+0

@tmyklebu,當然,如果有一個可開發的子結構,你可以隨時利用它。但你必須先了解它。你可以很容易地在'O(n)'中檢查單位方塊情況,但除非你有充分的理由相信這很可能會很愚蠢。 (對於其他特殊情況也是如此,例如凸多邊形的集合)。這種情況不是「一般情況」。 B-O將很好地處理多邊形案例的收集,因爲它加快了實際交叉點的數量。 – rici

+0

B-O處理只有幾個十字路口很好地存在的情況。當我得到一堆多邊形時,我仍然可以想出粗糙的情況(圖片中的一組等邊三角形以同一點爲中心,但以隨機角度旋轉)。可開發的子結構是......問題的關鍵點。 :) Chazelle有一篇論文(「報告和計算分段交點」),似乎使用這種垂直分解思路,並且聲稱對於我的問題有一個O(n 1.695)時間算法,但它似乎依賴於一個非常不切實際的數據結構。有總比沒有好。 – tmyklebu

相關問題