我正在尝试做一些SPOJ问题https://www.spoj.pl/problems/FSHEEP/
我们必须找出点是否在多边形内。 我们看到它不是凸多边形(来自问题的图像)。
我试图用维基百科或任何其他网站上描述的Ray Casting算法在O(n * m)时间内解决它。
但如何在O(n log m)中解决它? 那么换句话说如何在对数时间内检查点是否为多边形?
干杯
答案 0 :(得分:1)
由于这是一个家庭作业问题,我会给你做作业式的帮助。
经验法则:每当你看到log n时,你应该想到“二进制 - 某事”(搜索,树等)。当你看到n log n时,你应该考虑“排序”。你经常会感到惊讶。你能在big-O约束中对顶点和二进制搜索进行排序吗?
更新:
我不想破坏你的乐趣:实际上你按照排序顺序给出了多边形顶点,因此重要的排序就是为你完成的。您不需要在角度空间中创建间隔,使用已排序顶点数组的索引作为间隔。
将光线从农民身上投射到顶点。如果是顺时针,顺时针二进制搜索。如果是逆时针方向,二进制搜索那个方向。两个顶点和农夫形成一个边界三角形。羊是三角形的吗?
疯狂懒惰的伪代码:
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)。