Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Ähnliche Dokumente
Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Reihungen und Prozeduren

Einführung in die Programmierung für NF. Arrays

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Komplexität von Algorithmen

3.2 Datentypen und Methoden

Dr. Monika Meiler. Inhalt

Übersicht. 4.1 Ausdrücke. 4.2 Funktionale Algorithmen. 4.3 Anweisungen. 4.4 Imperative Algorithmen Variablen und Konstanten. 4.4.

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Dr. Monika Meiler. Inhalt

Variablen in Java. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang. Ziele

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Mehrdimensionale Arrays

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 9. Arrays. Arrays 1

Algorithmen und Datenstrukturen II

Arrays. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Vorlesung Programmieren

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Erste Java-Programme (Arrays und Schleifen)

Vorlesung Programmieren

Algorithmen und Datenstrukturen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Felder in C. Felder stellen eine Reihung von Elementen gleichen Typs dar. Man spricht auch von Vektoren oder Arrays.

2.8 Klassen. Nichtgleichartige Elemente können in Klassen zu einem neuen Typ zusammengefasst werden. Beispiel: Die drei Komponenten

Programmieren in C/C++ und MATLAB

1 Klassen und Objekte

Wertebereich und Genauigkeit der Zahlendarstellung

Einstieg in die Informatik mit Java

Arrays. Einleitung. Deklarieren einer Array Variablen

Java Referenzdatentypen genauer betrachtet

Konzepte benutzerdefinierter Datenstrukturen

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Dr. Monika Meiler. Inhalt

2.7 Felder (Arrays) Das englische Wort array hatte ursprünglich militärische Bedeutung: Aufstellung zur Schlacht : Titel der Zeichnung links:

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Java - Schleifen. Bedingung. wiederhole. Anweisung Anweisung Anweisung. Leibniz Universität IT Services Anja Aue

Mehrdimensionale Arrays

Ziele. Kapitel 10: Komplexität von Algorithmen und Sortierverfahren. Beispiel: Lineare Suche eines Elements in einem Array (1)

Einfache Rechenstrukturen und Kontrollfluss

Tag 4 Repetitorium Informatik (Java)

Einfache Rechenstrukturen und Kontrollfluß

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Informatik Vorkurs - Vorlesung 2

Einführung in die Programmierung für NF MI. Übung 04

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Modellierung und Programmierung 1

Algorithmen implementieren. Implementieren von Algorithmen

Unterlagen. CPP-Uebungen-08/

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Inhalt. Peter Sobe 63. Felder in C

Tag 8 Repetitorium Informatik (Java)

Einführung Java Programmieren in Java Arrays Schleifen Fehler. Einführung in Java. Arne Hüffmeier. Michelle Liebers, Dennis Hoffmann

Java Übung. Übung 2. Werner Gaulke. 19. April Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Objektorientierte Programmierung. Kapitel 16: Arrays für Fortgeschrittene

Grundlagen von C# - 2

2. Programmierung in C

Schleifen Datenfelder (Arrays) Verzweigungen

+ C - Array (Vektoren, Felder)

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Vorkurs Informatik WiSe 16/17

Fakultät IV Elektrotechnik/Informatik

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Propädeutikum zur Programmierung

10. Felder (Arrays) Teil 2. Java-Beispiele: Echo.java Primzahlen.java Monate.java. K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

Kapitel 3: Variablen

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

Felder, Zeiger und Adreßrechnung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Organisatorisches. Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, , 14 Uhr bis Do, , 8Uhr

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 3

Grundlagen der Objektorientierten Programmierung - Statische Arrays

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

Abschnitt 7: Arrays und Strings

Transkript:

Reihungen Martin Wirsing in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang http://www.pst.informatik.uni-muenchen.de/lehre/ws0506/infoeinf/ WS 05/06 2 Ziele Die Datenstruktur der Reihungen verstehen: mathematisch und im Speicher Grundlegende Algorithmen auf Reihungen kennen lernen: Suche im ungeordneten und geordneten Feld Eindimensionale und mehrdimensionale Reihungen verstehen

