Frage

Ich frage mich, ob jemand hier hat jemals einen Liste überspringen. Es sieht in etwa die gleichen Vorteile wie ein ausgewogener binären Baum zu haben, aber ist einfacher zu implementieren. Wenn Sie haben, haben Sie Ihre eigenen schreiben, oder verwenden Sie eine bereits geschriebene Bibliothek (und wenn ja, was war sein Name)?

War es hilfreich?

Lösung

Vor Jahren umgesetzt ich meine eigenen für eine probabilistische Algorithmen Klasse. Ich bin eine Bibliothek Implementierungen nicht bekannt, aber es ist eine lange Zeit gewesen. Es ist ziemlich einfach zu implementieren. Soweit ich mich erinnere hatte sie ein paar wirklich nette Eigenschaften für große Datenmengen und einige der Probleme der Neuausrichtung vermieden. Ich denke, die Umsetzung ist auch einfacher als binäres versuchen im Allgemeinen. Es gibt eine schöne Diskussion und einig Beispiel-c ++ Code hier:

http://www.ddj.us/cpp/184403579?pgno=1

Es gibt auch ein Applet mit einer laufenden Demonstration. Nett 90 Java shininess hier:

http://www.geocities.com/siliconvalley/network/1854 /skiplist.html

Andere Tipps

Mein Verständnis ist, dass sie nicht so sehr eine nützliche Alternative sind Binärbäumen (zB rot-schwarze Bäume), wie sie auf B-Bäume für die Datenbanknutzung so, dass Sie die Anzahl der Stufen bis auf eine machbare Minimum zu halten und behandeln w / base-K anmeldet, anstatt Basis-2-Protokolle für die Leistungseigenschaften. Die Algorithmen zur probabilistischen Skip-Listen sind (IMHO) leichter zu bekommen Recht als die entsprechenden B-Tree-Algorithmen. Außerdem gibt es einige Literatur über schleusenfreien Sprunglisten. Ich sah sie vor ein paar Monaten bei Verwendung aber dann die Mühe aufgegeben auf der HDF5 Bibliothek.

Literatur zum Thema:

Aufsätze von Bill Pugh:

Nicht-wissenschaftliche Arbeiten / tutorials:

Eigentlich für eine meiner Projekte, ich meine eigene volle STL bin der Umsetzung. Und ich habe eine meiner std::map skiplist zu implementieren. Der Grund, warum ich mit ihm ging, ist, dass es ein einfacher Algorithmus ist, die an die Wertentwicklung eines ausgeglichenen Baumes ganz in der Nähe ist, aber viel einfache Iteration Fähigkeiten.

Auch Qt4 der QMap ein skiplist wurde auch das war die ursprüngliche Inspiration für meint es in meinem std::map verwenden.

Java 1.6 (Java SE 6) eingeführt ConcurrentSkipListSet und ConcurrentSkipListMap an den Sammlungen Rahmen. Also, ich würde vermuten, dass jemand da draußen wirklich sie verwendet wird.

Skiplists neigen weit weniger Konkurrenz für Schlösser in einer Multi-Thread-Situation, und (probabilistisch) haben Leistungsmerkmale ähnlich wie Bäume.

bieten

Siehe des ursprünglichen Papier [pdf] von William Pugh.

implementiert ich eine Variante, die ich vor ein paar Jahren eine Reverse SKIP Liste für eine Regel-Engine bezeichnet. Viel die gleiche, aber die Referenz Links rückwärts, vom letzten Elemente ausgeführt werden.

Das ist, weil es schneller zum Einfügen sortierten Elemente war, die am ehesten auf dem Back-End der Sammlung waren.

Es wurde in C # geschrieben und nahm ein paar Iterationen erfolgreich arbeiten zu erhalten.

Weiter Listen sind einfach zu implementieren. Aber die Zeiger auf einer Sprungliste im Fall des Einsetzens Einstellen und Löschen müssen Sie vorsichtig sein. Haben Sie nicht diese in einem realen Programm verwendet, aber haben einige Runtime-Profilierung doen. Überspringen Listen unterscheiden sich von Suchbäume. Die Ähnlichkeit ist, dass es durchschnittlich log (n) für einen Zeitraum von Wörterbuch-Operationen ebenso wie die gespreizten Baum gibt. Es ist besser als ein unausgewogener Suchbaum ist aber nicht besser als ein ausgeglichener Baum.

Jede Liste Knoten überspringen hat Vorwärtszeiger, der die strom-> next () Verbindungen zu den verschiedenen Ebenen der Sprungliste darstellen. Typischerweise wird dieser Pegel bei einem Maximum von ln (N) begrenzt. Also, wenn N 1 Million = der Pegel 13: Es wird so viel Zeiger sein und in Java bedeutet dies die Anzahl der Zeiger twie für Referenzdatentypen implementieren. wo, wie ein ausgeglichener Suchbaum hat weniger und es gibt gleiche Laufzeit !!.

skiplist Vs Splay Baum Vs Hash Was Wörterbuch Profil aufblicken ops eine Sperre gestrippt hashtable wird in unter 0,010 ms Ergebnis geben, wo, wie ein Spreizfuß Baum gibt ~ 1 ms und skip-Liste ~ 720ms.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top