Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps <a1, a2, ..., an> (n>=0), leere Liste <> falls n=0 Listenelemente besitzen.

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

8. Termin Teil B: Wiederholung Begriffe Baum
Eine dynamische Menge, die diese Operationen unterstützt,
Claudio Moraga; Gisbert Dittrich
Kapitel 6: Klassifizierung von Sortiertechniken
7. Natürliche Binärbäume
Gewichtsbalancierte Suchbäume
Durchlaufen eines Binärbaumes
Kapitel 6. Suchverfahren
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
<d,a,s, ,i,s,t, ,e,i,n,e, ,L,i,s,t,e>
5. Sortier-Algorithmen Vorbemerkungen:
Synonyme: Stapel, Keller, LIFO-Liste usw.
Sortieren mit Binären Bäumen
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (06 - Anwendungen von Stapeln und Schlangen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen Halbzeit: Was haben wir bisher gelernt? Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (18 - Bäume: Durchlaufreihenfolgen, Analyse nat. Bäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (11-3 –Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (11-1 –Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27-Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (15 Hashverfahren: Verkettung der Überläufer) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 – Dynamische Tabellen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 16 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
6 Folgen (Teil II - Datenstrukturen und Algorithmen)
Operationen auf verketteten Listen
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vorbereitung: struct SX { int x; struct SX *p; } *px, *ph; px: Zeiger auf Listen- anfang ph: Hilfszeiger px = NULL; px zeigt auf leere Liste px.
Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Externe Datenstruktur lineare Liste
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Kapitel 2: Datenstrukturen
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Effiziente Algorithmen
Effiziente Algorithmen
Efficient Alias Set Analysis Using SSA Form Proseminar Programmanalyse WS 11/12 André Hunke.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Kapitel 6: Suchbäume und weitere Sortierverfahren
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
M a r c – o l i v e r p a h l Informatik II – Kapitel 12 „Sortier-Algorithmen“ Zusammenfassung des Kapitel 12 Küchlin, Weber, Einführung in die Informatik,
Algorithmen und Datenstrukturen
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Binärbäume.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
Tutorium Software-Engineering SS14 Florian Manghofer.
 Präsentation transkript:

Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps <a1, a2, ..., an> (n>=0), leere Liste <> falls n=0 Listenelemente besitzen Schlüssel, eigentliche Information und ggf. weitere Komponenten (z.B. Zeiger). Operationen: Einfügen, Entfernen, Suchen Implementierungen: 1. Sequentiell (Arrays), 2. Dynamisch (Zeiger) Vorteile sequentieller Speicherung: schnelle Suchverfahren falls Sortierung vorliegt, da jedes Element über Indexposition direkt ansprechbar (O(1)) Nachteile sequentieller Speicherung: hoher Änderungsaufwand durch Verschiebekosten (O(n)) schlechte Speicherplatzausnutzung inflexibel bei starkem dynamischem Wachstum

Implementierung (Zeiger): Zeiger (*ptr).next zeigt auf an (erleichtert Hintereinanderhängen von Listen). Notation in C: ptr->next praktische Realisierung: Verwendung 2er Dummy-Elemente, die Kopf und Ende repräsentieren. head -> |__|_| -> | a1 | | -> ... -> | an | | -> | | | <- tail Eine Struktur für einfach verkettete Listenelemente typedef struct ListElmt_ { void *data; struct ListElmt_ *next; } ListElmt;

Einfach verkettete Listen: Eine Struktur für verkettete Listen typedef struct List_ { int size; int (*match)(const void *key1, const void *key2); void (*destroy)(void *data); ListElmt *head; ListElmt *tail; } List;

Einfach verkettete Listen: Public Interfaces void list_init(List *list, void (*destroy)(void *data)); void list_destroy(List *list); int list_ins_next(List *list, ListElmt *element, const void *data); int list_rem_next(List *list, ListElmt *element, void **data); #define list_size(list) ((list)->size) #define list_head(list) ((list)->head) #define list_tail(list) ((list)->tail) #define list_is_head(list, element) ((element) == (list)->head ? 1 : 0) #define list_is_tail(element) ((element)->next == NULL ? 1 : 0) #define list_data(element) ((element)->data) #define list_next(element) ((element)->next)

Einfach verkettete Listen: Initialisieren einer Liste void list_init(List *list, void (*destroy)(void *data)) { list->size = 0; list->destroy = destroy; list->head = NULL; list->tail = NULL; return; }

Einfach verkettete Listen: list_ins_next int list_ins_next(List *list, ListElmt *element, const void *data) { ListElmt *new_element; if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL) return -1; new_element->data = (void *)data; if (element == NULL) { if (list_size(list) == 0) list->tail = new_element; new_element->next = list->head; list->head = new_element; } else { if (element->next == NULL) new_element->next = element->next; element->next = new_element;} list->size++; return 0; }

Einfach verkettete Listen: Nur sequentielle Suche möglich (sowohl im geordneten als auch ungeordneten Fall) Einfügen und Löschen eines Elementes mit Schlüssel K erfordert vorherige Suche

Implementierung (doppelt verkettet): Zeiger (*ptr).next zeigt auf das nachfolgende und (*ptr).previous gleichzeitig auf das vorhergehende Listenelement. head -> |__|_| <-> | a1 | | <-> ... <-> | an | | <- tail struct node { int key; struct node *next; struct node *previous; };

Implementierung (doppelt verkettet): Bewertung höherer Speicherplatzbedarf als bei einfacher Verkettung Aktualisierungsoperationen etwas aufwendiger (Anpassung der Verkettung) Suchaufwand in etwa gleich hoch, jedoch ggf. geringerer Suchaufwand zur Bestimmung des Vorgängers (PREVIOUS(p,L)) geringerer Aufwand für Operation DELETE(p,L) Flexibilität der Doppelverkettung besonders vorteilhaft, wenn Element gleichzeitig Mitglied mehrerer Listen sein kann (Multilist-Strukturen)

Implementierung (doppelt verkettet): Suchaufwand bei ungeordneter Liste erfolgreiche Suche cavg=(n+1)/2 (Standardannahme: zufällige Schlüsselauswahl, stochastische Unabhängigkeit der g. Schlüsselmenge) Einfügen oder Löschen eines Elementes konstante Kosten für Einfügen am Listenanfang Löschen verlangt meist vorherige Suche konstante Löschkosten bei positionsbezogenem Löschen und Doppelverkettung Sortierung bringt kaum Vorteile erfolglose Suche cavg=(n+1)/2 lineare Kosten für Einfügen in Sortierreihenfolge

Häufigkeitsgeordnete lineare Listen Zugriffshäufigkeiten für die einzelnen Elemente bekannt mittlere Suchkosten cavg(n)=1*p1+2*p2+3*p3+...+n*pn minimierte Suchkosten wenn p1>p2> ...>pn Selbstorganisierende Listen (wenn Zugriffshäufigkeiten für die einzelnen Elemente nicht bekannt) Frequency count Transpose Move-to-Front

Skip-Listen Wörterbücher (Dictionaries): Mengen von Elementen eines Grundtyps mit Operationen Suchen, Einfügen, Entfernen. Wörterbuchproblem: Finden geeigneter Datenstruktur und effizienter Algorithmen für diese Operationen (Listen eine von mehreren Realisierungsmöglichkeiten). Skip-Listen: Effiziente Realisierungsmöglichkeit. a) Perfekte Skip-Listen Def.: Eine perfekte Skip-Liste ist eine sortierte, verkettete lineare Liste, mit Kopf und Endelement, wobei gilt: 1) jedes 2i-te Element hat Zeiger auf das 2i Positionen weiter rechts stehendes Element. 2) Endelement hat Wert unendlich.