3 Reihungen und deren mathematische Darstellung Beispiel Ein Reihung a der Länge 6 kann folgendermaßen dargestellt werden: a: V E R L A G Index: 0 1 2 3 4 5 a kann beschrieben werden als die Abbildung a : {0,..., 5} char a[i] = V E. G falls i = 0 falls i = 1 falls i = 5 4 Reihungen Eine Reihung (auch Feld, Array genannt) ist ein Tupel von Komponentengliedern gleichen Typs, auf die über einen Index direkt zugegriffen werden kann. Mathematisch kann eine Reihung mit n Komponenten vom Typ type als endliche Abbildung I n type mit Indexbereich I n = {0, 1,..., n 1}beschrieben werden. n bezeichnet die Länge der Reihung. Da type ein beliebiger Typ ist, kann man auch Reihungen als Komponenten haben mehrdimensionale Reihungen.

5 Reihungen und deren Speicherdarstellung In Java wird eine Reihung mit n Elementen vom Typ type aufgefasst als ein Zeiger auf einen Verbund (Record) mit den n+1 Komponenten (Attributen) int length type 0 Eindeutiger Identifikator. Gleicher Typ type type (n - 1) (dem Programmierer NICHT bekannt) Darstellung des Vektors (in UML) @a: type[] length = 6 [0] = V [1] = E. [5] = G Typ/Klasse der Reihung Bemerkung: In Java sind Reihungen spezielle Objekte - siehe später - 6 Reihungen und deren Speicherdarstellung Die Speicherorganisation der Reihung a hat folgende Gestalt c a x 17 :C @a :type[] Programmvariablen Adresse von @a auf der Halde, d.h. Zeiger auf @a length = 6 [0] = V [1] = E. [5] = G Verbund mit Namen @a (Objekt) Keller Halde

7 Struktur des Datenspeichers Der Datenspeicher eines Java-Programms besteht aus zwei Teilen: der Keller für die lokalen Variablen und ihre Werte die Halde ( heap ) für die Reihungen (und die Objekte siehe später) 8 Zugriff auf Reihungen a[i] bezeichnet den Zugriff auf die i-te Komponente der Reihung a Beispiel: Mit a[0], a[1],..., a[5] kann man auf die Komponenten der Beispielreihung a zugreifen. a.length gibt die Länge der Reihung an. Im Beispiel hat a.length den Wert 6.

9 Deklaration von Reihungstypen und -variablen In Java haben Reihungstypen die Form type[]... [] Beispiel: int[], int[][], boolean[] Typ einer 1- dim. Reihung Typ einer 2- dim. Reihung (siehe später) 10 Eindimensionale Reihungen Deklaration einer Reihung mit Elementen vom Typ type : type[] var = new type[n]; Reihungstyp Die Deklaration deklariert lokale Variable var vom Type type[] und reserviert Speicherplatz für eindimensionale Reihung der Länge n Erzeugt neue Reihung der Länge n, bei der jede Komponente mit dem Standardwert von type initialisiert wird. Durch die Deklaration werden außerdem implizit n zusammengesetzte Variablen var[0],..., var[n-1] erzeugt, mit denen man auf die Werte der Komponenten von var zugreifen und diese Werte verändern kann. Standardwert (Defaultwert) von int : 0 von double : 0.0 von boolean : false

11 Eindimensionale Reihungen: Initialisierung Sofort Anfangswerte zuweisen ( Initialisierung ) type[] var = {v 0,..., v n-1 } // sofortige Zuweisung vom Typ type! Diese Art der Initialisierung ist aber nur in einer Deklaration zulässig. oder Zuweisung an Komponenten: type[] var = new type[n]; var[0] = v 0 ;. var[n-1] = v n-1 ; 12 Beispiel: Eindimensionale Reihungen: Initialisierung char[] a = { V, E, R, L, A, G } Typ von a ist char[], d.h. der Typ einer einstufigen Reihung mit Elementen aus char. Man kann die Reihung initialisieren durch Einzelzuweisungen der Werte: char[] a = new char[6]; a[0] = V ; a[1] = E ; a[2] = R ; a[3] = L ; a[4] = A ; a[5] = G ;

