2014-10-06 86 views
6

如果在座標系中給出100個點,並且必須查找這些頂點是否存在直角三角形。 有沒有一種方法可以檢測這些頂點之間的直角三角形,而不必選擇3​​個頂點的所有對,然後在它們上應用畢達哥拉斯定理? 有沒有更好的算法呢? 感謝您的幫助。 :)用於檢測直角三角形的C程序

+3

您可以找到所有點對(p1 - p2)的矢量,然後檢查其中2個矢量(帶有一個公共端點)的點積爲零。 – Sinstein 2014-10-06 19:34:32

+0

但是,如果我有100分,然後採取2點的每個可能的子集不會是一個更耗時的任務? – user007 2014-10-06 19:37:44

+6

100分並不是那麼多。只要實現樸素的算法,反正不會花費很長時間。 – 2014-10-06 19:49:29

回答

2

這裏是一個O(n^2日誌n) - 時間算法爲僅兩維。我將描述更高維度中的錯誤。

設S是具有整數座標的點集合。對於S中的每個點o,構造一組非零向量V(o)= {p - o | p在S - {o}}中,並測試V(o)在線性時間中是否包含兩個正交向量,如下所示。方法1:將每個向量(x,y)分類爲(x/gcd(x,y),y/gcd(x,y)),其中| gcd(x,y)|是將x和y分開的最大整數,如果y爲負值,則gcd(x,y)爲負值,如果y爲正值,則爲正值,| x |如果y是零。 (這與將分數置於最低項非常相似)關於兩維的關鍵事實是,對於每個非零向量,存在正好與該向量正交的一個正則向量,具體而言,(-y,x)的經典化(canonization) 。將V(o)中每個向量的標準化插入到一個集合數據結構中,然後,對於V(o)中的每個向量,在該數據結構中查找它的規範正交配偶。我假設gcd和/或set操作花費時間O(log n)。方法2:如下定義一個矢量比較器。鑑於載體(a, b), (c, d),寫(a, b) < (c, d)當且僅當

s1 s2 (a d - b c) < 0, 

其中

s1 = -1 if b < 0 or (b == 0 and a < 0) 
     1 otherwise 
s2 = -1 if d < 0 or (d == 0 and c < 0) 
     1 otherwise. 

排序使用此比較的向量。 (這與比較部分a/bc/d非常相似。)對於V(o)中的每個向量(x,y),二進制搜索其正交配偶(-y,x)。

在三維空間中,沿着z軸與單位矢量正交的矢量集是整個x-y平面,並且經典化的等價不能將該平面中的所有矢量映射到一個正交配對。

+0

非常感謝你看到它先生。但是,你能解釋一下經典化的東西嗎?像什麼使用經典化? (除以gcd(x,y))?此外,我有'n'點,然後形成向量選擇所有其他點將是O(n^2)是嗎?然後檢查爲正交性形成的所有其他矢量將是O(n)(線性查看所有矢量?)因此,它將是O(n^2),否?它怎麼可能是'O(n^2logn)'?請解釋..謝謝.. :) – user007 2014-10-07 12:01:23

+0

@ user007這就像把分數至少放在一邊。如果我們假設gcd是恆定時間並且我們可以訪問散列集,那麼是的,運行時間將是O(n^2)。 – 2014-10-07 13:11:10

+0

更簡單:對於每個點,按角度排序其他點,然後查找是否有兩個在O(n)中正交。總體而言,O(n^2.log(n))與您的解決方案相同。 – 2014-10-07 15:21:36