Dwie sumy - projektowanie algorytmu optymalizacji wstępnego sortowania
🧩 Czy można zoptymalizować czas działania rozwiązania z dwiema sumami, otrzymując wstępnie posortowane dane wejściowe w kolejności rosnącej lub malejącej?
🚀 Oryginalne dwie sumy
Określ, czy istnieją dwa elementy, których indywidualna pojemność będzie idealnie równa całkowitej pojemności, zapewniając jednocześnie, że ten sam element nie może być wybrany dwukrotnie.
- Dane wejściowe: Int reprezentujący całkowitą pojemność i tablicę Int reprezentujących indywidualne zdolności elementów.
- Dane wyjściowe: wartość logiczna określająca, czy dwie pozycje mogą równać się całkowitej wydajności.
- Złożoność czasowa: wzrost liniowy, $O(n)$
- Złożoność przestrzeni: wzrost liniowy, $O(n)$
Próbki
Wejście: [4, 5, 2, 6]
- Całkowita pojemność:
10
- Oczekiwać:
true
Wejście: [4, 5, 2, 5]
- Całkowita pojemność:
10
- Oczekiwać:
true
Wejście: [4, 5, 2, 7]
- Całkowita pojemność:
10
- Oczekiwać:
false
Pseudo kod
Utwórz zestaw,
searchSet
aby przechowywać elementy, które zostały już zbadane.Iteruj przez wejściową tablicę pojemności przedmiotów.
2a. Znajdź
targetCapacity
dla bieżącej pozycji:totalCapacity - itemCapacity
2b. Jeśli
searchSet
zawieratargetCapacity
, returntrue
.2c. W przeciwnym razie dodaj
itemCapacity
dosearchSet
.Zwróć,
false
jeśli całe wejście jest iterowane bez znalezienia dopasowania.
🏗️ Sortowanie wstępne
- Zapisz nową zmienną
lastTargetCapacity
- Jeśli bieżąca
itemCapacity
<lastTargetCapacity
, nie ma możliwych dwóch sum i powrotufalse
.
to znaczy
Wejście: [6,2,1,0]
- Całkowita pojemność:
9
Iteracje
targetCapacity = 9 - 6
,lastTargetCapacity
= 3- Zwróć false, ponieważ
itemCapacity
of2
<lastTargetCapacity
of3
.
Odpowiedzi
Rozwiązanie Two Sum można zoptymalizować pod kątem wydajności w czasie wykonywania, biorąc pod uwagę, że tablica wejściowa jest wstępnie posortowana w kolejności rosnącej lub malejącej.
Jeśli wyszukiwanie binarne jest używane do znalezienia targetCapacity
powyższego, będzie działać logarytmicznie,$O(logn)$, średni czas pracy. Jest to szybsze niż powyższy pseudokod, który działa liniowo,$O(n)$, środowisko wykonawcze przy użyciu iteracji i mieszania.
Gdyby dane wejściowe nie zawierały sortowania, nie byłoby możliwe sortowanie i wyszukiwanie szybciej niż $O(n)$. Najlepsze, co można zrobić, byłoby$O(nlogn)$ ze strategiami takimi jak Quicksort i Binary Search.
Zobacz: Stanford - Wyjaśnienie dwóch sum
Tak, możesz rozwiązać problem dwóch sum w formacie $O(n)$czas, jeśli liczby są przedstawione w kolejności posortowanej. Zobacz moją drugą odpowiedź, jak to zrobić; obejmuje skanowanie liniowe. Jest to asymptotycznie optymalne, tak jak to już trwa$O(n)$ czas nawet na odczytanie danych wejściowych, a rozwiązanie problemu może wymagać przeczytania całego wejścia, więc nie ma dalszej asymptotycznej poprawy.