Seleccione dos números que sumen

9

Aquí hay un problema vecino más cercano.

Dados los reales (¡muy grande !), Más el objetivo real , encuentre y cuyo SUM sea más cercano a . Permitimos un preprocesamiento / indexación razonable de (hastaa1,,anp a i a j p a 1 , , a n O ( n log n ) p O ( log n )npaiajpa1,,anO(nlogn) ), pero en el momento de la consulta (dado ), el resultado debe devolverse muy rápido (por ejemplo, tiempo).pO(logn)

(Ejemplo más simple: si solo quisiéramos el SINGLE que está más cerca de , clasificaríamos fuera de línea, p a 1 , , a n O ( n log n ) O ( log n )aipa1,,anO(nlogn) , luego haría una búsqueda binaria en el momento de la consulta, )O(logn)

Soluciones que no funcionan:

1) Ordene fuera de línea, luego en el momento de la consulta, comience desde ambos extremos y mueva dos punteros hacia adentro ( http://bit.ly/1eKHHDy O ( n )a1,,an ). No es bueno, debido al tiempo de consulta .O(n)

2) Ordene fuera de línea, luego en el momento de la consulta, tome cada y realice una búsqueda binaria para un "amigo" que lo ayude a sumar algo cercano aa i p O ( n log n )a1,,anaip . No es bueno, debido al tiempo de consulta .O(nlogn)

3) Ordenar todos los paresO ( n 2 )(a1,,an) sin conexión, luego realice una búsqueda binaria. No es bueno, debido al preprocesamiento de .O(n2)

¡Gracias!

PD. Otras generalizaciones necesarios para la práctica: (1) y para ser 50-dimensionales vectores, (2) "cerca" de ser vector de distancia coseno, y (3) -mejor más cercano pares-que-suma, no solo 1 mejor. p ka1,,anpk

Kevin
fuente
¿Existe un límite en el tiempo de preprocesamiento o la cantidad de espacio que podemos usar después del preprocesamiento? Si estamos limitados al espacio , ¿tiene alguna razón para creer que se puede resolver en, por ejemplo, el tiempo O ( lg n ) ? Eso me parece terriblemente improbable. O(n)O(lgn)
DW
El preprocesamiento está limitado a O ( log n ). Actualicé la declaración del problema. nn
Kevin
No tengo ninguna razón para creer que las consultas pueden ser rápidas, pero muchos resultados útiles para los vecinos más cercanos (árboles kd, hashing sensible a la localidad, etc.) me parecen contraintuitivamente buenos. Una solución aproximada utilizando hashing sensible a la localidad estaría bien para un uso práctico.
Kevin

Respuestas:

17

Esto es casi ciertamente imposible.

Suponga que puede resolver su problema con el tiempo de preprocesamiento y el tiempo de consulta Q ( n ) . Luego hay un algoritmo simple para resolver el problema de 3SUM: dado un conjunto de n números reales, ¿tres elementos suman cero? En tiempo P ( n ) + n Q ( n ) . Preprocesamos todos los números, luego para cada número a k , encontramos el valor de a i + a j más cercano a - a kP(n)Q(n)nP(n)+nQ(n)akai+ajak; si coincide ak exactamente, hemos encontrado una solución al problema 3SUM.

Sin embargo, el algoritmo más rápido conocido para 3SUM se ejecuta en el tiempo , y se conjetura ampliamente que este algoritmo es óptimo. Además, hay un límite inferior Ω ( n 2 ) correspondiente en un modelo de cálculo de árbol de decisión restringido pero natural. Para conjuntos de enteros , existen algoritmos de tiempo ligeramente subcuadrático que "juegan juegos con bits", pero incluso en el modelo de RAM entera, se conjetura que 3SUM requiere Ω ( n 2 /O(n2)Ω(n2)Ω(n2/polylogn) tiempo.

Asumiendo que la conjetura es correcta, su problema requiere tiempo de preprocesamiento (casi) cuadrático o tiempo de consulta (casi) lineal.

Jeffε
fuente
2

Si puede usar espacio ilimitado y tiempo ilimitado durante el preprocesamiento, la siguiente solución cumple con sus requisitos:

  • {ai+aj:1ijn}O(n2)O(n2)

  • ai,ajai+ajpO(lgn)

Si esta solución no es aceptable, debe analizar detenidamente sus requisitos y editar la pregunta en consecuencia.

DW
fuente
Hola y gracias Pero su solución es la misma que mi solución # 3, lo cual es problemático debido al tiempo de preprocesamiento de O (n ^ 2). En mi caso, n es muy grande (p. Ej., 1 m) y debo evitar las operaciones O (n ^ 2).
Kevin