Angesichts eines std::vectorbestimmten 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 zwischensumund 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_setnach dem Unterschied zwischensumund 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_setDatenstruktur 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.