No es probable ninguna solución a este problema que es significativamente mejor que O (n^2) en un modelo estándar de la computación .
El problema de encontrar tres puntos colineales reduce el problema de encontrar la línea que atraviesa la mayor cantidad de puntos, y encontrar tres puntos colineales es 3SUM-hard, es decir, resolverlo en menos de O (n^2) tiempo sería un gran resultado teórico.
Consulte el previous question para encontrar tres puntos colineales.
Para su referencia (usando la prueba conocida), supongamos que queremos responder un problema 3SUM como encontrar x, y, z en la lista X tal que x + y + z = 0. Si tuviéramos un algoritmo rápido para el problema del punto colineal, podríamos usar ese algoritmo para resolver el problema 3SUM de la siguiente manera.
Para cada x en X, cree el punto (x, x^3) (por ahora suponemos que los elementos de X son distintos). Luego, verifique si existen tres puntos colineales entre los puntos creados.
ver que esto funciona, en cuenta que si x + y + z = 0, entonces la pendiente de la línea de x a y es
(y^3 - x^3)/(y - x) = y^2 + yx + x^2
y la pendiente de la línea de x a z es
(z^3 - x^3)/(zx) = z^2 + zx + x^2 = (- (x + y))^2 - (x + y) x + x^2 = x^2 + 2xy + y^2 - x^2 - xy + x^2 = y^2 + yx + x^2
Por el contrario, si la pendiente de x a y es igual a la pendiente de xt oz entonces
y^2 + yx + x^2 = z^2 + zx + x^2,
que implica que
(y - z) (x + y + z) = 0,
por lo tanto y = z o z = -x - y basta para demostrar que la reducción es válida.
Si hay duplicados en X, primero comprueba si x + 2y = 0 para cualquier elemento x y duplicado y (en tiempo lineal usando hashing o O (n lg n) tiempo usando sorting), y luego elimina los duplicados antes de reducir al problema colineal de búsqueda de puntos.
No creo que sea posible. Sería posible si existiera tal transformación en un solo punto que ayudaría, pero desafortunadamente cualquier transformación en la que pueda pensar requiere de 2 puntos. Un enfoque probabilístico (como Monte Carlo) podría ser más rápido, pero no habría ninguna garantía de que encuentre el máximo. – ruslik
Si sustituyes las coordenadas de puntos por la ecuación de línea, 'k * x [i] + b = y [i]', obtendrás la ecuación sobre 'k' y' x'. En {k, x} -space, será una línea. Entonces, se convierte en un problema de líneas máximas que pasan por un punto. Puede tener una solución. – Vovanium
Tenga en cuenta que el problema solo tiene sentido para los coodonatos enteros, por lo que 'k' y' b' tienen que ser números racionales, tales como 'b == y - k * x', donde' y' y 'x' son enteros. Quizás al transformar el problema en la forma "encontrar esos números racionales" b "y" k "que satisfacen la mayoría de las ecuaciones" ayude. – ruslik