Vektorschnittpunkt in C++

Lesezeit: 2 Minuten

Ich habe diese Funktion

vector<string> instersection(const vector<string> &v1, const vector<string> &v2);

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.

    – Agent_L

    20. Oktober 2013 um 22:39 Uhr

Benutzer-Avatar
masud

Versuchen std::set_intersectionzum Beispiel:

#include <algorithm> //std::sort
#include <iostream> //std::cout
#include <string> //std::string
#include <vector> //std::vector

std::vector<std::string> intersection(std::vector<std::string> v1,
                                      std::vector<std::string> v2){
    std::vector<std::string> v3;

    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::set_intersection(v1.begin(),v1.end(),
                          v2.begin(),v2.end(),
                          back_inserter(v3));
    return v3;
}

int main(){
    std::vector<std::string> v1 {"a","b","c"};
    std::vector<std::string> v2 {"b","c"};

    auto v3 = intersection(v1, v2);

    for(std::string n : v3)
        std::cout << n << ' ';
}

  • 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.

1015510cookie-checkVektorschnittpunkt in C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy