Se k è molto vicino a 1 o N, qualsiasi algoritmo che genera pigramente le somme ordinate potrebbe semplicemente essere eseguito fino a quando l'elemento kth o N-kth non viene visualizzato.
In particolare, sto pensando alla ricerca migliore del seguente spazio: (a, b) significa l'oggetto ath da A, il primo elenco, aggiunto al bth da B, il secondo.
Mantieni in una migliore = coppie di code con priorità più bassa (a, b) con costo (a, b) = A [a] + B [b].
Inizia con solo (1,1) nella coda di priorità, che è il minimo.
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)
Questo vi dà una connettività pettine a denti di sega e si evita di dover marcare ogni (a, b) ha visitato in un array. Nota che costo (a + 1, b)> = costo (a, b) e costo (a, b + 1)> = costo (a, b) perché A e B sono ordinati.
Ecco una foto di un pettine per mostrare la regola di generazione successore sopra (che si avvia in alto a sinistra, una è la direzione orizzontale):
|-------
|-------
|-------
E 'solo best-prima esplorazione di (fino a) tutti | A | * | B | tuple e loro somme.
Si noti che la maggior parte delle voci possibili prima dello snapback k è 2 * k, poiché ogni elemento ha 1 o 2 successori. Ecco un possibile stato di coda, in cui gli elementi hanno spinto nella coda sono contrassegnati *
:
|--*----
|-*-----
*-------
Tutto in alto a sinistra del *
frontiera è già stato spuntato.
Per il caso N-k<k
, fanno la stessa cosa, ma con ordine coda di priorità inverso e l'ordine di esplorazione (o, semplicemente negare e invertire i valori, ottenere il (N-k) esimo almeno, quindi negare e restituire la risposta).
Vedere anche: elenco ordinato di somme a coppie on SO o Open problems project.
Sì, questo è esattamente una bella soluzione . In tal caso, se abbiamo ordinato A e B, possiamo ottenere kth più grande con O (min (klgk, klgn)), giusto? – ibread