Embedded Metadata Arrays, Listen, Bäume - Datenorganisation im Hauptspeicher 22.10.2007 Konzeptionelle Sicht auf den Hauptspeicher Applikationen organisieren ihren Speicher selbst Datenstrukturen: Ein Array Datenstrukturen: Ein Array – Merkmale 1. statisch. 2. Schnelles kopieren – direkte Abbildung auf den Speicher möglich. 3. Zeitkomplexität für einfache Operationen: konstant – O(1). 4. Speicherkomplexität: feste vorgegebene Kapazität – O(N). 5. Problem: Ein Array kann nicht wachsen, sondern hat immer die Kapazität N. 6. Problem: In ein Array kann nur am Ende eingefügt werden. Ein Einfügen in die Mitte bedeutet, daß Elemente umkopiert werden müssen Datenstrukturen: Liste Datenstrukturen: Liste – Merkmale 1. dynamisch 2. Speicher wird referenziert 3. Zeitkomplexität: in vielen Fällen konstant. Operationen am Ende der Liste können durch doppelte Verkettung ebenfalls konstant gemacht werden. 4. Speicherkomplexität: dynamisch – kann während der Laufzeit verändert werden 5. Einfügen eines Elementes in die Mitte ist möglich erfordert aber das Durchlaufen der Liste. Die Zeitkomplexität ist Abhängig von der Anzahl der enthaltenen Elemente. 6. Für jedes Datum muss mindestens eine Speicherreferenz mit verwaltet werden 7. Zur Iteration müssen Referenzen aufgelöst werden Zwischenüberlegung Wir wollen die eingegebenen Zahlen in einer Datei auf auf der Festplatte speichern. Wie ist dies zu tun, wenn wir die Zahlen anschließend wieder a. in ein Array einlesen wollen b. in eine Liste einlesen wollen Vorschlag Array Variante 1: 8, 398752, 4068783, 3958488, 4431164, 4561760, 4357785, 3688334, 4337803 Variante 2: anzahl = 8; elemente = 398752, 4068783, 3958488, 4431164, 4561760, 4357785, 3688334, 4337803; Variante 3: <data type=”int” arity=”8”> 398752 4068783 3958488 4431164 4561760 4357785 3688334 4337803 </data> Vorschlag Liste Variante 1: 398752, 4068783, 3958488, 4431164, 4561760, 4357785, 3688334, 4337803; Variante 2: elemente = 398752, 4068783, 3958488, 4431164, 4561760, 4357785, 3688334, 4337803; Variante 3: <data type=”int” arity=”many”> 398752 4068783 3958488 4431164 4561760 4357785 3688334 4337803 </data> Datenstrukturen: Baum Datenstrukturen: Baum – Merkmale 1. dynamisch 2. Speicher muss referenziert werden 3. Zeitkomplexität: in balancierten Bäumen kann mit logarithmischem Aufwand gesucht werden. 4. Speicherkomplexität: dynamisch – verändert sich während der Laufzeit 5. Binärbäume speichern die Daten sortiert – gut geeignet zum Suchen 6. Das Einfügen in einen Binärbaum erfordert Vergleichsoperationen 7. Ein Baum kann zur Liste entarten. Die Reihenfolge in der Elemente eingefügt werden ist relevant Datenstrukturen: Binärbaum – Optimierung Vorschlag Baum Variante 1: 4068783,3688334,4431164,398752,4561760,3958488,4357785,4337803; Variante 2: Zusammenfassung Datenstrukturen 1. Applikationen bekommen vom Betriebssystem Speicherplatz zugewiesen. Der Speicherplatz wird von den Programmen selbst organisiert. 2. Es gibt einige allgemeine Datenstrukturen, die wiederkehrende Probleme lösen. z.B. Array, Liste, Binärbaum 3. Zu einer Datenstruktur gehört immer auch ein Set von Methoden. z.B. Einfügen, Löschen, Verschieben, Sortieren, Suchen, Durchlaufen. Für die einzelnen Operationen können Aufwandsabschätzungen berechnet werden. 4. Eine Programmbibliothek versucht in der Regel einen einheitlichen Zugriff auf die Datenstrukturen zu gewährleisten. Hierzu können Hilfsklassen (z.B. Iterator) zum Einsatz kommen. 5. Unterschiedliche Probleme erfordern unterschiedliche Datenstrukturen 6. Die Entscheidung für eine Datenstruktur kann Einfluß auf die Art der dauerhaften Verspeicherung der Daten haben (Persistierung). 7. Datenstrukturen organisieren den Zugriff auf den Hauptspeicher. Wie können sie beim Zugriff auf die Festplatte helfen? Unterstützung des Festplattenzugriffs Scenario: Wir haben eine Datei, die mehr Informationen enthält, als wir in den Hauptspeicher laden können oder wollen. Ziel: Wir wollen nun im Hauptspeicher einen Suchindex aufbauen, der es uns erlaubt gezielt auf einzelne Records in der Datei zuzugreifen. Idee: Wir speichern den Dateioffset zu jedem Record in einer Liste Optimierung Problem Was machen wir, wenn der Index selbst so groß wird, daß er nicht mehr in den Hauptspeicher passt?