Algorithmus zum Vergleich von Arrays



  • Hallo,

    ich habe 2 Arrays mit beispielsweise folgendem Inhalt

    1 = [A,B,C]

    und

    2 = [A,B,X,C]

    Diese sollen als gleich eingestuft werden, da bis auf ein
    eingefügtes Element die Reihenfolge stimmt und alle in 1 vorhandenen
    Elemente auch in 2 vorhanden sind.

    3 = [A,B] soll aber nicht mit 1 übereinstimmen, da dort
    ein Element aus 1 fehlt.

    auch

    4 = [A,C,B] ist falsch, weil dort die Reihenfolge durcheinander ist.

    Ich hoffe mal das Prinzip ist klar - wer kennt nen einfachen (soll gut
    nachvollziehbar sein, egal ob effizient) Algorithmus, der sowas kann?

    Danke und Gruss,

    ArrayVergleicher 🙂



  • Wirf aus dem zweiten Array alle Elemente raus, die im ersten nicht vorkommen, und prüf danach die Arrays auf Gleichheit.



  • bool comapare(std::vector<T> const & a, std::vector<T> const & b) {
      std::size_t ia = 0;
      std::size_t ib = 0;
    
      while (ia < a.size() and ib < b.size()) {
        if (a[ia] == b[ib]) ++ia;
        ++ib;
      }
    
      return ia == a.size();
    }
    


  • Ich würde es wie folgt machen: iteriere durch das Array 1 und schau, ob das aktuelle Element in Array 2 vorkommt. Zusätzlich merkst du dir immer den Index des gefundenen Elements in Array 2. Sollte kein Element in Array 2 vorhanden sein oder der aktuelle Index in Array 2 nicht grösser wie der aktuelle sein, liefert der Vergleich false. Zu beachten sind Sonderfälle, wie zB

    1 = [A,B,C]
    2 = [A,C,B,C]
    

    Da weisst nur du, ob das als gleich oder ungleich betrachtet werden soll. Dementsprechend musst du die Vergleichslogik anpassen, dass zB das erste oder letzte gefundene Element in Array 2 ausschlaggebend ist (hier im Beispiel Element C). Dann kannst du uU auch den Algorithmus vereinfachen, indem du zB bei der Suche in Array 2 nicht immer vom Anfang ausgehend suchst, sondern ab dem Index der letzten Fundstelle.


Anmelden zum Antworten