Wie implementiert man ein Set?

7

Ich möchte ein Set in C implementieren. Ist es in Ordnung, eine verknüpfte Liste zu verwenden, wenn Sie das SET erstellen, oder sollte ich einen anderen Ansatz verwenden?

Wie implementieren Sie normalerweise Ihren eigenen Satz (falls erforderlich).

HINWEIS: Wenn ich den Linked-List-Ansatz verwende, werde ich wahrscheinlich die folgenden Komplexitäten für Set my operations haben:

  • init: O (1);
  • zerstören: O (n);
  • einfügen: O (n);
  • entfernen: O (n);
  • Vereinigung: O (n * m);
  • Schnittpunkt: O (n * m);
  • Unterschied: O (n * m);
  • ismember: O (n);
  • issubset: O (n * m);
  • setisequal: O (n * m);

O (n * m) scheint vor allem bei großen Datenmengen etwas zu groß zu sein ... Gibt es eine Möglichkeit, mein Set effizienter zu implementieren?

    
Andrei Ciobanu 29.03.2010, 12:08
quelle

5 Antworten

4

Ich habe in der Vergangenheit rot-schwarze Bäume benutzt, um Sets zu bauen.

Hier sind die Zeitkomplexitäten aus dem Wikipedia-Artikel.

Raum O (n)
Suche O (log n)
Einfügen O (log n)
Lösche O (log n)

    
Seth M. 29.03.2010, 12:18
quelle
8

Mengen werden normalerweise entweder als rot-schwarze Bäume implementiert (die erfordern, dass die Elemente eine Gesamtreihenfolge haben) oder als automatisch skalierende Hashtabelle (die eine Hash-Funktion erfordert).

Letzteres wird normalerweise implementiert, indem die Größe der Hashtabelle verdoppelt wird und alle Elemente erneut eingefügt werden, wenn ein bestimmter Kapazitätsschwellenwert (75% funktioniert) überschritten wird. Dies bedeutet, dass einzelne Einfügeoperationen O (n) sein können, aber wenn sie über viele Operationen hinweg amortisiert sind, ist es tatsächlich O (1).

    
Michael Borgwardt 29.03.2010 12:25
quelle
5

std::set wird oft als rot-schwarzer Baum implementiert: Ссылка

Dieser Ansatz wird Ihnen eine viel bessere Komplexität bei allen aufgeführten Operationen geben.

    
Andreas Brinck 29.03.2010 12:11
quelle
3

Es gibt viele Möglichkeiten, die Implementierung festzulegen. Hier sind einige von ihnen. Neben MSDN habe ich einen sehr guten Artikel darüber.

    
malay 29.03.2010 12:17
quelle
2

Da Sie bereits eine verkettete Liste implementiert haben, ist die Skip-Liste am einfachsten. Wenn Sie ausgewogene Bäume verwenden möchten, ist meiner Meinung nach ein Treap am einfachsten. Dies sind randomisierte Datenstrukturen, aber im Allgemeinen sind sie genauso effizient wie ihre deterministischen Gegenstücke, wenn nicht mehr (und eine Skip-Liste kann deterministisch gemacht werden).

    
IVlad 29.03.2010 12:25
quelle

Tags und Links