Ist es möglich, Duplikate in weniger als O (n) Zeit aus einer sortierten Liste zu entfernen?

8

Ich vermute, dass es einen Weg gibt, wenn Sie speichern können, indem Sie das andere Ende eines Bereichs von wiederholten Werten schneller finden als durch das Durchlaufen dieser Unterliste

    
Nick Orton 10.11.2010, 21:50
quelle

4 Antworten

12

Im Allgemeinen, nein. Stellen Sie sich eine Liste mit N Duplikaten vor. Sie müssten N-1 Entfernungen machen, also O (N).

Wenn Sie eine bestimmte Datenstruktur mit besser als O (1) Entfernung von Elementen angeben, gibt es möglicherweise einen besseren Weg für bestimmte Arten von Eingaben.

Auch wenn Sie eine Reihe von Elementen in O (1) effizient entfernen können, und es dauert O (1) Zeit, um ein Duplikat zu finden - stellen Sie sich eine Liste vor, wo es N / 2 Duplikatpaare gibt. Sie müssen immer noch N / 2 Suchen durchführen und N / 2 Bereiche entfernen, die beide O (N) sind.

(Es gibt auch ein bisschen Zweideutigkeit, da der Titel der Frage "Duplikate entfernen" ist, aber der Körper ist spezifisch für das Entfernen eines Bereichs)

Wenn die Liste, die sich aus Ihrer Sortierung ergibt, die folgende Repräsentation hat - jeder Knoten hat einen Wert und eine Anzahl von Auftritten dafür, dann wird die Entfernung der Duplikate für einen Wert die Anzahl für diesen Knoten trivialisch auf 1 setzen. (Eine Überspringungsliste hat wahrscheinlich ähnliche Eigenschaften, vorausgesetzt, es gibt eine annehmbare Umgebung, in der Müll gesammelt wird, in der keine Kosten für die Wiederherstellung von Speicher anfallen.) wäre O (1) für eine Verdopplung. Wenn Sie alle Duplikate aus der Liste entfernen müssen, wäre es immer noch O (N).

    
Pete Kirkham 10.11.2010, 21:57
quelle
3

Im Allgemeinen gibt es das nicht, weil Sie immer einen Fall konstruieren können, in dem Sie O (n) haben (eine Liste ohne Duplikate). Wenn Sie jedoch anfangen, Annahmen über die Daten zu treffen (zum Beispiel, dass es höchstens logarithmische Elemente gibt), erhalten Sie möglicherweise etwas Besseres (ich bin mir in diesem Fall allerdings nicht sicher).

Dies setzt natürlich voraus, dass Sie eine Möglichkeit haben, effiziente "Massenentfernungen" durchzuführen, was bedeutet, dass Sie jeden Bereich gleicher Elemente in O (1) unabhängig von seiner Größe entfernen können.

    
Björn Pollex 10.11.2010 22:04
quelle
1

Es kann nicht sein

wie für den Vergleich aller Elemente mit dem anderen müssen wir tun n * (n-1) = n2-n Vergleiche ... '

    
Genius 11.11.2010 11:15
quelle
-2

Ich würde für eine binäre Suche gehen, um die Enden der Bereiche zu finden:

Nehmen wir an, wir haben eine sortierte Liste von n Elementen.

  1. Vergleichen Sie das erste und n-te Element - wenn die ganze Liste ein Duplikat ist.
  2. Wählen Sie ein mittleres Element (n / 2)
  3. Suche rekursiv für zwei Unterlisten ausführen.
Jakub Konecki 10.11.2010 21:57
quelle