Datenorganisation • Datenstrukturen: Arrays, Listen und Bäume • Standardalgorithmen: Suchen und Sortieren • Dateiverwaltung Informatik 2006 Datenorganisation Seite 1 Klöditz Hochschule Anhalt (FH) Was ist ein array? • Vektor (eindimensionales Feld) – a1 a2 a3 a4 ... an • Matrix (zweidimensionales Feld) – – – – m1,1 m1,2 m1,3 ... m1,r m2,1 m2,2 m2,3 ... m2,r ... ms,1 ms,2 ms,3 ... ms,r • Datenfelder (arrays) – geordnete Zusammenfassung von Datenelementen gleichen Datentyps (int, float, char, ...); auch mehr als zweidimensional zulässig – direkter Zugriff über Indices; Adressrechnung notwendig Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 2 Array-Datentyp • Datentyp: • Vereinbarung: • Zugriff: entspricht dem Datentyp der Elemente Name des arrays + Anzahl der Elemente + deren Datentyp über Indices (Adress-Rechnung) oder Zeiger • Beispiel: – Vereinbarung: float werte[20][3]; – Zugriff: werte[12][2] Informatik 2006 Datenorganisation Seite 3 Klöditz Hochschule Anhalt (FH) Vereinbarung von arrays • Funktion: – reserviert Speicherplatz für die angegebene Anzahl Elemente im entsprechenden Datentyp – Index des 1. Elementes in der Programmiersprache C ist immer 0; alsein mit x[10] vereinbartes Array enthält die Elemente x[0], x[1], ..., x[9] • Beispiele: int x[10]; char satz[40]; float matrix[100][20], tabelle[12][4]; Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 4 Daten-Eingabe in arrays • nur möglich unter Benutzung von Zyklen zur Eingabe von Werten in die einzelnen Elemente: – for-Anweisung • bei bekannter, fester Anzahl von Elementen – while-Anweisung • bei unbekannter, variabler Anzahl • Test einer Abbruchbedingung (am Anfang absichern!) – do-Anweisung • Test der Abbruchbedingung am Ende Informatik 2006 Datenorganisation Seite 5 Klöditz Hochschule Anhalt (FH) Zugriff zu array-Elementen • Zugriff erfolgt über einen Index bzw. mehrere Indices • Zuweisung: x[3] = a*c1 + ...; • in Ausdrücken: anzahl = x[1]+x[2]: Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 6 Anwendungsbeispiele • Verarbeitung von Tabellen / Matrizen • Sortieren: – BubbleSort – SelectionSort – ... • Statistische Methoden: – Datenauswertungen – Abweichungen von statistischen Maßen – Regressionsanalyse Informatik 2006 Datenorganisation Seite 7 Klöditz Hochschule Anhalt (FH) Anwendung von Arrays SelectionSort Struktogramm Eingabe LIES (anzahl); für i von 1 bis anzahl LIES (zahl[i]); Verarbeitung für j von 1 bis (anzahl-1) min=zahl[j]; pos=j; für i von (j+1) bis anzahl ja zahl[i]<min nein ? min=zahl[i]; pos=i; zahl[pos]=zahl[j]; zahl[j]=min; Ausgabe Klöditz Hochschule Anhalt (FH) für i von 1 bis anzahl SCHREIBE (zahl[i]); Informatik 2006 Datenorganisation Seite 8 Anwendung von Arrays SelectionSort #include <stdio.h> void main() { int min, pos; int i,j,anz; int zahl[50]; // // // Minimum, Position von min Index, Anzahl der Zahlen indizierte Zahlenwerte printf("Wieviele Zahlen? = "); // unsortiert einlesen scanf("%d",&anz); for (i=0; i<anz; i++) { printf("%2i : ",i+1); scanf("%i", &zahl[i]); } for (i=0; i<anz-1; i++) { // Sortierung min=zahl[i]; pos=i; for (j=i+1; j<anz; j++) if (zahl[j]<min) { min=zahl[j]; pos=j; } zahl[pos]=zahl[i]; zahl[i]=min; } printf ("\n\nsortiert:\n"); // sortiert ausgeben for (i=0; i<anz; i++) printf("%2i : %6i\n", i+1, zahl[i]); } Informatik 2006 Datenorganisation Seite 9 Klöditz Hochschule Anhalt (FH) Zeichenketten • Speicherung in Vektoren vom Typ char • variable Länge durch Abschlusszeichen '\0' (ASCII-Code 0) gekennzeichnet; Elemente nach dem Abschlusszeichen haben undefinierten Inhalt • in C keine Operatoren für Zeichenkettenverarbeitung vorhanden, aber in der C-Bibliothek string.h existieren zahlreiche Routinen Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 10 Vereinbarung von Zeichenketten • Vereinbarung als Vektoren vom Typ char • Beispiele: char str[50]; char name[20] = "Meier"; Informatik 2006 Datenorganisation Seite 11 Klöditz Hochschule Anhalt (FH) Verarbeitung von Zeichenketten • Ein- und Ausgabe: – formatierte Ein- und Ausgabe mit Format "%s" – Beispiel: scanf ("%s", str); kein & vor dem Bezeichner ! printf ("%s", str); • Zugriff auf einzelne Zeichen: – elementweise analog Vektoren • Routinen für die Verarbeitung (in string.h enthalten): – – – – strcat strchr strcmp strcpy Klöditz Hochschule Anhalt (FH) verbindet zwei Strings zu einem sucht ein bestimmtes Zeichen im String vergleicht zwei Zeichenketten lexikographisch kopiert einen String auf einen String Informatik 2006 Datenorganisation Seite 12 Dynamische Datenstrukturen • Array – – – – – statische Datenstruktur Größe muss bei Definition bekannt sein und bleibt konstant gesamter Speicherplatz bleibt reserviert, auch wenn nicht benutzt direkter Zugriff, wenn Position bekannt, sonst sequentielle Suche Einfügen mitten in Array nur nach Verschiebung der nachfolgenden Elemente möglich – Löschen eines Elementes hinterlässt freien Speicherplatz; problematisch • Schlussfolgerung: für viele Aufgaben nicht gut geeignet • Ausweg: Dynamische Datenstrukturen, z.B. Listen und Bäume Informatik 2006 Datenorganisation Seite 13 Klöditz Hochschule Anhalt (FH) Lineare Liste Begriffe first key next key content next key content NULL content • Eigenschaften: – sequentielle Verkettung von Datensätzen – Ordnungsprinzip: Schlüssel (key) – Speicherbedarf wächst mit der Größe der Liste; leere Liste braucht nur first • Begriffe: – – – – – first key next content NULL Klöditz Hochschule Anhalt (FH) - Anker, Wurzel; Adresse des logischen Listenanfangs Schlüssel; Ordnungskriterium Adresse des logischen Nachfolgers Datensatz-Inhalt leere Adresse; logisches Ende der Liste Informatik 2006 Datenorganisation Seite 14 Lineare Liste Beispiel *Biber Biber *Dachs Dachs content *Habicht Habicht content *Maus Maus content *Uhu Uhu content NULL content Informatik 2006 Datenorganisation Seite 15 Klöditz Hochschule Anhalt (FH) Operationen in linearen Listen Einfügen am Anfang Algorithmus: Adler – Speichern des neuen Listenelementes auf beliebigen freien Speicherplatz – Adresse der bisherigen Wurzel in next des neuen Listenelementes eintragen – Adresse des neuen Listenelementes in first eintragen *Biber content *Adler Biber *Dachs Dachs content *Habicht Habicht content *Maus Maus content *Uhu Uhu content NULL content Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 16 Operationen in linearen Listen Einfügen innerhalb der Liste Adler *Biber content Katze *Maus content *Adler Biber *Dachs Dachs content *Habicht Habicht content *Katze Maus content *Uhu Uhu content NULL Algorithmus: – – – – Speicherung des neuen Elementes auf beliebigen freien Speicherplatz Suchen der Einfügestelle (sequentielles Durchlaufen der Liste) Adresse des logischen Nachfolgers aus next des logischen Vorgängers in next des neuen Elementes eintragen Adresse des neuen Elementes in next des logischen Vorgängers eintragen content Informatik 2006 Datenorganisation Seite 17 Klöditz Hochschule Anhalt (FH) Operationen in linearen Listen Einfügen am Ende der Liste Adler *Biber Zebra content Katze NULL *Maus content content *Adler Biber Algorithmus: – – – – *Dachs Dachs content *Habicht Habicht content *Katze Maus content *Uhu Uhu content *Zebra Speicherung des neuen Elementes auf beliebigen freien Speicherplatz Suchen der Einfügestelle (sequentielles Durchlaufen der Liste) Adresse NULL aus next des logischen Vorgängers in next des neuen Elementes eintragen Adresse des neuen Elementes in next des bisherigen logisch letzten Elementes eintragen Klöditz Hochschule Anhalt (FH) content Informatik 2006 Datenorganisation Seite 18 Operationen in linearen Listen Löschen eines Elementes der Liste Adler *Biber Zebra content Katze NULL *Maus content content *Adler Biber *Dachs Dachs content *Katze Habicht content *Katze Maus content *Uhu Uhu content *Zebra Algorithmus: – – – Suchen des zu löschenden Elementes (sequentielles Durchlaufen der Liste) Adresse des logischen Nachfolgers des zu löschenden Elementes aus next dieses Elementes in next des logischen Vorgängers eintragen (anstelle der Adresse des zu löschenden Elementes) Speicherplatz des gelöschten Elementes freigeben content Informatik 2006 Datenorganisation Seite 19 Klöditz Hochschule Anhalt (FH) Lineare Liste Implementierung • Voraussetzung: Direktzugriffsspeicher • Notwendiger Speicherplatz: – für n Datensätze zu je m Bytes = n*m Bytes – Speicherplatz für Anker • Verwaltung des Speichers – durch Programm – durch Betriebssystem • Satzaufbau: – Schlüsselattribut – Satzinhalt / Daten – Zeiger auf logisch nächsten Datensatz Klöditz Hochschule Anhalt (FH) key content next Informatik 2006 Datenorganisation Seite 20 Lineare Liste Probleme • aufwändiges Durchsuchen: Rückwärtsverkettung zusätzlich, Mehrfachverkettung • Speicherverwaltung der leeren Datensätze: Bitmap (1 bit/Datensatz) oder Lineare Liste freier Datensätze (Ankeradresse + Kettung der leeren Datensätze) oder ... ? • logische Reihenfolge entspricht nicht physischer Reihenfolge: Reorganisation = Herstellen der Übereinstimmung von logischer und physischer Folge Informatik 2006 Datenorganisation Seite 21 Klöditz Hochschule Anhalt (FH) Binärer Suchbaum • besteht aus Knoten mit genau einem Eingang und max. zwei Ausgängen • Ordnung im Baum: – nach Schlüsselwerten der jeweiligen Knoten – alle Knoten haben links von einem Knoten kleinere, rechts größere Schlüsselwerte als der Ausgangsknoten 46 22 84 19 11 Klöditz Hochschule Anhalt (FH) 34 20 31 72 36 61 94 75 85 99 Informatik 2006 Datenorganisation Seite 22 Binärbäume Begriffe • Baum (tree) = endlicher, schwach zusammenhängender Graph, für dessen Knoten gilt: • genau ein Knoten hat keinen Eingang (Wurzel, root) • alle anderen Knoten haben genau einen Eingang • endlicher Graph = Menge Knoten N (nodes) + Menge Kanten E (edges) • Binärer Baum (binary tree) = geordneter Baum, der leer ist oder für dessen Knoten gilt: • außer den Endknoten haben alle Knoten genau zwei Ausgänge • maximal ein "Kind" jedes "Elternknotens" ist leer Informatik 2006 Datenorganisation Seite 23 Klöditz Hochschule Anhalt (FH) Binärbäume Begriffe Vollständiger Baum: Unausgeglichener Baum: alle Knoten besetzt ungleiche Tiefe 7 Wurzel Tiefe 0 5 Vorgänger Tiefe 1 3 7 Direkter Nachfolger Tiefe 2 1 4 6 5 19 Unterbaum 3 6 Blätter 9 1 4 Brüder Ausgeglichener Baum: beide Äste gleiche Tiefe oder max. eine Ebene Unterschied 7 5 4 19 6 8 2 Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 24 Binärer Suchbaum Erzeugen • Ausgangspunkt: Folge von Werten • Beispiel: – 46 84 94 22 72 19 20 34 36 61 99 85 75 11 31 46 22 84 19 11 34 20 31 72 36 61 94 75 85 99 Informatik 2006 Datenorganisation Seite 25 Klöditz Hochschule Anhalt (FH) Binärer Suchbaum Hinzufügen • Hinzufügen: – 29 3 52 87 60 (in dieser Reihenfolge) • Algorithmus: – Durchlaufen des Baumes bis zu einem Blatt – Anhängen des neuen Knotens 46 22 84 19 11 3 34 20 29 31 72 36 61 52 94 75 85 99 87 60 Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 26 Binärer Suchbaum Löschen • Algorithmus: – Durchlaufen des Baumes bis zum zu löschenden Knoten – Fallunterscheidung: • Endknoten • Knoten mit nur einem Nachfolger: Nachfolger ersetzt den zu löschenden Knoten • Knoten mit zwei Nachfolgern: "größter" Knoten im "linken" Unterbaum bzw. "kleinster" Knoten im "rechten" Unterbaum ersetzt den zu löschenden Knoten Informatik 2006 Datenorganisation Seite 27 Klöditz Hochschule Anhalt (FH) Binärer Suchbaum Suchen / Durchlaufen • Algorithmus: – Durchlaufen des Baumes bis zum gesuchten Knoten oder zu einem Blatt (= "nicht gefunden") • Beispiel: maxTiefe = 20 – Anzahl der Knoten eines Baumes: nB = 2(maxTiefe + 1) -1 2.097.151 – Durchschnittliche Anzahl der Zugriffe: vB = ( maxTiefe+1) / 2 10,5 – Anzahl der Zugriffe in einer Liste (zum Vergleich): v L = ( nL + 1 ) / 2 Klöditz Hochschule Anhalt (FH) 1.048.576 Informatik 2006 Datenorganisation Seite 28 Suchverfahren Begriffe • Suchen = Bestimmen der Position (Adresse) eines Wertes in einer Datenfolge • Sequentielles Suchen – einfachstes Suchverfahren – keine Vorbedingungen (Ordnung) notwendig – hoher Suchaufwand: im Durchschnitt n/2 Zugriffe für eine n-elementige Datenmenge Informatik 2006 Datenorganisation Seite 29 Klöditz Hochschule Anhalt (FH) Suchverfahren Binäre Suche • Voraussetzung: sortierte Folge • Algorithmus: 1. Anfangsindex first=1; Anzahl der Werte n 2. Test des Wertes "in der Mitte" der Folge, also bei Position m = (first + n/2) 3. Ist das der gesuchte Wert: Ende 4. Ist der gesuchte Wert größer, dann Ausschluss des Bereiches von Position first bis (first + n/2): first = first + n/2; n=(n+1)/2 sonst Ausschluss des Bereiches von Position (first + n/2) bis n: n=(n+1)/2 5. Wiederhole ab Schritt 2. Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 30 Suchverfahren Binäre Suche • Beispiel: gesucht 45 in der vorliegenden Folge 1 6 2 9 3 12 4 24 5 45 6 7 46 47 8 58 9 62 10 71 11 73 12 88 13 94 14 15 102 106 1. Zugriff 2. Zugriff 3. Zugriff 4. Zugriff: gefunden Informatik 2006 Datenorganisation Seite 31 Klöditz Hochschule Anhalt (FH) Daten sortieren verschiedene Sortierverfahren 167 817 395 291 103 444 221 141 386 257 291 221 103 395 167 257 444 291 221 444 291 386 141 817 395 386 444 257 395 817 291 817 103 103 817 444 444 817 221 221 817 141 141 817 386 386 817 257 257 817 – SelectionSort 167 103 817 141 395 167 – BubbleSort 167 817 395 Klöditz Hochschule Anhalt (FH) 395 817 291 Informatik 2006 Datenorganisation Seite 32 Sortierverfahren SelectionSort 0 36 29 27 74 41 16 63 22 11 52 1 11 29 27 74 41 16 63 22 36 52 2 11 16 27 74 41 29 63 22 36 52 3 11 16 22 74 41 29 63 27 36 52 4 11 16 22 27 41 29 63 74 36 52 5 11 16 22 27 29 41 63 74 36 52 6 11 16 22 27 29 36 63 74 41 52 7 11 16 22 27 29 36 41 74 63 52 8 11 16 22 27 29 36 41 52 63 74 9 11 16 22 27 29 36 41 52 63 74 Informatik 2006 Datenorganisation Seite 33 Klöditz Hochschule Anhalt (FH) Sortierverfahren SelectionSort • Algorithmus für Sortierung in aufsteigender Folge: 1. Setze den Anfangszeiger auf das (absolut) 1. Element der Folge. 2. Durchsuche die Folge vom (aktuellen) Anfangszeiger bis zum Ende nach dem kleinsten Element und merke Dir dessen Position und Wert. 3. Vertausche das (jeweils) 1. Element der Suchfolge mit dem kleinsten; dieses steht damit in der sortierten Folge an der "richtigen Stelle". 4. Setze den Anfangszeiger um eine Position weiter, auf das nunmehr 1. Element der verbleibenden Folge. 5. Wiederhole die Schritte 2. bis 5. solange, bis der Anfangszeiger auf das vorletzte Element zeigt; die Folge ist dann sortiert. Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 34 Sortierverfahren SelectionSort void SelectionSort (int arr[], long int anz) { int min; long int h, k, pos; for (h=0; h<anz-1; h++) { min = arr[h]; pos = h; for (k=h+1; k<anz; k++) { if (arr[k] < min) { min = arr[k]; pos = k; } } arr[pos] = arr[h]; arr[h] = min; } } Informatik 2006 Datenorganisation Seite 35 Klöditz Hochschule Anhalt (FH) Sortierverfahren BubbleSort 1 36 29 27 74 41 16 63 22 11 52 29 36 27 74 41 16 63 22 11 52 29 27 36 74 41 16 63 22 11 52 29 27 36 74 41 16 63 22 11 52 29 27 36 41 74 16 63 22 11 52 29 27 36 41 16 74 63 22 11 52 29 27 36 41 16 63 74 22 11 52 29 27 36 41 16 63 22 74 11 52 29 27 36 41 16 63 22 11 74 52 29 27 36 41 16 63 22 11 52 74 Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 36 Sortierverfahren BubbleSort 0 36 29 27 74 41 16 63 22 11 52 1 29 27 36 41 16 63 22 11 52 74 2 27 29 36 16 41 22 11 52 63 74 3 27 29 16 36 22 11 41 52 63 74 4 27 16 29 22 11 36 41 52 63 74 5 16 27 22 11 29 36 41 52 63 74 6 16 22 11 27 29 36 41 52 63 74 7 16 11 22 27 29 36 41 52 63 74 8 11 16 22 27 29 36 41 52 63 74 9 11 16 22 27 29 36 41 52 63 74 Informatik 2006 Datenorganisation Seite 37 Klöditz Hochschule Anhalt (FH) Sortierverfahren BubbleSort • Algorithmus für Sortierung in aufsteigender Folge: 1. 2. 3. 4. Setze den Anfangszeiger auf das 1. Element der Folge. Setze die "Tauschkennung" auf 0. Vergleiche das 1. und das 2. Element der Folge. Falls das (jeweils) 2. kleiner ist als das (jeweils) 1., vertausche beide miteinander und erhöhe die "Tauschkennung". 5. Wiederhole Schritt 3. und 4. für alle Elementpaare der Folge. 6. Wiederhole die Schritte 1. bis 5. für die unsortierte Teilfolge, solange die "Tauschkennung" nach Durchlaufen der Schritte 3. bis 5. größer 0 ist oder aber (n-1) Durchläufe erreicht sind. • Verbessungsmöglichkeiten: – abwechselnd von vorn und von hinten beginnen – Kombination von beiden Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 38 Sortierverfahren BubbleSort void BubbleSort (int arr[], long int anz) { int tausch, hilf; long int k; do { tausch = 0; for (k=0; k<anz-1; if (arr[k+1] < hilf = arr[k] = arr[k+1] = tausch++; } } anz--; } while (tausch); k++) { arr[k]) { arr[k]; arr[k+1]; hilf; } Informatik 2006 Datenorganisation Seite 39 Klöditz Hochschule Anhalt (FH) Vergleich der Sortierverfahren Animation: http://www.inf.hs-anhalt.de/~Worzyk/IiN/Applets.htm E:\modul_04_cd\Lektion_do06\text\Java\sortAlgorithms.html Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 40 Sortierverfahren Bewertung • Experimentelle Untersuchung: – Erzeugung unterschiedlicher Mengen zufallsverteilter Ausgangsdaten – Zeitmessung, bezogen auf den reinen Sortiervorgang, für verschiedene Datenmengen und verschiedene Sortierverfahren – statistische Auswertung • Theoretische Untersuchung: – Analyse des Aufwandes (Speicherplatz-, Rechenzeitbedarf) in Abhängigkeit von der zu sortierenden Datenmenge Informatik 2006 Datenorganisation Seite 41 Klöditz Hochschule Anhalt (FH) Sortierverfahren Zeitmessungen • Erzeugen unsortierter Daten • Start- und Endzeit messen • Versuchsparameter: – Sortierverfahren – zu sortierende Menge – Rechnerleistung • Reproduzierbarkeit gewährleisten • statistische Auswertung Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 42 Datenspeicherung • Arbeitsspeicher ist flüchtig, enthält die Daten nur während der Verarbeitung (Laufzeit des jeweiligen Programms) • dauerhafte Speicherung auf Datenträger, z.B. Platte, Diskette, CD-ROM, DVD, USB-Stick, Magnetband, ... • Speicherung als Datei, vom Betriebssystem verwaltet • Dateitypen: – sequentielle Dateien: Schreiben und Lesen in gleicher, feststehender (sequentieller) Reihenfolge – Direktzugriffsdateien: Schreiben und Lesen in beliebiger (wahlfreier) Reihenfolge; zum Zugriff Beziehung zwischen Daten (Schlüssel) und Speicheradresse notwendig Informatik 2006 Datenorganisation Seite 43 Klöditz Hochschule Anhalt (FH) Probleme der Dateiarbeit • jede Datei hat eigene Struktur • für alle Datei-Operationen (Hinzufügen, Löschen, Ändern, Suchen, ...) je Dateistruktur eigene Programme notwendig; • jede Dateistruktur-Änderung hat Änderungen bei allen Programmen zur Folge, die diese Datei nutzen • keine Unabhängigkeit von Daten und Programmen • Mehrfachnutzung von gleichen Daten wird behindert • Ausweg: Datenbanksysteme Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 44 Kontrollfragen 1. Wozu dienen Arrays? Wie werden sie eingelesen, wie verarbeitet und wie ausgegeben? 2. Was ist eine Zeichenkette? Wir sie eingelesen, verarbeitet und ausgegeben? 3. Was verstehen Sie unter dynamischen Datenstrukturen? 4. Wie ist eine Liste organisiert und was nützt sie? 5. Wie ist ein binärer Suchbaum organisiert und wozu wird er verwendet? 6. Welche unterschiedlichen Sortierverfahren kennen Sie und wie funktionieren sie? 7. Wie kann man Leistungsparameter von Sortier-Algorithmen bestimmen? 8. Wie werden Daten auf externen Speichern abgelegt und welche Probleme können dabei entstehen? Klöditz Hochschule Anhalt (FH) Informatik 2006 Datenorganisation Seite 45