Zwei listen vergleichen?
Heyho, ich hätte da eine frage, unswar möchte ich zwei riesige listen vergleichen. Also ich habe zwei listen mit so vielen begriffen, dass es mir unmöglich erscheint sie alle durchzusehen. Mein ziel ist es aber, aus beiden listen jeden gemeinsamen begriff herauszufiltern.Also:
liste 1. Liste 2.
Tisch. Stuhl
tomate. Orange
banane. Tisch
jz sieht man das tisch in beiden listen vorhanden ist und dann möchte ich dass dieses wort angezeigt wird und dass für riesige listen. Kann mir da vielleicht jemand helfen?
5 Antworten
- Sortiere die zweite Liste mit dem Mergesort
- Iteriere über die erste Liste
- Suche den aktuellen Eintrag der ersten Liste in der zweiten Liste über eine binäre Suche (diese setzt die obige Sortierung voraus)
Hast du Excel oder SQL?
Excel:
Tabellenblatt "Übersicht"
Du kopierst dir beide Listen untereinander und entfernst die doppelten Einträge.
--> Vereinigungsmenge
Nun erstellst du ein Tabellenblatt "Liste1" und füllst Liste 1 ein
Nun erstellst du ein Tabellenblatt "Liste2" und füllst Liste 2 ein
Bei deinem Übersichtsblatt machst du nun einen SVERWEIS des Begriffst auf Liste1 und daneben auf Liste 2
Fertig 😃
Der naivste Ansatz hätte vermutlich O(n*m) worstcase (alle Elemente nacheinander vergleichen).
Zusammen mit dem Aufbau der Liste ist das O(n*m+n+m)
Ich gehe jetzt davon aus, dass der Aufbau der Liste und das Suchen in einem 1:1 Verhältnis stehen (d.h. für zwei beliebige Listen werden genau 1x die doppelten Werte benötigt)
Dann ist die Frage, von wo bekommst du die Liste?
Das möglichst effiziente wäre nämlich schon beim Aufbau der beiden Listen stattdessen eine Datenstruktur zu verwenden wo man in konstanter oder linearer Zeit doppelte Einträge rausfiltern kann.
z.B. eine Wrapperklasse mit einer Hashmap wo du beim Einfügen jedes Elementes der Listen 1 und 2 folgendes tust:
- Prüfe ob Key mit dem zu speichernden Element in Hashmap bereits vorhanden (konstante Zeit mit containsKey)
- Wenn nein -> Füge (Wert, 1) hinzu (konstante Zeit da put O(1); wenn ja -> Erhöhe x in (Wert, x) um 1 (konstante Zeit da get O(1))
- Nun kannst du über eine Methode getDuplicate() einfach alle HashMap Keys mit Value > 1 zurückgeben (O(n+m))
Damit hast du insgesamt für den Aufbau der Liste + das Finden der doppelten Elemente eine worst case Laufzeit von O(2(n+m)).
Hier musst du aber beachten, dass Liste 1 und Liste 2 selber keine doppelten Einträge beinhalten dürfen.
Die Listen zu sortieren wäre nicht gut, da dies einen O(n log n)-Aufwand erfordern würde. Stattdessen hier die O(n)-Lösung: Speichere alle Worte aus Liste 1 in eine Hashtabelle und suche in dieser die Worte aus der Liste 2. Fertig!
Muß man die Hashwerte dann nicht trotzdem sortieren, um effizient in ihnen suchen zu können?
Nein, der Witz bei einer Hashtabelle ist ja, dass sie aus unsortierten Daten erstellt werden kann und unsortiert im Speicher herumliegt, trotzdem aber jedes Datum mit O(1) Aufwand gefunden werden kann.
In welcher Form liegen die Daten vor?
Nein, Excel wäre doch mit ein paar Millionen einträgen Überfordert. Für solche Zwecke nutzt man vernünftige Lösungen. Ich würde es in Java lösen.