Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

© Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 18 Erweiterung der (nicht-leeren!) Liste: tmp = head; while (tmp.next != null) tmp = tmp.next;

Ähnliche Präsentationen


Präsentation zum Thema: "© Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 18 Erweiterung der (nicht-leeren!) Liste: tmp = head; while (tmp.next != null) tmp = tmp.next;"—  Präsentation transkript:

1 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 18 Erweiterung der (nicht-leeren!) Liste: tmp = head; while (tmp.next != null) tmp = tmp.next; tmp.next = new ListNode(4); 3.3 Verkettete Listen head null tmp 4 null

2 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 19 Entfernen des letzten Elementes aus der (aus mehr als 1 Element bestehenden!) Liste: ListNode pred = null; tmp = head; while (tmp.next != null) { pred = tmp; tmp = tmp.next; } pred.next = null; 3.3 Verkettete Listen head null pred null tmp pred tmp pred tmp pred tmp pred tmp null

3 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 20 Rekursive Traversierung einer Liste vom Anfang zum Ende und wieder zurück: void traverse(ListNode p) { ListNode Node; if (Node = p; p != null; Node = Node.next) { process(Node.data); } } initialer Aufruf: traverse(head); 3.3 Verkettete Listen

4 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 21 Iterative Traversierung der Liste vom Anfang zum Ende und wieder zurück: ListNode head, tmp; … ListNode old, present; present = head; for (int i = 1; i <= 2; i++) { old = null; while (present != null) { process(present.data); tmp = present.next; present.next = old; old = present; present = tmp; } present = old; } 3.3 Verkettete Listen present old null present old present old present old present old present old present old present old present old present old present old null present head null Bewirkt eine Listenumkehr

5 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 22 ListNode head, tmp; … ListNode old, present; present = head; old = null; while (present != null) { process(present.data); tmp = present.next; present.next = old; old = present; present = tmp; } 3.3 Verkettete Listen Programmcode für iterative Traversierung der Liste vom Anfang zum Ende und wieder zurück wird eleganter, wenn der letzte Knoten nicht auf null, sondern auf sich selbst verweist: head

6 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Verkettete Listen entry e1e1 e2e2 eiei... e i+1 enen... Erweiterungen: Zirkuläre Listen:

7 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Verkettete Listen Beispiel: Josephus-Funktion N Personen (rechts N=9) wählen einen Anführer, indem sie sich in einem Kreis aufstellen und jede M-te Person (M=5) aus dem Kreis entlassen. Nach dem Weggang einer Person wird der Kreis wieder geschlossen. Die letzte Person wird der Anführer (ein mathematisch gebildeter Möchtegern-Anführer ermittelt im Voraus, welche Position er im Kreis einzunehmen hat). Josephus-Funktion J(N, M): Die Identität des gewählten Anführers. J(9,5) = 8.

8 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Verkettete Listen Doppelt-verkettete zirkuläre Listen: e1e1 e2e2 enen eiei e i+1 …… entry Doppelt-verkettete Listen: e1e1 e2e2 enen eiei e i+1 …… entry null

9 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Verkettete Listen Mehrfach verkettete Listen: Knoten haben mehrere Verbindungsfelder und gehören zu unabhängig verwalteten verketteten Listen. Bsp. a, b: Start einer Liste. Doppelt-verkettete Listen: Spezialfall von mehrfach verketteten Listen

10 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Verkettete Listen Realisierung verketteter Listen: i.d.R. Referenzen auf Objekte Arrays von Ganzzahlen, um verkettete Listen, z.B. für Josephus-Spiel (rechts), zu implementieren. Wir realisieren Verbindungen mit Arrayindizes. (Warum und wann ist dies möglich?) Die Abstraktionsmöglichkeit von Java hilft, solche Details zu verbergen

11 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Arrays vs. Verkettete Listen Listen: Lokale Veränderungen können mit einem Aufwand durchgeführt werden, der unabhängig von der Größe der Liste ist - vorausgesetzt wir kennen die Speicherpositionen der involvierten Elemente Verkettete Listen: Ein aus einer Liste gelöschtes Element hinterlässt keine Lücke, die wie beim Array gefüllt werden müsste. Stattdessen hinterlässt es freien Speicherplatz Speicherplatzverwalter (garbage collector) sammelt den nicht mehr benötigten Speicherplatz wieder ein.

12 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Arrays vs. Verkettete Listen Primzahlensieb von Eratosthenes: Array vorteilhaft, weil die Effizienz des Algorithmus darauf beruft, schnell auf eine beliebige Arrayposition zugreifen zu können Josephus-Problem: Verkettete Liste vorteilhaft, weil die Effizienz des Algorithmus darauf beruft, schnell Elemente entfernen zu können. Achtung: Verkettete Listen könnten durchaus intern mit Arrays realisiert werden! Die Wechselwirkung zwischen Datenstrukturen und Algorithmen bildet das Herz des Entwurfsprozesses und Kern der Vorlesung!

13 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Zusammengesetzte Datenstrukturen Arrays und verkettete Listen liefern eine erste Stufe der Abstraktion, auf der komplexere Datenstrukturen definiert werden können Mehrdimensionale Arrays: Deklaration: Typ[][] Arrayname // 2-dimensional Typ[][][] Arrayname // 3-dimensional alternativ: Typ Arrayname[][] Initialisierung: Arrayname = new Typ[Size1][Size2]; oder (für nicht notwendigerweise rechteckige Arrays): Arrayname = new Typ[Size][]; for (int i = 0; i < Size; i++) Arrayname[i] = new Typ[Size_i];

14 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Zusammengesetzte Datenstrukturen Beispiel: Deklaration: int[][] table; Erzeugung: table = new int[3][2]; oder table = new int[3][]; table[1] = new int[2];

15 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Zusammengesetzte Datenstrukturen Beispiel: Effiziente Speicherung von nicht-rechteckigen Strukturen int pascal [][] = { { 1 }, { 1, 1 }, { 1, 2, 1 }, { 1, 3, 3, 1 }, { 1, 4, 6, 4, 1 } } ; Pascal[4][1]

16 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Zusammengesetzte Datenstrukturen Beispiel: Darstellung von Graphen mit Adjazenzmatrix Einfachheitshalber ordnen wir den Knoten Indizes zu. Adjazenzmatrix = 2D Matrix: Zeile i und Spalte j hat den Wert true, wenn es eine Kante von Knoten i zu Knoten j gibt. Das Array ist für ungerichtete Graphen symmetrisch. Per Konvention weisen wir den Elementen in der Diagonalen true -Werte zu. Boolean adj[][] = new boolean[V][V];

17 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen Zusammengesetzte Datenstrukturen Dünn besetzte Adjazenzmatrix: Ein Graph mit wenigen Kanten kann auch mit einem Array von Adjazenzlisten darstellt werden. Der Speicherbedarf ist proportional zur Anzahl der Knoten plus Anzahl der Kanten.

18 © Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 35 Zusammenfassung 3.1 Grundlegendes 3.2 Arrays (Felder) 3.3 Verkettete Listen 3.4 Arrays vs. Verkettete Listen 3.5 Zusammengesetzte Datenstrukturen


Herunterladen ppt "© Xiaoyi Jiang Informatik II – Datenstrukturen und Algorithmen 18 Erweiterung der (nicht-leeren!) Liste: tmp = head; while (tmp.next != null) tmp = tmp.next;"

Ähnliche Präsentationen


Google-Anzeigen