Angesichts eines std::vector
bestimmten Elements, das in aufsteigender Reihenfolge sortiert ist, möchte ich einen Algorithmus entwickeln, der bestimmt, ob die Sammlung zwei Elemente enthält, deren Summe ein bestimmter Wert ist sum
.
Ich habe zwei verschiedene Ansätze mit ihren jeweiligen Kompromissen ausprobiert:
Ich kann den gesamten Vektor scannen und für jedes Element im Vektor die binäre Suche (
std::lower_bound
) auf den Vektor anwenden, um ein Element zu suchen, das der Differenz zwischensum
und dem aktuellen Element entspricht. Dies ist eine O (n log n) -Zeitlösung, die keinen zusätzlichen Speicherplatz benötigt.Ich kann den gesamten Vektor durchlaufen und einen füllen
std::unordered_set
. Dann scanne ich den Vektor und suche für jedes Element imstd::unordered_set
nach dem Unterschied zwischensum
und dem aktuellen Element. Da die Suche in einer Hash-Tabelle im Durchschnitt in konstanter Zeit ausgeführt wird, wird diese Lösung in linearer Zeit ausgeführt. Diese Lösung erfordert jedoch aufgrund derstd::unordered_set
Datenstruktur zusätzlichen linearen Raum .
Trotzdem suche ich nach einer Lösung, die in linearer Zeit läuft und keinen zusätzlichen linearen Raum benötigt. Irgendwelche Ideen? Es scheint, dass ich gezwungen bin, Geschwindigkeit gegen Weltraum zu tauschen.