9.4 Multimengen (multisets, bags) Elemente können „mehrfach auftreten“ („Folge ohne Ordnung“) Schreibweise: {| 1,2,2,3,4,4,4 |} Anwendungen: Histogramme, Meßreihen, ... Spezifikation: type Bag t = t -> Int Meistens ist t linear geordnet. Operationen wie bei Mengen; zusätzlich anzahl x bag = bag x Repräsentationen: - sortierte Folge - Suchbaum mit <= statt < - Bei großen Anzahl besser Modell tabellieren (9.5) 9.5 Relationen = Mengen von Tupeln – aber mit speziellen Operationen type Relation t1 t2 = {(t1,t2)} Modell: Rechtseindeutige Relation ist Abbildung: „Schlüssel“ -> „Daten“ inv r = card(map fst r) == card r („tabellierte Abbildung“) oder type Map k d = k -> d Schlüsselmenge meist linear geordnet Signatur und Semantik für Map mit geordneten Schlüsseln: leer :: Ord k => Map k d leer = {} -- (engl. empty) einfügen :: Ord k => (k,d) -> Map k d -> Map k d einfügen(k,d)m = if k `elem` map fst m then error „key clash“ else m ++ {(k,d)} -- (engl. enter, insert) löschen :: Ord k => k -> Map k d -> Map k d löschen k m = if k `elem` map fst m then m – {(k,suchen k m)} else error „no such key“ -- (engl. delete, remove) suchen :: Ord k => k -> Map k d -> d suchen k m = if k `elem` map fst m then snd(fromJust(find(\x->k==fst x)m)) else error „no such key“ -- (engl. lookup, search) fortschreiben :: Ord k => (k,d) -> Map k d -> Map k d fortschreiben(k,d)m = if k `elem` map fst m then einfügen(k,d)(löschen k m) else error „no such key“ -- (engl. update) traversieren ... . . . Repräsentationen: Alle Repräsentationen für Mengen/Multimengen (insbesondere geordnete) - bezogen auf die Schlüsselmenge, - mit „angehängten“ Daten.