Arrays Arrays Gliederung Algorithmen und Datenstrukturen II Arrays in Haskell 1 D. Rösner Arrays Einleitung Kreieren array listArray accumArray Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Modifikation c Sommer 2009, 6. April 2009, 2009 D.Rösner D. Rösner AuD II 2009 . . . Arrays 1 D. Rösner AuD II 2009 . . . Einleitung Kreieren Modifikation Arrays Arrays in Haskell 2 Einleitung Kreieren Modifikation Arrays in Haskell Arrays (dt. Felder) sind Datenstrukturen, bei denen Elemente über sog. Indizes angesprochen werden um in Haskell mit Arrays arbeiten zu können, muss das entsprechende Bibliotheksmodul importiert werden Indizes sind oft aus einem Abschnitt der natürlichen Zahlen entnommen, aber auch andere elementare Datenstrukturen können als Index fungieren import Array zum Kreieren von Arrays stehen dann die folgenden drei vordefinierten Funktionen zur Verfügung: in Haskell müssen Indices zur Typklasse Ix gehören Indizes können nicht nur eindimensional sein, sondern auch Paare, Tripel oder allgemein n-Tupel von Indexwerten array grenzen listeVonAssoziationen listArray grenzen listeVonWerten accumArray funktion initialwert grenzen listeVonAssoziationen im eindimensionalen Fall spricht man auch von Vektoren, im 2- oder mehrdimensionalen Fall von (2- oder mehrdimensionalen) Matrizen s.a. [RL99], Ch. 2.7.1 s.a. [RL99], Ch. 2.7 D. Rösner AuD II 2009 . . . 4 D. Rösner AuD II 2009 . . . 6 Arrays Einleitung Kreieren Modifikation Arrays Arrays in Haskell Einleitung Kreieren Modifikation Arrays in Haskell die Funktion array der Parameter grenzen gibt im eindimensionalen Fall das Paar aus niedrigstem und höchsten Index und im mehrdimensionalen Fall ein Paar aus dem Tupel der niedrigsten Indices und dem Tupel der höchsten Indices in den jeweiligen Dimensionen die Funktion array der Parameter grenzen wird in gleicher Weise auch bei listArray und accumArray verwendet Beachte: die Grenzen müssen keine Konstanten sein, sondern können sich aus beliebigen Ausdrücken ergeben Beispiele: ein nullbasierter Vektor mit fünf Elementen wird mit den grenzen (0,4) definiert eine in beiden Dimensionen einsbasierte acht-mal-acht-Matrix wird mit den grenzen ((1,1),(8,8)) definiert s.a. [RL99], Ch. 2.7.1 s.a. [RL99], Ch. 2.7.1 D. Rösner AuD II 2009 . . . Arrays D. Rösner AuD II 2009 . . . 7 Einleitung Kreieren Modifikation Arrays Arrays in Haskell 8 Einleitung Kreieren Modifikation Arrays in Haskell die Funktion array der Parameter listeVonAssoziationen erhält eine Liste von als Paar aus Array-Index und zugehörigem Wert geschriebenen sog. Assoziationen Werte für diesen Parameter werden oft durch Listenkomprehensionen bestimmt der Typ eines Arrays wird geschrieben als Array a b dabei ist a der Typ des Index und b der Typ der gespeicherten Werte Beispiele: für die obigen Arrays sind z.B die folgenden Typen möglich: a’ = array (1,4) [(3,’c’),(2,’a’),(1,’f’),(4,’e’)] a’ :: Array Int Char f :: Int -> Array Int Int m :: Array (Int,Int) Int f n = array (0,n) [(i, i*i)| i <- [0 .. n]] m = array ((1,1),(2,3)) [((i,j),(i*j))|i<-[1..2],j<-[1..3]] s.a. [RL99], Ch. 2.7.1 s.a. [RL99], Ch. 2.7.1 D. Rösner AuD II 2009 . . . 9 D. Rösner AuD II 2009 . . . 10 Arrays Einleitung Kreieren Modifikation Arrays Arrays in Haskell Einleitung Kreieren Modifikation Arrays in Haskell Arrays lassen sich durch Rekurrenz-Beziehungen initialisieren listArray grenzen listeVonWerten bei diesen werden Werte bereits initialisierter Indices bei der Definition der Werte anderer Indices verwendet hiermit wird ein Array mit den angegebenen grenzen kreiert und mit den Werten aus listeVonWerten die Zuordnung der Listenelemente erfolgt in Index-Ordnung Beispiel: ein Array mit Fibonacci-Zahlen ergibt sich durch folgende Rekurrenz-Beziehung: Beispiel: a’’= listArray (1,4) "face" liefert den gleichen Array wie a’ = array (1,4) [(3,’c’),(2,’a’),(1,’f’),(4,’e’)] fibs n = a where a = array (1,n) ([(1,1),(2,1)] ++ [(i,a!(i-1)+a!(i-2))|i<-[3..n]]) s.a. [RL99], Ch. 2.7.1 dabei: ! ist ein Infix-Operator (also notiert als array!index) für den Zugriff mit index auf den Wert in einem array D. Rösner AuD II 2009 . . . Arrays 11 D. Rösner AuD II 2009 . . . Einleitung Kreieren Modifikation Arrays Arrays in Haskell 12 Einleitung Kreieren Modifikation Arrays in Haskell accumArray funktion initialwert grenzen listeVonAssoziationen hierbei gilt: Beispiel einer Anwendung von accumArray sei eine Liste vs mit ggf. mehrfach auftretenden Werten aus dem Bereich bounds gegeben die im folgenden definierte Funktion histogram liefert dann ein Array, bei dem der Wert zu jedem Index die Zahl der Vorkommen von Index in der Liste vs ist Definition: histogram bounds vs = accumArray (+) 0 bounds [(i, 1) | i <- vs] die Elemente des Array in den grenzen werden mit dem Wert von initialwert belegt jeder Wert aus listeVonAssoziationen wird mit funktion mit dem bereits vorhandenen Wert akkumuliert listeVonAssoziationen kann also Indizes mehrfach enthalten dies ist bei array anders: hier führen Mehrfach-Vorkommen des selben Index zu ’undefinierten’ Werten s.a. [RL99], Ch. 2.7.1 s.a. [RL99], Ch. 2.7.1 D. Rösner AuD II 2009 . . . 13 D. Rösner AuD II 2009 . . . 14 Arrays Einleitung Kreieren Modifikation Arrays Arrays in Haskell Einleitung Kreieren Modifikation Arrays in Haskell Beispiele für Operator // Modifikation eines Werts a’//[(3,’r’)] Modifikation mehrerer Werte m//[((1,1),4),((2,2),8)] Redefinition von histogram für das elementweise Modifizieren von Arrays steht der Operator // zur Verfügung // wird in Infix-Notation verwendet erstes Argument ist ein Array, zweites eine Liste von Assoziationen Ergebnis ist ein Array, das mit dem ursprünglichen in allen Indexpositionen übereinstimmt, ausser in denen, bei denen die Liste von Assoziationen einen neuen Wert vorsah histogram (lower, upper) xs = updateHist (array (lower, upper) [(i, 0) | i <- [lower..upper]]) xs s.a. [RL99], Ch. 2.7.2 updateHist a [] = a updateHist a (x:xs) = updateHist (a // [(x, (a!x + 1))]) xs s.a. [RL99], Ch. 2.7.2 D. Rösner AuD II 2009 . . . Arrays 16 Einleitung Kreieren Modifikation Literatur: I Fethi Rabhi and Guy Lapalme. Algorithms – A Functional Programming Approach. Pearson Education Ltd., Essex, 1999. 2nd edition, ISBN 0-201-59604-0. D. Rösner AuD II 2009 . . . 18 D. Rösner AuD II 2009 . . . 17