用射影几何的对偶变换,原本问题
“给定一堆点求一条穿过最多点的线”
的对偶问题是知名问题
“给定一堆线求一个穿过最多线的点”
唯一要注意的地方是射影平面在我们一般熟知的平面上
加上许多无穷远“理想点”,每一组平行线都会相交于某个
无穷远的“理想点”。这些理想点又形成一条“理想线”。
这些多加的元素让线跟点完全对称。
撇开这些抽象概念,其中一个对应就是把一个点 (a,b)
变成 y = ax + b 这条线。简单来说,通过一个点的所有可
能的直线的参数,在参数平面上会形成一条直线。
给定一堆线求相交的点,应该可以用 Bentley-Ottmann
算法,只要小心垂直线和完全平行的线就行了。以下我没
有仔细想过,有赖大家验证:参数平面中的垂直线应该是对
应到原来平面中的理想点,大概可以忽略它,因为欧式几何
里面没有理想点。参数平面中的非垂直平行线代表原平面中
相同 a 不同 b 的点... 也就是在原平面中会被垂直线穿过
的点;或用术语来说,这些平行线交于某个理想点,而这个
理想点对应回来就是那条垂直线。
总而言之,如果我上个段落后半部没有想错的话,先考
虑所有垂直线,然后通过对偶在参数平面上用 Bentley-
Ottmann 找交点。全部应该可以在 O(nlgn) 时间内完成。
===
我记错了,Bentley-Ottmann 的复杂度是 O((n+k)lgn)
有其他算法是 O(nlgn + k). 如果全部要写成 n 那复杂度
还是 O(n^2).