2011-05-23 166 views
0

我试图做一些SPOJ问题是https://www.spoj.pl/problems/FSHEEP/点在多边形

我们必须找出如果点在多边形内。如我们所见,它不是凸多边形(来自问题的图像)。

我试图用维基百科或任何其他网站上描述的Ray Casting算法在O(n * m)时间内解决它。

但是如何在O(n log m)中解决它? 换句话说,如何在对数时间检查点是否在多边形?

干杯

回答

1

由于这是一门功课式的问题,我给你的功课式的帮助。经验法则:无论何时你看到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)。

+0

嘿,谢谢你的回答。这不是我的家庭作业,只是爱好。 你能否详细说明这种二进制搜索方法?我读过,我们必须制定时间间隔并寻找我们的观点,但我无法找到有多大的间隔,以及接下来会发生什么?:) – Spinach 2011-05-23 18:34:01

+0

我已经更新了我的回复。一切都清楚了吗? – ccoakley 2011-05-23 18:56:14

+0

我不知道我是否理解正确: 让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