Ich habe zwei Vektoren von Zeichenfolgen und möchte die Zeichenfolgen finden, die in beiden vorhanden sind, die dann einen dritten Vektor mit den gemeinsamen Elementen füllen.
Wenn meine Vektoren…
v1 = <"a","b","c">
v2 = <"b","c">
sort() die Vektoren und verwenden Sie dann eine einzelne for-Schleife, die beide Vektoren gleichzeitig durchsucht und immer den kleineren vorrückt. Dann sammeln Sie einfach die gemeinsamen Elemente.
– tp1
20. Oktober 2013 um 22:37 Uhr
for Schleife durch einen Vektor und darin do for durch einen anderen.
Dies ist O(n log n), wobei n das Maximum der beiden Größen ist. Warum nicht einfach ein Hash-Set erstellen, das aus den Einträgen eines der Vektoren besteht, und dann den anderen Vektor linear nach ihnen durchsuchen? Das ist O(n + m) Zeit, O(m) Gedächtnis. Ich sehe, dass die von mir vorgeschlagene Lösung weniger Cache-freundlich ist und mehr Speicher verwendet.
– Eric Auld
14. April 2019 um 19:22 Uhr
Ich denke, OP hat nicht gesagt, dass Vektoren sortiert sind.
– See9m
15. April 2019 um 20:08 Uhr
Sie müssen nur den kleineren Vektor sortieren. Führen Sie dann einen einzigen Durchgang über den größeren Vektor durch und testen Sie das Vorhandensein seiner Elemente in einem kleineren Vektor, indem Sie eine binäre Suche verwenden.
Anstatt zu sortieren, sollten Sie den Speicher gegen Zeit eintauschen, indem Sie einen Hash-Satz aus dem kleineren Vektor erstellen und dann den größeren Vektor durchlaufen, um nach diesen Elementen zu suchen, wie vorgeschlagen hier. Das ginge schneller als sortieren und verwenden std::set_intersection.
sort() die Vektoren und verwenden Sie dann eine einzelne for-Schleife, die beide Vektoren gleichzeitig durchsucht und immer den kleineren vorrückt. Dann sammeln Sie einfach die gemeinsamen Elemente.
– tp1
20. Oktober 2013 um 22:37 Uhr
for
Schleife durch einen Vektor und darin dofor
durch einen anderen.– Agent_L
20. Oktober 2013 um 22:39 Uhr