Jedes Listenelement hat Zeiger auf nächstes Element. Jedes 2. Listenelement hat Zeiger auf übernächstes Element. Jedes 4. Listenelement hat Zeiger auf 4 Positionen weiter rechts stehendes Element, etc. Gesamtzahl der nötigen Zeiger für Länge N: N + N/2 + N/4 + ... + 1  2N Höhe eines Elements: Anzahl der Zeiger des Elements -1. Höhe der Liste (L.höhe): maximale Zeigeranzahl eines Elements - 1: |_ log N _| .

Suchen informell: 1. Sei i die Höhe der Skip-Liste, der Kopf der Liste das aktuell inspizierte Objekt. 2. Falls Schlüssel des Objekts, auf das der Niveau-i-Zeiger des aktuellen Objekts zeigt, kleiner als der Suchschlüssel ist, mache dieses zum aktuellen Objekt. 3. dekrementiere i. Falls i >= 0 gehe nach 2. 4. Falls der Schlüssel des Nachfolgers des aktuellen Objekts identisch mit dem Suchschlüssel ist, gib Nachfolger aus, sonst ist Objekt mit Suchschlüssel nicht in Liste.

Suchaufwand Suchen in perfekten Skip-Listen ist O(log N). Problem: Einfügen und Löschen führt zu erheblichem Mehraufwand, wenn Skip-Listen perfekt bleiben sollen. Deshalb: randomisierte SLs: Man sorgt dafür, daß die Anzahl der vorkommenden Höhen stimmt (d.h. Hälfte Niveau 1 Zeiger, Viertel Niveau 2 Zeiger etc.). Neues Element erhält Höhe i mit Wahrscheinlichkeit 1 / 2i+1, 0  i  maxhöhe Beim Einfügen (und Entfernen) müssen Zeiger entsprechend der zufälligen Höhe des Elements umgesetzt werden.

Komplexitätsanalyse (etwas aufwendiger Beweis) zeigt: Erwartungswert (aber nicht worst case) für Kosten von Suchen, Einfügen und Entfernen in randomisierten Skip-Listen ist immer noch O(log N).