Zwei listen vergleichen?

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)
Woher ich das weiß:Studium / Ausbildung
milos2  27.04.2019, 19:46

Ich hoffe du arbeitest nicht mit Arrays sondern verketteten Listen.

0

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 😃

milos2  27.04.2019, 19:48

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.

0
safur  27.04.2019, 19:51
@milos2

Er hat nicht von Millionen gesprochen 😉

0

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:

  1. Prüfe ob Key mit dem zu speichernden Element in Hashmap bereits vorhanden (konstante Zeit mit containsKey)
  2. 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))
  3. 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.

Woher ich das weiß:Studium / Ausbildung – Promoviert

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!

Woher ich das weiß:Studium / Ausbildung
gwf79  27.04.2019, 19:59

Muß man die Hashwerte dann nicht trotzdem sortieren, um effizient in ihnen suchen zu können?

0
Einstein0815  27.04.2019, 20:04
@gwf79

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.

0

In welcher Form liegen die Daten vor?