LinkedList Fragen

Status
Nicht offen für weitere Antworten.

ChaosE

Mitglied
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
 

Wildcard

Top Contributor
-Die Liste zählt die size mit
-Du kannst auch einfach die remove Methode des Iterators benutzen :wink:
-Wenn du einen ListIterator nimmst, kannst du die Position angeben an der dieser beginnen soll
 

ChaosE

Mitglied
Wildcard hat gesagt.:
-Die Liste zählt die size mit

Ah, gut !

Wildcard hat gesagt.:
-Du kannst auch einfach die remove Methode des Iterators benutzen :wink:

Okay, aber was ist dann mit den anderen Iteratoren? Nehmen wir an, ich möchte alle geometrischen Nachbarn eines Objekts löschen (obj.delNeighbours()), die sich alle auch selbst aus der "globalen" Liste austragen. Sind nach dem ersten Löschen nicht alle anderen Iteratoren ungültig? Wie gesagt, jedes Objekt soll einen Iterator auf sich selbst in der Liste mitschleifen, der nur zum Löschen des Objektes selbst verwendet wird.

Wildcard hat gesagt.:
-Wenn du einen ListIterator nimmst, kannst du die Position angeben an der dieser beginnen soll

Jo, hab ich gesehen. Aber ist das dann nicht wirklich O(n)? Die Methode fängt doch bestimmt von vorne an und hört bei der Position auf, würde ich vermuten.

Vielen Dank soweit;
ChaosE
 

Wildcard

Top Contributor
ChaosE hat gesagt.:
Okay, aber was ist dann mit den anderen Iteratoren? Nehmen wir an, ich möchte alle geometrischen Nachbarn eines Objekts löschen (obj.delNeighbours()), die sich alle auch selbst aus der "globalen" Liste austragen. Sind nach dem ersten Löschen nicht alle anderen Iteratoren ungültig? Wie gesagt, jedes Objekt soll einen Iterator auf sich selbst in der Liste mitschleifen, der nur zum Löschen des Objektes selbst verwendet wird.
Das ist korrekt. Aber mit Iteratoren mitschleifen ist so eine Sache, da diese normal on-demand erzeugt werden.
Wenn du sie in Reserve haben willst, dann müsstest du sie ja bei jeder Listenoperation neu erzeugen :shock:

ChaosE hat gesagt.:
Jo, hab ich gesehen. Aber ist das dann nicht wirklich O(n)? Die Methode fängt doch bestimmt von vorne an und hört bei der Position auf, würde ich vermuten.
Ohne mir die Implementierung angesehen zu haben würde ich das auch vermuten.
 

ChaosE

Mitglied
Wildcard hat gesagt.:
Das ist korrekt. Aber mit Iteratoren mitschleifen ist so eine Sache, da diese normal on-demand erzeugt werden.
Wenn du sie in Reserve haben willst, dann müsstest du sie ja bei jeder Listenoperation neu erzeugen :shock:

Jain. Ich vermute, das das bei der LinkedList Implementation für Java so ist wie Du es beschreibst. Bei einer "echten" verketten Liste muss das nicht unbedingt so sein.

Okay, etwas weiter ausholen: Eine doppelt Verkettete Listenimplementation hat ja normalerweise eine Unterklasse LinkedListElement, letztere besteht in der Regel aus drei Referenzen (in anderen Programmiersprachen auch Zeigern, ich weiss in Java ein böses Wort). Eine auf das vorherige, eine auf das nachfolgende Listenelement und einen auf das Element das in der Liste verwaltet wird selbst:

Code:
Class ListElement {
  public ListElement prev;
  public ListElement next;
  public Object obj;
}

Die eigentliche Liste selbst enthält dann meist einen Zeiger auf das erste, eventuell auf das letzte ListElement und zählt (je nach Anwendungsfall) noch die Anzahl der ListElemente mit.

Wenn ich jetzt eine Liste von meinen komplexen Elementen anlege, kann jedes Objekt eine Referenz auf das ListElement enthalten, in der es in der globalen Objektliste abgelegt ist.

Code:
Class MyObject {
  public Vector3d[] huge_data;
  public ListElement my_place;
}

Soll das Objekt dann später gerlöscht werden, kann es sich selbst in konstanter Zeit aus dieser Liste austragen, ohne sich selbst suchen zu müssen (Laufzeit = teuer) oder das eine der anderen Referenzen ungültig wird, d.h. die Iteratoren müssen nicht neu erzeugt werden sondern bleiben weiterhin gültig. Man muss ein bisserl aufpassen was man tut, dafür ist es extrem effizient bei veränderungsintensiven Datenstrukturen wo oft gelöscht und eingefügt werden muss. Wie heisst es so schön: "Der Iterator wird Dir die dunkle Seite der Macht zeigen!" Oder so ähnlich :)

Ich vermute aber inzwischen ganz stark, dass letzteres mit der LinkedList Implementation von Java nicht funktioniert, so dass ich wohl oder übel meine eigene Listenklasse schreiben muss. Würde mich aber gerne vom Gegenteil überzeugen lassen da ich eigentlich schon ganz gerne Standard-Klassen benutze.

MfG;
ChaosE
 

Wildcard

Top Contributor
Nein, du musst LinkedList in jedem Fall erweitern, anders geht's nicht.
Überhaupt, wenn du dir nicht wirklich sicher bist das du jedes KB Speicher brauchst, dann bist du mit dem HashSet IMO besser aufgehoben.
Spätestens bei Threads wirst du mit dieser Datenstrucktur nämlcih richtig Spaß haben, ausserdem erfordert es, dass die verwalteten Objekte in etwas eingreifen was nur die Liste etwas angeht und ist schon aus diesem Gesichtspunkt IMO unsauber.
 