13 Eindimensionale Reihungen Man kann beliebige einzelne Buchstaben ändern: a[3] = R ; a[5] = T ; Das ergibt V E R R A T als neuen Wert der Reihung. Außerdem hat a[3] nun den Wert R. 14 Direkte Zuweisung char[] c = { L, M, U }; a = c; Bemerkung: Da in Java die Länge der Reihung aber nicht Bestandteil des Typs ist, kann einer Feldvariablen eine Reihung mit einer anderen als der initial angegebenen Länge zugewiesen werden.

Reihungen und for-schleifen Die Länge einer Reihung steht in dem Attribut length int x = 10; int[] myarray = new int [x*x+1]; int länge = myarray.length 15 for-schleifen eignen sich gut um Reihungen zu durchlaufen for (int k=0; k<länge; k++) { myarray[k] = 2 * myarray[k]; } schreiben lesen Typische Suche nach einem Element in einer Reihung - mit vorzeitigem Verlassen: int element = 16; int k=0; while (k<länge && myarray[k]!= element) k++; boolean gefunden = (k<länge); 16 Suche nach dem Index eines minimalen Elements einer Reihung Gegeben sei folgendes Feld: 3-1 15 1-1 Algorithmus: Bezeichne minindex den Index des kleinsten Elements Initialisierung minindex = 0 Durchlaufe die ganze Reihung. In jedem Schritt i vergleiche den Wert von minindex (d.h. a[minindex]) mit dem Wert des aktuellen Elements (d.h. a[i]). Falls a[i] < a[minindex] setze minindex = i

Suche nach dem Index eines minimalen Elements einer Reihung Java Implementierung 17 Sei die Reihung int[] a gegeben. int minindex = 0; for (int i = 1; i < a.length; i++) // Optimierung, da // a[0] < a[0] falsch ist { if (a[i] < a[minindex]) minindex = i; } int minelem = a[minindex]; // minelem ist der Wert // des kleinsten Elements; // minindex ist der am weitesten links // stehende Index // eines kleinsten Elements Binäre Suche eines Elements e in einer geordneten Reihung Sei a ein geordnete Reihung mit den Grenzen j und k, d.h. a[i] a[i+1] für i=j,...,k; also z.b.: 18 a: 3 7 13 15 20 25 28 29 j j+1... k Algorithmus: Um den Wert e in a zu suchen, teilt man die Reihung in der Mitte und vergleicht e mit dem Element in der Mitte: Ist e < a[mid], so sucht man weiter im linken Teil a[j],..., a[mid-1]. Ist e = a[mid], hat man das Element gefunden. Ist e > a[mid], so sucht man weiter im rechten Teil a[mid+1],..., a[k].

Binäre Suche eines Elements e in einer geordneten Reihung 19 Implementierung in Java: Sei int e das Element, das in der Reihung int[] a gesucht wird. int j = 0; //linke Grenze int k = a.length-1; //rechte Grenze int mid; //Index der Mitte boolean found = false; while (j <= k &!found) //solange Reihung nicht leer und e nicht gefunden { mid = (j + k) / 2; //Berechnung der Mitte if (e < a[mid]) //falls e kleiner als das mittl. Element k= mid - 1; //setze rechte Grenze unterhalb der Mitte else //sonst { if (e = a[mid]) //falls e gleich mittl. Element found = true; // e ist in a gefunden else //sonst j = mid + 1; //setze linke Grenze oberhalb der Mitte } } boolean result = found; //e gefunden genau dann, wenn found == true 20 Mehrdimensionale Reihungen Matrizen sind mehrdimensionale Reihungen Man benutzt Matrizen zur Speicherung und Bearbeitung von Bildern Operationstabellen Wetterdaten Graphen Distanztabellen... Deklaration int [][] greymonalisa; boolean[][] xortabelle Deklaration mit Erzeugung int[][]entfernung = new int[4][4];

