Algorithmen und Datenstrukturen II

Werbung
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
Herunterladen