Jeśli k jest bardzo bliskie 1 lub N, każdy algorytm, który leniwie generuje posortowane sumy, może być po prostu uruchomiony, dopóki nie pojawi się element kth lub N-kth.
W szczególności myślę o najlepszym pierwszym wyszukiwaniu w następującej przestrzeni: (a, b) oznacza element ath z A, pierwsza lista dodana do bth z B, druga.
Zachowaj najlepsze pary par o najniższym priorytecie (a, b) z kosztem (a, b) = A [a] + B [b].
Zacznij od just (1,1) w kolejce priorytetów, która jest minimalna.
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)
To daje łączność grzebień piła-zęba i pozwala uniknąć konieczności oznaczyć każdy (a, b) odwiedził w tablicy. Zauważ, że koszt (a + 1, b)> = koszt (a, b) i koszt (a, b + 1)> = koszt (a, b), ponieważ A i B są posortowane.
Oto zdjęcie z grzebieniem, aby pokazać zasadę następca generacji powyżej (zaczynasz w lewym górnym rogu, a jest kierunek poziomy):
|-------
|-------
|-------
To właśnie najlepiej najpierw badanie (do) wszystko | A | * | B | krotki i ich sumy.
Należy pamiętać, że najbardziej możliwe elementy, które zostały przesunięte przed wystrzeleniem k, to 2 * k, ponieważ każdy element ma 1 lub 2 następców. Oto możliwe stan kolejki, w którym elementy wsuwane kolejce są oznaczone *
:
|--*----
|-*-----
*-------
Wszystko powyżej i na lewo od *
granica została już pojawiło.
Dla przypadku zrób to samo, ale z odwróconym porządkiem kolejkowania priorytetów i kolejnością poszukiwań (lub po prostu zaneguj i odwróć wartości, uzyskaj (N-k) co najmniej, a następnie zaneguj i zwróć odpowiedź).
Zobacz także: posortowana lista sum parami on SO lub Open problems project.
Tak, to jest dokładnie ładny roztwór . W takim przypadku, jeśli posortowaliśmy A i B, możemy uzyskać co największy z O (min (klgk, klgn)), prawda? – ibread