假設有n三維物體(多面體)。計算所有對象O(n^2)的交集是最快的方法嗎?檢測多面體之間相交的*最快*算法是什麼?
現在,我使用的基本上迫使T(N)等於N^2庫:
for each object: // there are n objects
get list of intersecting objects // this takes n steps
,從字面上需要N^2層的步驟。我可以想到的方式仍然是O(n^2),但是T(n)= n(n + 1)/ 2或者(n * n + n)/ 2。
這裏是僞代碼:
for(int i = 0; i < len(objects) - 1; i++)
for(int j = i + 1; j < len(objects); j++)
if object at i intersects object at j:
object at i . addToIntersectList (object at j)
object at j . addToIntersectList (object at i)
這樣,我們就不必檢查是否兩個對象相交兩次。我知道我正在迭代的列表中有大約3000個對象。該算法需要4501500步,而原始算法需要接近兩倍,即9000000步。
我錯過了什麼嗎?這是我們能得到的最好的嗎?
如果你能讓GPU做數學運算,4,500,000步可能不會那麼糟糕!看看http://en.wikipedia.org/wiki/Gpgpu,http://en.wikipedia.org/wiki/OpenCL,或者甚至是http://en.wikipedia.org/wiki/CUDA看看如果這在你的情況下可能是可行的。以防萬一其他優化不能使您獲得性能所需的位置。 –
也許[plane sweep](https://en.wikipedia.org/wiki/Sweep_line_algorithm)的3D變體可用於相交的多邊形。 – phg