Si k está muy cerca de 1 o N, cualquier algoritmo que genere las sumas ordenadas de forma perezosa podría simplemente ejecutarse hasta que aparezca el elemento kth o N-kth.
En particular, estoy pensando en la mejor búsqueda del siguiente espacio: (a, b) significa el elemento ath de A, la primera lista, añadida a la b desde B, la segunda.
Mantener en el mejor = los pares de cola de prioridad más baja (a, b) con costo (a, b) = A [a] + B [b].
Comience con solo (1,1) en la cola de prioridad, que es el mínimo.
Repeat until k items popped:
pop the top (a,b)
if a<|A|, push (a+1,b)
if a=1 and b<|B|, push (a,b+1)
Esto le da una conectividad peine de dientes de sierra y le evita tener que marcar cada uno (a, b) visitó en una matriz. Tenga en cuenta que el costo (a + 1, b)> = costo (a, b) y el costo (a, b + 1)> = costo (a, b) porque A y B están ordenados.
Aquí hay una foto de un peine para mostrar la regla de generación sucesora anterior (se inicia en la esquina superior izquierda; a es la dirección horizontal):
|-------
|-------
|-------
Es simplemente la mejor primera exploración de (hasta) todos | A | * | B | tuplas y sus sumas.
Tenga en cuenta que la mayoría de los elementos posibles que se insertan antes de reventar k es 2 * k, porque cada elemento tiene 1 o 2 sucesores. Aquí está un posible estado de la cola, donde los artículos empujados a la cola están marcadas *
:
|--*----
|-*-----
*-------
Todo por encima ya la izquierda de la frontera *
ya se ha hecho estallar.
Para el caso , haga lo mismo pero con el orden de cola de prioridad invertido y el orden de exploración (o, simplemente niegue e invierta los valores, obtenga el valor (N-k) mínimo, luego niegue y devuelva la respuesta).
Véase también: lista ordenada de sumas por parejas on SO, o Open problems project.
Sí, esto es exactamente una solución agradable . En tal caso, si hemos ordenado A y B, podemos obtener kth más grande con O (min (klgk, klgn)), ¿verdad? – ibread