Schnellste Methode für Liste ohne Duplikate

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Hallo zusammen,

Ich habe eine Frage, was ist die schnellste Methode um eine Liste ohne Duplikate zu erstellen? Angenommen ich will eine Liste mit 100 verschiedenen Wörtern haben, ist es dann besser zuerst möglichst viele Wörter zu generieren und dann die Liste Filtern oder soll ich bei jedem generierten Wort nachschauen, ob das Wort schon in der Liste steht? Und bei der letzteren Variante,wie kann man das möglichst effizient lösen? Gibt es da einen schnelleren Weg als bei jedem neuen String zuerst alle in der Liste vorhandenen Strings zu überprüfen, ob der selbe String schon vorhanden ist oder nicht?

Vom Aufwand wäre das O(n!) oder nicht? Gibt es da eine schnellere Möglichkeit als String zu vergleichen?
Benutzeravatar
snafu
User
Beiträge: 6847
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nutze ``set(deine_woerter)``. Dies erzeugt ein Set-Objekt (auf deutsch: Menge), welches definitionsgemäß keine mehrfach vorkommenden Elemente enthält. ``woerter`` kann hier z.B. eine Liste sein oder mittels Generator erzeugt werden. Letzteres ist sowohl effizienter als auch speicherfreundlicher im Gegensatz zu dem Zwischenschritt über eine Liste.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DKKA hat geschrieben:Ich habe eine Frage, was ist die schnellste Methode um eine Liste ohne Duplikate zu erstellen?
Ein Set ist eine recht praktische Datenstruktur.

Code: Alles auswählen

>>> data = ['Monty', 'Eric', 'John', 'Monty']
>>> print(set(data))
{'John', 'Eric', 'Monty'}
>>> print(list(set(data)))
['John', 'Eric', 'Monty']
Benutzeravatar
snafu
User
Beiträge: 6847
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DKKA hat geschrieben:Vom Aufwand wäre das O(n!) oder nicht? Gibt es da eine schnellere Möglichkeit als String zu vergleichen?
Die von dir beschriebene Vorgehensweise schon. Bei einem Set weden hingegen Hashwerte erzeugt und da ist das Hinzufügen eines Elements O(1). Für n Elemente also O(n).
BlackJack

@DKKA: Jedes Wort in einer Liste von Worten zu prüfen wäre O(n²) Laufzeit. Verwende statt einer Liste ein `set`. Falls es auf die Reihenfolge ankommt, dann muss man beides verwenden, eine Liste für das Ergebnis und ein `set` um sich zu merken was man schon gesehen hat.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DKKA hat geschrieben: Vom Aufwand wäre das O(n!) oder nicht? Gibt es da eine schnellere Möglichkeit als String zu vergleichen?
Nur der Vollständigkeit halber: Nein! Die Komplexität ist dabei ja direkt abhängig von der Erzeugungsfunktion; und je nach Güte der "Duplikatfreiheit" kann diese durchaus auch unendlich sein...

Auch wenn Deine Zielstruktur (m) begrenzt ist (bei Dir ja maximal 100 Wörter) und Du die Anzahl an Durchläufen (n) nicht kennst, so kannst Du imho nur O(n * m) als Komplexität annehmen. Für jedes neue Wort aus "n" musst Du ja schlimmstenfalls "m" Mal die Zielliste abgleichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

snafu hat geschrieben:
DKKA hat geschrieben:Vom Aufwand wäre das O(n!) oder nicht? Gibt es da eine schnellere Möglichkeit als String zu vergleichen?
Die von dir beschriebene Vorgehensweise schon. Bei einem Set weden hingegen Hashwerte erzeugt und da ist das Hinzufügen eines Elements O(1). Für n Elemente also O(n).
Vielen Dank für alle Antworten. Wie funktioniert den intern das mit dem Set? Wenn ich ein Element einem Set hinzufüge, ist da dann ein Heap oder AVL-Tree etc. drunter der das ganze überprüft, weil jeden existierenden Hashwert zu überprüfen wäre doch gleich schnell wie das String vergleichen...?

EDIT: Da hab ich die Antwort von Hyperion noch nicht gesehen.
BlackJack

@DKKA: Ein `set` verwendet intern eine Hash-Tabelle.
Benutzeravatar
snafu
User
Beiträge: 6847
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Erklärung zur Funktionsweise einer Hash-Tabelle: http://de.wikipedia.org/wiki/Hashtabell ... lgorithmus
Antworten