FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Praktische Informatik

Implementierung: Liste als Array

Implementierung: Liste als Array 2007-03-27 15:04
Anonymer User
Das P3-Skript sagt, dass für die Implementierung einer Liste als Array ("sequentielle Darstellung im Array") folgendes gilt:
- keine Zeiger erforderlich: ist klar
- Umkopieren: auch klar
- Verschwenden von Speicherplatz: wieso das??
- Positionsinformation nicht stabil: ist mir auch icht ganz klar

Wär jemand so nett, mir die beiden unteren Stichpunkte etwas zu verdeutlichen? Danke schonmal!

RE: Implementierung: Liste als Array 2007-03-27 15:19
TriPhoenix
Zu 4: Angenommen dein Array heißt a. Dann ist das 7te Listenelement ja etwa a[6]. Wenn du aber jetzt an den Anfang der Liste was einfügst, liegt das Element plötzlich auf a[7], also einer anderen Speicherposition. Du kannst also dein Element nicht über dessen Speicheradresse "festhalten", sondern musst bei jedem Zugriff wieder neu suchen, weil sich die Position zwischenzeitlich geändert haben könnte; ein Problem was bei Verketteten Listen z.B. nicht existiert. Zusätzlich könnte es auch sein dass im Zuge einer Arrayvergrößerung (wenn die Liste Länger wird als das Array) eben jenes Array einfach mal an eine ganz andere Speicherstelle wandert (etwa weil an aktueller Position nicht mehr genug Platz hinter dem Array war); auch hier sind jegliche Speicherzeiger unbrauchbar.

Zu 3: Du willst aus Effizienzgründen dein Array ja sicherlich nicht bie jedem Einfügen und Entfernen von Objekten größer und kleiner machen, sondern nur Vergrößern wenn kein Platz mehr ist und entweder nie oder nur alle weile mal verkleinern. Das heißt umgekehrt dass fast immer Teile deines Arrays "leerstehen", der Speicherplatz ist also aloziiert, aber nicht benutzt. Effektiv ist der Speicher also Verschwendet.

RE: Implementierung: Liste als Array 2007-03-27 15:20
Fred
- Verschwenden von Speicherplatz: wieso das??
Verschwendeter Speicherplatz = Kapazität - Kardinalität

Wenn Du z.B. in Java eine ArrayList anlegst und ein Element reinpackst, hast Du den 9 Elemente Speicherplatz verschwendet.

- Positionsinformation nicht stabil: ist mir auch icht ganz klar
Nur mal so ins blaue hineingeraten: beim dynamischen Vergrössern (grösseres Array anlegen und Elemente vom alten Array reinkopieren) landen die Elemente ja in anderen Speicheradressen. Beim Einfügen/Löschen irgendwo in der Mitte der Liste gilt das auch für alle nachfolgende Elemente. Ist vielleicht bei der Implementierung von Iteratoren relevant?

RE: Implementierung: Liste als Array 2007-03-28 14:39
McCancey
Aber ist es nicht viel größere Speicherverschwendung, eine Liste zu benutzen, die für jedes Element mindestens eine Speicheradresse mit speichert, wenn man die Liste nur sehr selten vergrößert oder verkleinert? So generell würde ich den Vorwurf der Speicherverschwendung da nicht stehen lassen, das kommt sicher auf die Anwendung an, deswegen gibt es ja immer noch beide Varianten…

RE: Implementierung: Liste als Array 2007-03-28 14:46
TriPhoenix
Das kommt wiederum auf deine Listenelemente an. Wenn du in jedem Listenelement nur ein Byte speicherst, klar. Wenn dein Listenelement aber ein Objekt mit einigen hundert Bytes ist, plötzlich nicht mehr. Das ist immer eine Frage der Proportionen. Da man aber im Allgemeinen doch eher mehr als eine handvoll Bytes hat (spätestens in Java ja ständig Objekte mit mehr oder weniger komplexen Eigenschaften) kann man dem Array schon eher Speicherverschwendung unterstellen als der verketteten Liste.

RE: Implementierung: Liste als Array 2007-03-28 15:18
Fred
(spätestens in Java ja ständig Objekte mit mehr oder weniger komplexen Eigenschaften)
Java bietet keine Möglichkeit, Objekte direkt in einer Liste zu speichern (genau so wie man keine Objekte in Variablen speichern kann). Von daher ist LinkedList bei Java schon sehr viel speicherverschwenderischer als ArrayList:

4 Bytes für die Referenz auf den Vorgänger
4 Bytes für die Referenz auf das Listenelement
4 Bytes für die Referenz auf den Nachfolger

—> 66% "Verschwendung"

RE: Implementierung: Liste als Array 2007-03-28 17:44
TriPhoenix
Achja, Referenzen und so. Ja da ist was dran [22]

RE: Implementierung: Liste als Array 2007-03-28 21:03
Slater
66% Verschwendung schafft man nur, wenn man diese drei Referenzen wiederum in einem Array speichert,
macht man aber nicht, der Knoten in der LinkedList an sich braucht auch noch mal seine 4 Bytes

-> (mindestens) 75% ;)