2009-09-13 6 views
7

Ich brauche eine IntervalTree oder Bereichsbaum Implementierung in Java und Mühe habe einen zu finden, mit der Streichung Unterstützung arbeiten.IntervalTree DeleteNode Java Implementation

Es gibt eine eingebaute in einem an sun.jvm.hotspot.utilities.IntervalTree, aber die deleteNode Methode in den RBTree Super heißt es:

/** 
* FIXME: this does not work properly yet for augmented red-black 
* trees since it doesn't update nodes. Need to figure out exactly 
* from which points we need to propagate updates upwards. 
*/ 

Der Versuch, Knoten zu löschen von einem Baum, um die Ausnahme zu werfen endet:

Knotens max Endpunkt wurde nicht aktualisiert richtig

Wie schwierig wäre es zu pr implementieren Sie delete Funktionalität in einer Unterklasse der sun.jvm.hotspot.utilities.IntervalTree? Oder gibt es eine andere Interval Tree-Implementierung, die dies bereits korrekt implementiert?

Zur Zeit bin ich nur den Baum auszulöschen und wieder bevölkern es jedes Mal, wenn es eine Deletion, die bei weitem nicht ideal ist (Anmerkung: Einstellung DEBUGGEN = false in der RBTree Dinge beschleunigt enorm).

Antwort

5

endete ich die sun.jvm.hotspot.utilities.IntervalTree Modifikation auf einen Satz von gelöschten Knoten zu halten. Bei einer Suche schließe ich alle Elemente in diesem Set aus. Nicht ideal, aber das war viel einfacher als das "echte" Löschen funktioniert. Sobald der gelöschte Satz zu groß wird, baue ich den Baum neu auf.

1

This project hat eine Implementierung Bereichsbaum, die für Sie von größerem Nutzen sein könnte. Die Sonnenpakete könnten für eine schnelle und dreckige Nutzung in Ordnung sein, aber ich würde nicht empfehlen, etwas Wichtiges aufzubauen, wenn man sich darauf verlässt. Sun kann sie nicht stabil halten.

+0

Danke für den Link, Yishai. Ich schaue auf die Dokumente http://olduvai.sourceforge.net/tj/tj-javadoc-public/TreeJuxtaposer/RangeTree.html und sehe keine Möglichkeit, eine Liste von Knoten für einen Bereich zu erhalten, oder ändern Sie die Baum einmal erstellt. Es sieht auch so aus, als ob es ein Abhängigkeitsleck auf dem GUI-Projekt gibt, mit dem sie es verwenden. Meine Vermutung ist, dass dies sehr spezifisch für die Bedürfnisse dieses Projekts ist und kein allgemein verwendbarer RangeTree. Hast du diese Implementierung benutzt? –

+0

@Sam, nein ich habe es nicht benutzt. Es war nur die Alternative, die ich finden konnte. Da es sich um Open Source handelt, bietet es Ihnen möglicherweise eine bessere Basis als die Sun-Implementierung. – Yishai

0

Ich kenne Ihre genauen Anforderungen nicht, aber ein nicht statischer Segmentbaum könnte für Sie arbeiten. Wenn ja, werfen Sie einen Blick auf Layout Management SW, speziell die SegmentTree package. Es hat die Remove-Funktion, die Sie benötigen.

Wenn Sie sich entscheiden, Ihre eigenen zu rollen, kann ich vorschlagen, Open Sourcing es? Ich bin überrascht, dass es noch keinen offenen und einfachen Interval Tree gibt.

0

Ich habe eine Open-Source-Implementierung mit Löschung gefunden, aber es bedarf einiger Anstrengungen, um sie voll funktionsfähig zu machen.

Es ist ein Modul des größeren Open-Source-Projekts Gephi, aber hier sind die sources und javadoc. Wenn Sie ein Glas möchten, können Sie die Gephi installieren, und es ist in:

/gephi/modules/org-gephi-data-attributes-api.jar 

Die Löschmethode gibt, werden alle Intervalle mit dem Eingangsintervall überlappen (statt nur den Eingang eins). Jedoch habe ich in den Quellen gefunden, dass es private Methoden gibt, die einen bestimmten Knoten entfernen (der ein Intervall speichert). Auch die privaten Suchmethoden geben Knoten zurück.

Also ich denke, mit etwas wenig Aufwand ist es möglich, den Code und haben diese Refactoring - Feature ‚bestimmten Intervall löschen‘. Der schnellste und schmutzigste Weg wäre, die privaten Methoden/Node-Klasse öffentlich zu machen. Aber da es sich um ein Open-Source-Projekt handelt, könnte es sich vielleicht in Zukunft zu einer guten Standardimplementierung des Intervallbaums entwickeln.