回答
如果你能想出比O(N^2)更好的算法,你可以發佈它!
這個問題是3-SUM Hard,以及是否存在亞二次算法(即比O(N^2)更好),因爲它是一個開放性問題。許多常見的計算幾何問題(包括你的)已被證明是3SUM的難題,這類問題正在增加。像NP硬度一樣,3SUM硬度的概念已被證明可用於證明某些問題的「韌性」。
對於一個證明,你的問題是3SUM難,是指這裏的優秀surver紙:在上述紙3頁(通稱爲3-POINTS-ON-LINE)上顯示http://www.cs.mcgill.ca/~jking/papers/3sumhard.pdf
您的問題。
因此,目前最有名的算法是O(N^2),你已經擁有了它:-)
謝謝@Moron。該鏈接非常有幫助。 – Boolean 2010-05-07 09:23:23
@Moron - 是否有一個算法的時間爲'O(n^2)'這不是使用散列表作爲@Strilanc描述的算法? – 2010-07-08 06:26:56
@Elazar:我認爲有可能通過考慮雙線映射到點,反之亦然(a,b)<-> y = ax + b。現在這個問題對應於在至少有6度的對偶中找到頂點。顯然這在O(n^2)時間和O(n^2)空間中是可能的。本書:http://books.google.com/books?id=PBRJ-ruwOQcC在第94頁提到了它。 – 2010-07-08 06:51:45
一個簡單的O(d * N^2)的時間和空間的算法,其中d是維數,N是點的數目(可能不是最優的):
- 圍繞點集創建邊界框(使其足夠大,以便邊界上沒有點)
- 對於每對點,計算穿過它們的線。
- 對於每一行,用邊界框計算它的兩個碰撞點。
- 兩個碰撞點定義了原始線,所以如果有任何匹配線,它們也會產生相同的兩個碰撞點。
- 使用散列集合來確定是否有任何重複的碰撞點對。
- 當且僅當有重複時,共有3個共線點。
你的情況是必要的,但它是足夠的嗎?在(0,0),(0,1),(1,0)和(1,1)處放4個點來定義邊界框。對[(0.5,0.6),(0.5,0.7)]創建一個與(0.5,0)處的框相交的線段,就像線對[(0.4,0.1),(0.3,0.2)]一樣。然而,八點中沒有三點在任何共同線上。 – Eric 2010-04-29 14:45:09
這是一個充分的條件,因爲兩點定義了一條線。你只考慮了碰撞點對中的一個點;另一個會有所不同,所以這一對不匹配。 – 2010-04-29 15:09:41
你是對的。在步驟2中,您可能想要詳細說明兩個碰撞點放在一起以創建「碰撞點對」。否則,讀者可能會像第一步那樣,在步驟3中將(碰撞點)對與步驟2中的一對(原始點)混淆起來。 – Eric 2010-05-01 00:09:16
另一個簡單的(甚至是微不足道的)解決方案,它不使用哈希表,運行速度爲O (N log n)的時間,並且使用O(n)的空間:
讓S
是點的集合,我們將介紹其中發現S
是否包含某些三點共線點的算法。
- 對於每個點
o
在S
做:- 傳遞平行的線
L
到x
- 軸通過o
。 - 將
S
中的每個點替換爲L
以下的每個點,並進行反思。 (例如,如果L
是x
軸,則(a,-x)
對於x>0
將在反射後變爲(a,x)
)。讓新的設定點是S'
- 每個點
p
在S'
的角度,是段po
與線L
直角。讓我們按其角度對點S'
進行排序。 - 瀏覽
S'
中的排序點。如果有兩個連續的點與o
共線 - 返回true。
- 傳遞平行的線
- 如果在循環中找不到共線點 - 返回false。
循環運行n
次,每次迭代執行nlog n
步驟。不難證明,如果一條線上有三個點,他們將被找到,我們將不會找到其他任何東西。
您只需要對一半的點進行外循環:那些最大的「y」座標值,正確?當你說「有兩個連續點是共線的」時,你的意思是「有兩個連續的點與點o'共線」,我能正確理解你嗎? – 2011-10-16 00:59:09
第一次觀察是正確的,但它不會改變複雜性。由於對稱性,對於另一半點這樣做是等同的。請注意,您必須先對它們進行排序,這會使算法更加複雜。第二點也是正確的,修復它,謝謝。 – 2011-10-16 07:34:47
- 1. 給定一組數據點,找到一個「最接近」的點
- 2. 尋找一個點是否在一個三角形內
- 3. 找出一個點是否在CLLocationCourse
- 4. 畫出一個給定三個點的圓
- 5. 找到一個點與一個平面中的所有其他點非共線
- 6. 測試一條線是否在三角形內有一個點
- 7. 找出一個三維空間中的特定三角形是否從給定點可見,並且可能存在任意多個其他三角形
- 8. HTML5畫布:找出是否點擊座標是一個給定的矩形
- 9. 用給定的一個向量和一個點找出與直角三角形的點
- 10. 如何找到一個點是否在三角形內?
- 11. 如何找到一個點是否在一組間隔內?
- 12. 給定一組間隔,找出有多少個間隔包含一個點
- 13. 確定一個點是否在一條線上的兩個其他點之間
- 14. 從一組n個點中找出m個最遠點
- 15. 如何找到給定線的另一點和垂直線上的2個點的線上點的X座標?
- 16. 算法找到一個點的座標,這是一個關於一條線在3D中的點的反射
- 17. 檢查一個點是否在三維線上
- 18. 確定一個點是否從三維空間的一個圓上的另一個點向左或向右?
- 19. 確定一個節點是否與另一個節點重疊
- 20. 我如何知道一個給定的XULElement是否有焦點
- 21. 給定一個URL如何找到錨點HTML錨點標記?
- 22. 尋找一個點是否在由一組點產生的凸殼
- 23. 如何確定一個點是否是一個四邊形
- 24. 我該如何測試一個點是否在給定的Bézier曲線內
- 25. 查找點是否在一條線上
- 26. 拓撲排序找出給定一個特定節點
- 27. 如何找到一個點是否是使用PostgreSQL查詢的一條線的頂點之一
- 28. 給定一個整數數組,找出數組中第三大的值
- 29. 如何檢查一個節點是否是另一個節點的子節點?
- 30. 找到3個長方形的長度,以便它們共享一個角以形成一個三角形,給定一個共同的寬度和3個點
這是你的作業嗎? – WhirlWind 2010-04-29 02:00:06
這個問題在課上討論過,我知道O(N^2)算法。我在O(N^2)中找到了相當簡單的算法。我想知道是否有更簡單的算法。 – Boolean 2010-04-29 02:01:22
這2d點? – 2010-04-29 02:26:31