Hallo,
beim Programmieren bin ich auf zwei Fragen zur LinkedList Klasse gestossen, auf die weder SUN Doku noch google keine Antwort parat hatten. Aber immerhin bin ich so auf diese Forum aufmerksam geworden Zu meinem Hintergrund: Ich bin von Haus aus eher C++ Programmierer (gewesen, zur Zeit mache ich mehr mit Java) mit mathematisch/informatischem Background (Studium abgeschlossen).
Frage #1:
LinkedList benutzt als Modell eine doppelt verkettele Liste. Wenn ich die Größe einer Liste mit mylist.size() abfrage - hat das O(n) oder O(1), sprich zählt die Liste die ganze Zeit mit oder nicht? Beide Implementationen sind üblich, je nachdem ob man entweder split() oder size() in konstanter Zeit haben möchte. Die STL Implementation von C++ wählt die erste Variante, sprich size() Aufrufe sind teuer. Wo finde ich solche Infos für die Java Collections, gibt es da technisch tiefergehende Bücher oder Onlinedoku?
Frage #2:
Gibt es eine zyklische LinkedList Variante?
Frage #3:
Die ist etwas komplizierter und hat mit den Failsafe ListIteratoren und dem leidigen "verändern während des Iterierens" Thema zu tun, was hier schon das eine oder andere mal diskutiert wurde (ja, ich weiss wie man sucht ). Mein Problem ist das folgende: Ich re-implementiere gerade eine 3D C++ Datenstruktur in Java. Diese besteht - grob vereinfach - aus einer doppelt verketten Liste. Die Elemente der Liste sind etwas komplexere Objekte, die sich sowohl zum Teil gegenseitig referenzieren, als auch - jetzt kommts - die eigene Position (Iterator) in der Liste kennen sollen. Hintergrund ist, dass das Löschen eines Objektes in O(1) gehen soll, ohne das Objekt in der Liste suchen zu müssen. Vorteil einer doppelt verketten Liste ist ja (normalerweise) auch, dass zum Löschen eines Listenelements in konstanter Zeit zwei Zeilen Code ausreichen (previous.next = this.next; next.previous = this.previous.
Soweit so gut - aber selbst wenn ich es hinbekommen sollte den ListIterator für jedes Objekt im Objekt selber abzuspeichern (leider scheint es keinen LinkedList Methode zu geben, welche mir einen Iterator auf das letzte Element liefert), werden die ja alle ungültig sobald ich auch nur eines davon lösche. Eine andere Datenstruktur (Hashtable) kommt aus Effizienzgründen nicht in Frage, die Objekte sind gross und es sind sehr viele, so dass ich selbst bei 2GB Hauptspeicher schnell an Grenzen komme wenn ich nicht sauber progammiere.
Meine bisherige Überlegung geht daher in die Richtung meine eigene MyLinkedList Klasse zu entwerfen, die alle genannten Bedingungen erfüllt (zyklisch, konstanter Zugriff auf die size() und non-Failsafe Iteratoren). Gibt es eine bessere Lösung?
So, ich hoffe ich habe die Fragen präzise genug formuliert.
MfG;
ChaosE
beim Programmieren bin ich auf zwei Fragen zur LinkedList Klasse gestossen, auf die weder SUN Doku noch google keine Antwort parat hatten. Aber immerhin bin ich so auf diese Forum aufmerksam geworden Zu meinem Hintergrund: Ich bin von Haus aus eher C++ Programmierer (gewesen, zur Zeit mache ich mehr mit Java) mit mathematisch/informatischem Background (Studium abgeschlossen).
Frage #1:
LinkedList benutzt als Modell eine doppelt verkettele Liste. Wenn ich die Größe einer Liste mit mylist.size() abfrage - hat das O(n) oder O(1), sprich zählt die Liste die ganze Zeit mit oder nicht? Beide Implementationen sind üblich, je nachdem ob man entweder split() oder size() in konstanter Zeit haben möchte. Die STL Implementation von C++ wählt die erste Variante, sprich size() Aufrufe sind teuer. Wo finde ich solche Infos für die Java Collections, gibt es da technisch tiefergehende Bücher oder Onlinedoku?
Frage #2:
Gibt es eine zyklische LinkedList Variante?
Frage #3:
Die ist etwas komplizierter und hat mit den Failsafe ListIteratoren und dem leidigen "verändern während des Iterierens" Thema zu tun, was hier schon das eine oder andere mal diskutiert wurde (ja, ich weiss wie man sucht ). Mein Problem ist das folgende: Ich re-implementiere gerade eine 3D C++ Datenstruktur in Java. Diese besteht - grob vereinfach - aus einer doppelt verketten Liste. Die Elemente der Liste sind etwas komplexere Objekte, die sich sowohl zum Teil gegenseitig referenzieren, als auch - jetzt kommts - die eigene Position (Iterator) in der Liste kennen sollen. Hintergrund ist, dass das Löschen eines Objektes in O(1) gehen soll, ohne das Objekt in der Liste suchen zu müssen. Vorteil einer doppelt verketten Liste ist ja (normalerweise) auch, dass zum Löschen eines Listenelements in konstanter Zeit zwei Zeilen Code ausreichen (previous.next = this.next; next.previous = this.previous.
Soweit so gut - aber selbst wenn ich es hinbekommen sollte den ListIterator für jedes Objekt im Objekt selber abzuspeichern (leider scheint es keinen LinkedList Methode zu geben, welche mir einen Iterator auf das letzte Element liefert), werden die ja alle ungültig sobald ich auch nur eines davon lösche. Eine andere Datenstruktur (Hashtable) kommt aus Effizienzgründen nicht in Frage, die Objekte sind gross und es sind sehr viele, so dass ich selbst bei 2GB Hauptspeicher schnell an Grenzen komme wenn ich nicht sauber progammiere.
Meine bisherige Überlegung geht daher in die Richtung meine eigene MyLinkedList Klasse zu entwerfen, die alle genannten Bedingungen erfüllt (zyklisch, konstanter Zugriff auf die size() und non-Failsafe Iteratoren). Gibt es eine bessere Lösung?
So, ich hoffe ich habe die Fragen präzise genug formuliert.
MfG;
ChaosE