21 Mehrdimensionale Reihungen Deklaration mit Initialisierung boolean[][] xortabelle = {{false, true}, {true, false}}; int[][]entfernung = {{ 0, 213, 419, 882}, {213, 0, 617, 720}, {419, 617, 0, 521}, {882, 720, 521, 0}}; 22 Allgemein Mehrdimensionale Reihungen type[]...[] var = new type[n 1 ]...[n i ][]...[] (i > 0) deklariert eine Variable var vom Typ type[]...[], reserviert Speicherplatz für ein mehrstufiges Feld. Mindestens die Länge n 1 des ersten Indexbereiches muß angegeben werden. Initialisierung: type[][] var = {f 0,..., fn 1-1}; Reihungen von Werten vom Typ type[] Eine mehrdim. Reihung ist eine Reihung von Reihungen Dabei können die Längen von f 0,..., fn 1-1 unterschiedlich sein. Analog für höherdimensionale Reihungen.

23 Mehrdimensionale Reihungen Ausdrücke Zusammengesetzte Variablen var[i 1 ]...[i n ] Initialisierungsausdrücke der Form new type[n 1 ]...[n i ][]...[] bzw. {v 0,...vn 1-1} 24 Mehrdimensionale Reihungen - gibt s gar nicht! Mehrdimensionale Reihungen braucht man eigentlich nicht Eine zweidimensionale Reihung ist eine Reihung von Zeilen Eine dreidimensionale Reihung ist eine Reihung von zweidimensionalen Reihungen... 0 213 419 882 213 0 617 720 entfernung 419 617 0 521 882 720 521 0

25 Beispiel: Tastentelefon Mehrdimensionale Reihungen Ein Tastentelefon besteht aus 4 Zeilen und 3 Spalten: 0 1 2 3 2 1 0 1 2 3 4 5 6 7 8 9 * 0 # char[][] tastenwert = { { *, 0, # }, { 7, 8, 9 }, { 4, 5, 6 }, { 1, 2, 3 } }; z.b. tastenwert[3][0] = 1 tastenwert[0][2] = # 26 Reihungen: Krumm und schief Die Dimension einer Reihung ist nicht Teil ihres Typs Folglich können verschieden große Reihungen den gleichen Typ haben int [] alt = new int[3]; int [] neu = new int[17]; alt = neu; // das ist in Java möglich! Eine Matrix kann verschieden lange Zeilen haben int[][] pascaldreieck = { {1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1} }; Wie durchläuft man krumme Reihungen? Die innere for-schleife muss die Länge der zu durchlaufenden Zeilen selber bestimmen Das geht mittels des length-attributs

27 Reihungen: Krumm und schief Durchlauf durch schiefarray for(int zeile=0; zeile < schiefarray.length; zeile++) for(int spalte=0; spalte < schiefarray[zeile].length; spalte++) tuwassinnvollesmit schiefarray[zeile][spalte]; Beispiel Pascal-Dreieck for(int zeile=0; zeile < pascaldreieck.length; zeile++) { pascaldreieck[zeile][0] = 1; pascaldreieck[zeile][zeile]= 1; for(int spalte=1; spalte < pascaldreieck[zeile].length-1; spalte++) pascaldreieck[zeile][spalte] = pascaldreieck[zeile-1][spalte-1] + pascaldreieck[zeile-1][spalte]; 28 Zusammenfassung Reihungen sind mathematisch gesehen endliche Abbildungen von einem Indexbereich auf einen Elementbereich. Im Speicher werden Reihungen repräsentiert als Zeiger auf Vektoren (vgl. später Objekte) Klassische Suchalgorithmen sind die binäre Suche in einer geordneten Reihung und die Suche nach dem Index mit dem kleinsten Element in einer ungeordneten Reihung.