我試圖做一些SPOJ問題是https://www.spoj.pl/problems/FSHEEP/點在多邊形
我們必須找出如果點在多邊形內。如我們所見,它不是凸多邊形(來自問題的圖像)。
我試圖用維基百科或任何其他網站上描述的Ray Casting算法在O(n * m)時間內解決它。
但是如何在O(n log m)中解決它? 換句話說,如何在對數時間檢查點是否在多邊形?
乾杯
我試圖做一些SPOJ問題是https://www.spoj.pl/problems/FSHEEP/點在多邊形
我們必須找出如果點在多邊形內。如我們所見,它不是凸多邊形(來自問題的圖像)。
我試圖用維基百科或任何其他網站上描述的Ray Casting算法在O(n * m)時間內解決它。
但是如何在O(n log m)中解決它? 換句話說,如何在對數時間檢查點是否在多邊形?
乾杯
由於這是一門功課式的問題,我給你的功課式的幫助。經驗法則:無論何時你看到log n,你都應該考慮「binary-something」(搜索,樹等)。當你看到n個記錄時,你應該考慮「排序」。你會驚奇地發現它的工作頻率。你可以在你的big-O限制內對頂點和二進制搜索進行排序嗎?
UPDATE:
我不想讓你掃興:你實際上是在給定的分類順序的多邊形頂點,所以重要的是排序爲你做。您不需要在角度空間中創建區間,使用排序頂點數組的索引作爲區間。
把你的光線從農民身上投射到頂點。如果是順時針,則順時針進行二分搜索。如果是逆時針方向,則進行二進制搜索。兩個頂點和農民形成一個邊界三角形。羊在三角形邊界嗎?
瘋狂懶僞代碼:
if vertex[m] and vertex[0] trivially bound the sheep
l=m, r=0
else
l=0, r=m
while (r-l > 1)
middle = (r-l)/2
if vertex[l] and vertex[middle] bound sheep
r = middle
continue
else if vertex[middle] and vertex[r] bound sheep
l = middle
continue
else some_jerk_gave_you_a_sheep_on_a_ray
check vertex[l],vertex[r],farmer triangle
二進制搜索是爲O(log M)。三角形檢查是O(1)。迭代n只綿羊會給你O(n)* O(log m)* O(1)= O(n log m)。
嘿,謝謝你的回答。這不是我的家庭作業,只是愛好。 你能否詳細說明這種二進制搜索方法?我讀過,我們必須制定時間間隔並尋找我們的觀點,但我無法找到有多大的間隔,以及接下來會發生什麼?:) – Spinach 2011-05-23 18:34:01
我已經更新了我的回覆。一切都清楚了嗎? – ccoakley 2011-05-23 18:56:14
我不知道我是否理解正確: 讓s - 開始頂點 讓l - 最後一個頂點 mid =(s + l)/ 2所以t [mid-1] t [mid] t [mid + 1]如果點在三角形中:它是多邊形的,如果點有較低的座標(x(?)和y(?)),則繼續搜索l = s; S = S;如果更高 - 反之亦然。我理解正確嗎?感謝您的好主意。 – Spinach 2011-05-23 20:12:04