ChaosE

Mitglied
Leider brauche ich jedes KByte ... alleine die Rohdaten die ich zur Laufzeit im Speicher halten muss sind schon gerne mal 800-1000MB gross - und auf denen fangen die Algorithmen dann erst zu arbeiten an und erzeugen natürlich neuen Overhead. Den klein halten ist eine der Herausforderungen, wo ich mir am Anfang nicht sicher war ob man das in Java hinbekommt. Scheint aber zu klappen, obwohl man manchmal etwas Mühe hat.

Das Hautprogramm enthält in der Tat mehrere Threads, allerdings sehe ich da - saubere Programmierung vorausgesetzt - keine Probleme.

MfG;
ChaosE
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Laufzeit LinkedList Allgemeine Java-Themen 9
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
M Delete bei sortierter LinkedList Allgemeine Java-Themen 5
M ArrayList oder LinkedList Allgemeine Java-Themen 10
M verbesserte Laufzeit bei LinkedList Allgemeine Java-Themen 7
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
S LinkedList Error Allgemeine Java-Themen 4
T Menge an Elementen aus einer LinkedList Allgemeine Java-Themen 6
L Java Slick2D stürzt ab- Zu viel auf einmal? (LinkedList) Allgemeine Java-Themen 7
F LinkedList Allgemeine Java-Themen 3
S Wertepaar in LinkedList/PriorityQueue speichern Allgemeine Java-Themen 3
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
H LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ? Allgemeine Java-Themen 9
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
B Datentypen JMF: Player LinkedList sinnvoll? ca 30 kurze Sounddateien Allgemeine Java-Themen 3
C LinkedList und ArrayList in HashMap Allgemeine Java-Themen 4
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
C Wie kann ich ein LinkedList verbinden ? Allgemeine Java-Themen 4
R Intervall-Implementierung mit selbstgebauter LinkedList Allgemeine Java-Themen 7
A LinkedList Auslesen und Objekt Löschen Allgemeine Java-Themen 4
nabla LinkedList removeRange ineffizient? Allgemeine Java-Themen 4
G extend LinkedList für Matrosenkiller ;-) Allgemeine Java-Themen 9
R ArrayList, LinkedList oder Set Allgemeine Java-Themen 9
Daniel_L LinkedList vom Typ Object-Array? Allgemeine Java-Themen 4
T Problem mit LinkedList Allgemeine Java-Themen 2
D indexOutOfBoundsException bei LinkedList Allgemeine Java-Themen 10
T zirkuläre LinkedList Allgemeine Java-Themen 8
Caracasa [Threads] Gleichzeitiger Zugriff auf eine LinkedList Allgemeine Java-Themen 9
D LinkedList anhand einer long-Variable der Objekte sortieren Allgemeine Java-Themen 5
N ArrayList oder LinkedList? Allgemeine Java-Themen 15
M Rekursive Ausgabe einer linkedList Allgemeine Java-Themen 8
J LinkedList und Assoziaziotenen Allgemeine Java-Themen 8
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
H Daten aus LinkedList ausgeben ! Allgemeine Java-Themen 9
H [LinkedList] Sortieren durch MergeSort Allgemeine Java-Themen 3
S Probleme mit LinkedList und Label mit gridbagLayout Allgemeine Java-Themen 2
M IOException bei save und load in LinkedList Allgemeine Java-Themen 4
N Objekte in LinkedList "umsortieren" Allgemeine Java-Themen 4
C LinkedList Exception abfangen Allgemeine Java-Themen 8
Z LinkedList speichern Allgemeine Java-Themen 2
N Element aus LinkedList löschen Allgemeine Java-Themen 2
Z löschen aus Linkedlist Allgemeine Java-Themen 12
G LinkedList sortieren Allgemeine Java-Themen 3
C Collection, LinkedList, Elemente Allgemeine Java-Themen 4
Zrebna Fragen zu Testabdeckungs-Metriken Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
K BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren) Allgemeine Java-Themen 141
V Ich hätte 2 Fragen Allgemeine Java-Themen 5
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
H Fragen zur Kraken Api Allgemeine Java-Themen 1
nonickatall Klassen Grundsätzliche Fragen zu geplanter Programmstruktur Allgemeine Java-Themen 5
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
T Fragen bezgl. Lambdas Allgemeine Java-Themen 20
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
A Neuerungen in Java 8 StreamAPI- Paar fragen Allgemeine Java-Themen 4
temi Fragen zur Software-Architektur Allgemeine Java-Themen 123
M Diverse Design-Fragen Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
D Grundsätzliche Fragen zum Heap Space Allgemeine Java-Themen 12
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
2 2 Klein Fragen Allgemeine Java-Themen 7
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
A Java Theorie-Fragen Allgemeine Java-Themen 7
K Java QUIZ-Spiel Fragen und Antworten generieren?! Allgemeine Java-Themen 5
R Socket Fragen zu UDP Allgemeine Java-Themen 1
B Noob-Fragen zu Tablets und PC kompatiblität... Allgemeine Java-Themen 6
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
D Fragen zum erstellen einer ausführbaren Jar Datei Allgemeine Java-Themen 3
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
F Akkumulator Hough-Transformation offene Fragen Allgemeine Java-Themen 4
Luk10 Fragen zu Naming-Conventions Allgemeine Java-Themen 5
Z Einige Fragen Allgemeine Java-Themen 10
T OOP Einige Fragen zu UML-Klassendiagrammen Allgemeine Java-Themen 6
G Einige Fragen zu ResourceBundles Allgemeine Java-Themen 2
S Fragen zu verschiedenen Themen vom JCreator Allgemeine Java-Themen 2
DStrohma Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes Allgemeine Java-Themen 8
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben