Saltar al contenido principal

3SUM y puntos colineales

El concepto de reducción se utiliza también para hablar de cotas inferiores que están en función de otras cotas inferiores que no son conocidas, pero sí muy estudiadas. Por ejemplo, si podemos reducir la multiplicación de matrices de n×nn \times n a un cierto problema PP, sabemos que PP no es más fácil que multiplicar matrices. Antes de Strassen, podríamos haber pensado que la complejidad del problema era Θ(n3)\Theta(n^3). En 1969, Strassen mostró cómo multiplicar matrices en tiempo O(n2.81)O(n^{2.81}), y luego en 1990 Coppersmith y Winograd lo redujeron a O(n2.38)O(n^{2.38}) (analizado en 2014 por Le Gall).

No se conoce una cota inferior general para el problema más allá de la obvia Ω(n2)\Omega(n^2). Un problema tan trabajado es útil en sí mismo como cota inferior: si podemos resolver PP en menor tiempo, habremos encontrado un algoritmo para multiplicar matrices mejor que todos los conocidos. Decimos entonces que PP es multiplicación-de-matrices-hard. Tal como en la NP-completitud, donde se dice que un problema es NP-hard, es una forma de decir cuán improbable se considera obtener un mejor resultado para resolver PP (nota: ser NP-completo equivale a ser NP y ser NP-hard).

El problema 3SUM es el de, dados nn números reales Z={z1,,zn}Z = \{ z_1, \ldots, z_n\}, encontrar tres que sumen cero (pueden repetirse números en la suma). Veamos cómo resolver este problema en tiempo O(n2)O(n^2). Supongamos que primero ordenamos los números en tiempo O(nlogn)O(n\log n). Luego, tomaremos cada número ziz_i y buscaremos dos números de ZZ que sumen zi- z_i. Para ello, progresaremos desde las dos puntas del arreglo ordenado, mz1m \leftarrow z_1 y MznM \leftarrow z_n, con dos cursores. Si m+M+zi<0m+M+z_i < 0, moveremos el cursor de la izquierda hacia adelante, mz2m \leftarrow z_2. En cambio, si m+M+zi>0m+M+z_i > 0, moveremos el cursor de la derecha hacia atrás, Mzn1M \leftarrow z_{n-1}. En todo momento, el invariante es que los números que ya dejamos de considerar no pueden formar parte de la solución, y se puede ver que se mantiene cuando movemos los cursores. Al final, en tiempo O(n)O(n) encontramos un mm y MM adecuados (con lo cual resolvimos el problema con los números mm, MM y ziz_i), o los cursores se cruzan y debemos pasar a considerar otro número ziz_i. El tiempo total es O(n2)O(n^2).

Por mucho tiempo se sospechó que Θ(n2)\Theta(n^2) era la complejidad del problema, pero en 2014 Grunlund y Pettie encontraron una solución de tiempo O(n2/(logn/loglogn)2/3)O(n^2/(\log n / \log\log n)^{2/3}). Aún así, se sospecha que el problema es Ω(n2o(1))\Omega(n^{2-o(1)}) (es decir, Ω(n1.999)\Omega(n^{1.999\ldots}) para cualquier cantidad finita de 99s). Como es un problema bastante estudiado, es interesante cuando se establece que otro problema es 3SUM-hard.

Consideremos el problema de, dados nn puntos (xi,yi)(x_i,y_i), encontrar tres puntos colineales que no estén en una línea vertical. Esta última restricción se pone por conveniencia para demostrar una cota inferior, pues ese subcaso es fácil de resolver.

Reduciremos 3SUM a este problema, para mostrar que es 3SUM-hard. Dados nn números Z={z1,,zn}Z = \{ z_1, \ldots, z_n\}, generaremos 3 puntos para cada ziz_i: (1,zi)(1,z_i), (2,zi2)(2,-\frac{z_i}{2}), y (3,zi)(3,z_i). Veremos que este conjunto tiene 3 puntos colineales no en vertical sii ZZ tiene 3 números que suman 00. Dadas las coordenadas xix_i elegidas, estos 3 puntos colineales deben ser de la forma (1,a)(1,a), (2,b)(2,b) y (3,c)(3,c), con b=a+c2b = \frac{a+c}{2}. Pero como a=zia=z_i para algún ii, b=zj2b = -\frac{z_j}{2} para algún jj, y c=zkc=z_k para algún kk, tenemos que zj2=zi+zk2-\frac{z_j}{2} = \frac{z_i+z_k}{2}, de lo que se deduce que zi+zj+zk=0z_i + z_j + z_k = 0. También puede verse que ocurre lo recíproco: si hay tres números que sumen cero, hay tres puntos colineales. Como la conversión cuesta sólo O(n)O(n), tenemos que el problema es 3SUM-hard.

3SUM reduce a colineales

Finalmente, el problema de encontrar tres puntos colineales sin la restricción de que estén en vertical también es 3SUM-hard. Para que esto tenga sentido, sin embargo, aún debemos prohibir que los puntos sean iguales, pues el problema es trivial en ese caso. Si los tres puntos deben ser distintos, entonces podemos crear los puntos (zi,zi3)(z_i,z_i^3). Si aparecen tres puntos colineales distintos (a,a3)(a,a^3), (b,b3)(b,b^3) y (c,c3)(c,c^3), con a<b<ca<b<c, entonces tenemos que a3b3ab=b3c3bc\frac{a^3-b^3}{a-b} = \frac{b^3-c^3}{b-c}, es decir, a2+ab+b2=b2+bc+c2a^2+ab+b^2 = b^2 + bc + c^2, de donde tenemos a2c2=b(ac)a^2-c^2 = -b(a-c), o (a+c)(ac)=b(ac)(a+c)(a-c) = -b(a-c). Dividiendo por aca-c obtenemos a+b+c=0a+b+c=0.