Felder Universität Bielefeld AG Praktische Informatik November 5, 2014
Felder: Datenstrukturen mit konstantem Zugriff Felder nennt man auch, Vektoren, Matrizen,... Konstanter Zugriff heisst: Zugriff auf Elemente mit Aufwand unabhängig von der Größe der Datenstruktur. Gegenbeispiel Musik: Finden der n-ten Note erfordert Durchlauf der Datenstruktur in n oder mehr Schritten. Allerdings: Die Noten sind nicht nummeriert.
Felder: Datenstrukturen mit konstantem Zugriff Felder nennt man auch, Vektoren, Matrizen,... Konstanter Zugriff heisst: Zugriff auf Elemente mit Aufwand unabhängig von der Größe der Datenstruktur. Gegenbeispiel Musik: Finden der n-ten Note erfordert Durchlauf der Datenstruktur in n oder mehr Schritten. Allerdings: Die Noten sind nicht nummeriert. Besseres Gegenbeispiel: Listen hier sind die Elemente ab 0 nummeriert...
Zugriff auf Listenelemente Listen beherbergen viele Elemente gleichen Typs. Sequentielle Abarbeitung ist einfach und effizient, z.b. 1 map f [] = [] 2 map f ( x: xs) = f x : map f xs Random Zugriff auf einzelne Elemente durch operator!! hängt von der Listenlänge ab: 1 (x:xs)!! 0 = x 2 (x:xs)!! n = xs!!(n -1) Abhilfe schafft der Datentyp Array a b
Datentyp Array a b auf Deutsch Felder Modul Data.Array stellt Datentyp Array a b und Funktionen darauf bereit a ist der Datentyp des Index, b der Elementtyp Operator! für Element-Zugriff bietet effizienten Random-Access Indextyp erlaubt mehrere Dimensionen Funktion array liefert ein Array zurück
Datentyp Array a b auf Deutsch Felder Modul Data.Array stellt Datentyp Array a b und Funktionen darauf bereit a ist der Datentyp des Index, b der Elementtyp Operator! für Element-Zugriff bietet effizienten Random-Access Indextyp erlaubt mehrere Dimensionen Funktion array liefert ein Array zurück 1 a r r a y : : ( I x a ) => ( a, a ) > [ ( a, b ) ] > Array a b 2 3 t = a r r a y ( low, h i g h ) l i s t _ o f _ e n t r i e s =...
Datentyp Array a b auf Deutsch Felder Modul Data.Array stellt Datentyp Array a b und Funktionen darauf bereit a ist der Datentyp des Index, b der Elementtyp Operator! für Element-Zugriff bietet effizienten Random-Access Indextyp erlaubt mehrere Dimensionen Funktion array liefert ein Array zurück 1 a r r a y : : ( I x a ) => ( a, a ) > [ ( a, b ) ] > Array a b 2 3 t = a r r a y ( low, h i g h ) l i s t _ o f _ e n t r i e s =... 1 (!) :: (Ix a) => Array a b -> a -> b
Beispiel: 2D Array 1 > module Arr 2 > where 3 > import Data. Array 4 5 > t a b l e : : Array ( Char, I n t ) I n t 6 > t a b l e = a r r a y ( ( a, 0 ), ( c, 2) ) 7 > [ ( ( a, 0 ), 0 ), 8 > ( ( a, 1 ), 1 ), 9 > ( ( a, 2 ), 2 ), 10 > ( ( b, 0 ), 3 ), 11 > ( ( b, 1 ), 4 ), 12 > ( ( c, 0 ), 6 ), 13 > ( ( c, 1 ), 7 ), 14 > ( ( b, 2 ), 5 ), 15 > ( ( c, 2 ), 8 ) 16 > ] 17 18 > a c c e s s a b = t a b l e! ( a, b ) 19 > a c c e s s 2 = ( t a b l e! )
Alternative Pattern Matching als Alternative für read-only Felder vs. Feldgröße
Alternative Pattern Matching als Alternative für read-only Felder vs. Feldgröße Example 1 access a 0 = 0 2 access a 1 = 1 3 access a 2 = 2 4 access b 1 = 3 5...
Beispiel: Umwandlung String in Char Array 1 2 > s2a : : S t r i n g > Array I n t Char 3 > s2a xs = l i s t A r r a y ( 0, length xs 1) xs
Akkumulierende Manchmal kann man die Einträge eines Feldes nicht auf einmal ausrechnen. Dafür gibt es die Funktion 1 > accumarray :: Ix a = > 2 (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b 3 4 akkumulierende Bereich Ergebnis 5 Fkt. Startwert Elemente
Akkumulierende Manchmal kann man die Einträge eines Feldes nicht auf einmal ausrechnen. Dafür gibt es die Funktion 1 > accumarray :: Ix a = > 2 (b -> c -> b) -> b -> (a,a) -> [(a,c)] -> Array a b 3 4 akkumulierende Bereich Ergebnis 5 Fkt. Startwert Elemente Der Aufruf accumarray f s (lo,up) assocslist erlaubt fehlende wie mehrfache Auftreten des Indices in den Associations initialisiert alle Elemente mit dem Startwert s akkumuliert mehrfache Auftreten (i,x),...,(i,y),...,(i,z) in der Form (((s f x) f y) f z) in Element i
Akkumulierende Beispiel: Zählen der Buchstabenhäufigkeit in einem Text 1 > frq :: String - > Array Char Int 2 > frq t = accumarray (+) 0 ( A, z ) ( zip t ones ) 3 > where ones = 1: ones
Akkumulierende Beispiel: Zählen der Buchstabenhäufigkeit in einem Text 1 > frq :: String - > Array Char Int 2 > frq t = accumarray (+) 0 ( A, z ) ( zip t ones ) 3 > where ones = 1: ones Damit z.b. 1 Arr > frq " abraham "! a 2 3 3 Arr > frq " abraham "! U 4 0
von Funktionen 1 Gegeben eine Funktion, die aufwendig zu berechnen ist: 2 > s i d : : I n t > I n t 3 > s i d x = ( x +1) (x 1) (x 2) ( x+2)+(x round 3. 1 )
von Funktionen 1 Gegeben eine Funktion, die aufwendig zu berechnen ist: 2 > s i d : : I n t > I n t 3 > s i d x = ( x +1) (x 1) (x 2) ( x+2)+(x round 3. 1 ) 1 Wenn die Werte (aus einem bekannten Intervall) immer wieder gebraucht werden, nimmt man eine interne Tabelle 2 > f i d : : I n t > I n t 3 > f i d = ( f! ) where 4 > f = a r r a y ( 0, 1 0 0 ) 5 > [ ( x, ( x +1) ( x 1) (x 2) ( x+2)+(x round 3. 1 ) ) 6 > x < [ 0.. 1 0 0 ] ] Das funktioniert schneller, aber nur über dem vorgesehenen Intervall.
von Funktionen ist eine allgemeine Technik. Können wir eine Funktion tabulate schreiben, die andere Funktionen in tabellierte Funktionen verwandelt? Was wäre ihr Typ?
von Funktionen 1 ist eine allgemeine Technik. Können wir eine Funktion tabulate schreiben, die andere Funktionen in tabellierte Funktionen verwandelt? Was wäre ihr Typ? 2 > t a b u l a t e : : ( Int, I n t ) >(Int >a) >(Int >a )
von Funktionen 1 ist eine allgemeine Technik. Können wir eine Funktion tabulate schreiben, die andere Funktionen in tabellierte Funktionen verwandelt? Was wäre ihr Typ? 2 > t a b u l a t e : : ( Int, I n t ) >(Int >a) >(Int >a ) Und was muss sie tun? Wir fordern x, f: (tabulate f) x = f x nur schneller!
von Funktionen 1 ist eine allgemeine Technik. Können wir eine Funktion tabulate schreiben, die andere Funktionen in tabellierte Funktionen verwandelt? Was wäre ihr Typ? 2 > t a b u l a t e : : ( Int, I n t ) >(Int >a) >(Int >a ) Und was muss sie tun? Wir fordern x, f: (tabulate f) x = f x nur schneller! 1 > t a b u l a t e ( lo, up ) f = ( t! ) where 2 > t = a r r a y ( lo, up ) ( z i p domain (map f domain ) ) 3 > domain = [ l o.. up ]
von Funktionen 1 Damit nun einfach für beliebige Funktionen über einem Intervall, aber hier am Beispiel sid 2 > t i d : : I n t > I n t 3 > t i d = t a b u l a t e ( 1, 1 0 0 ) s i d Betrachte die Anzahl der Rechenschritte bei mehrfachen Aufrufen von sid 42, fid 42, tid 42...