Wie die Umsetzung einer Reihe?
Will ich implementieren eine Reihe in C.
Ist es OK, um eine verknüpfte Liste, wenn Sie erstellen den SATZ, oder sollte ich einen anderen Ansatz ?
Wie Sie in der Regel schreiben Sie Ihre eigenen festgelegt (wenn nötig).
HINWEIS:
Wenn ich die Verlinkte Liste, Ansatz, ich werde wahrscheinlich haben die folgenden Schwierigkeiten für meine Operationen:
- init : O(1);
- zerstören: O(n);
- insert: O(n);
- entfernen: O(n);
- union: O(n*m);
- Kreuzung: O(n*m);
- Unterschied: O(n*m);
- ismember: O(n);
- issubset: O(n*m);
- setisequal: O(n*m);
O(n*m) scheint ein wenig zu groß, vor allem für große Daten... gibt es eine Möglichkeit zu implementieren, in meinem Set mehr effizient ?
- Mit aus zu wissen, was Sie wollen zu erreichen, ist es schwer zu helfen. Wenn Sie nur wollen, um eine array-Struktur dann ein Vektor ist wahrscheinlich Ihren Weg zu gehen. Ich habe angenommen, dass du tatsächlich mit C++. Die STL hat jede Menge Zeug, das gebunden ist, um Ihnen zu helfen.
- C++ implementiert seiner Klasse als ein ausgeglichener binärer Baum - das ist wohl eine gute Wahl.
- Als seine Frage war tagged as C, ich denke, wir können davon ausgehen, dass er nicht mit C++.
- Ich bin nicht mit C++, sondern C. ich habe bereits geschrieben eine generische verkettete Listen in C. Zunächst wollte ich wiederverwenden meine Link-Liste-code, so dass ich cam durchzuführen. Ich wollte wissen, ob was ist der Strategie erstellen Sie eine Daten - Struktur von Schrott. Ich bin nicht daran interessiert, die Wiederverwendung von ausländischen Bibliotheken, gerade (meine eigene) C-code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich Rot-Schwarz-Bäume in der Vergangenheit zu bauen setzt.
Hier sind die Zeit-Komplexität aus dem Wikipedia-Artikel.
Platz O(n)
Suche in O(log n)
Insert O(log n)
Löschen in O(log n)
Sets sind in der Regel entweder als rot-schwarz-Bäume (erfordert die Elemente haben eine Gesamt-Bestellwert), oder als automatisch-Anpassung Hash-Tabelle (das erfordert eine hash-Funktion).
Letzteres ist in der Regel umgesetzt, indem der Hash-Tabelle auf doppelte Größe und Wiedereinsetzen alle Elemente an, wenn eine bestimmte Kapazitätsgrenze (75% gut funktioniert) überschritten wird. Dies bedeutet, dass inidividual insert-Operationen O(n), aber wenn, amortisiert über viele Vorgänge, es ist eigentlich O(1).
std::set
wird oft implementiert als rot-schwarz-Baum: http://en.wikipedia.org/wiki/Red-black_treeDieser Ansatz wird Ihnen viel besser Komplexität auf allen aufgelisteten Operationen.
Gibt es viele Möglichkeiten für die Umsetzung festgelegt. Hier sind einige von Ihnen. Neben MSDN habe sehr gute Artikel über Sie.
Da Sie bereits eine verkettete Liste implementiert, die einfachste ist ein skip-Liste. Wenn Sie verwenden möchten, ausgewogene Bäume, die einfachste meiner Meinung nach ist ein treap. Dies sind randomisierte Datenstrukturen, aber im Allgemeinen sind Sie genauso effizient wie Ihre deterministischen Pendants, wenn nicht mehr (und eine skip-Liste gemacht werden können, deterministisch).