T Algoritmen und Datenstrukturen Vorlesung Martin Dietzfelbinger Juni S : U [m] U : Universum der Sclüssel [m] ={,,m } : Indebereic für Tabelle T S U, S = n U m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Problem: Kollisionen (unvermeidlic!) Auswege: Verkettung Gesclossenes Hasing b v r u n d a b n v d r u a Analysiere erwartete Kosten für lookup, insert, delete Hierfür genügt: Analysiere erwartete Anzal der Sclüsselvergleice Vorausgesetzt: Irgendeine Quelle für Zufall Pr(A): Warsceinlickeit für Ereignis A E(X): Erwartungswert der Zufallsvariablen X Hatten: Analyse von Hasing mit verketteten Listen unter der abgescwäcten Uniformitätsanname (UF ) : Für je Sclüssel z in U gilt: Pr(() =(z)) m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Einface Hasfunktionen Divisionsrestmetode Multiplikationsmetode Lineare Funktionen über Körper Z p Qualitätskriterien: Ansprucsvollere Hasfunktionen ) Zeit für Auswertung von () (klein!) ) Warsceinlickeit für Kollisionen one Annamen über die Sclüsselmenge S (änlic der zufälligen Situation!) ) Effizientes Generieren einer neuen Hasfunktion (benötigt z B bei der Verdoppelungsstrategie) ) Platzbedarf für die Speicerung von (Programm, Parameter) (gering gegenüber n!) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Universelles Hasing Bei der Festlegung der Hasfunktion wird (kontrolliert) Zufall eingesetzt Randomisierter Algoritmus Analyse berut auf erzwungenen Zufallseigenscaften von nict auf Annamen über S Proposition Es sei U {,,s } r, und m s eine Primzal [Beispiel: U = ASCII = {,,}, s =, m = ] a,,a r seien zufällig gewält aus [m] ={,,,m } (In empty(m)) Definiere ( r ) ( c c r )= a i c i mod m }{{} i= Dann gilt für, z U mit z: Pr(() =(z)) = m Damit ist (UF ) erfüllt! FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Beweis: Sei =(c,,c r ), z =(d,,d r ) Recne im Körper Z m = Z/mZ = [m] (also modulo m) Setze u = z =(c d,,c r d r ) Es gibt m r viele Möglickeiten für a =(a,,a r ) Wie viele davon erfüllen ( r i= a ic i )modm =( r ( i= a id i )modm, r ) d i= a i(c i d i ) mod m =? Dies sind genau die Elemente der Menge ( : Skalarprodukt) W u = {(a,,a r ) Z r m (a,,a r ) u =} Variante: U [p], p Primzal Tabellengröße m p beliebig Wäle a aus {,,p } zufällig Definiere () =((a ) modp) modm Proposition Nun gilt für, z U mit z: Pr(() =(z)) m (Beweis: Modifikation des letzten Beweises) W u ist ein (r )-dimensionaler Untervektorraum von Z r m! Kardinalität: m r, also Anteil an Z r m r m: m r = m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Proposition Wenn man beim multiplikativen Hasing (wobei U =[ k ], m = l ) () =(a mod k ) div k l als a eine zufällige ungerade Zal in [ k ] wält, dann gilt für beliebige, z U, z: (Beweis: Originalliteratur) Pr(() =(z)) l = m Tabellenasing Lineare Funktionen über Z -Vektorraum {, } n : U =Σ r, mit Σ={,,s } m = l mit l w (w: Wortlänge, z B w =) [m] entsprict {, } l Repräsentation der Hasfunktion : Array A[ r, s ] mit Einträgen aus {, } w (c c r )= die ersten l Bits von A[,c ] A[r, c r ] Dabei: ist bitweises XOR, auf ganzes Wort angewendet (Mascinenoperation effizient!) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Beispiel: Σ={, } (Sclüssel sind Zalen in Oktalnotation), w =, r =, l = A: Bucstaben i = Nacteil: Array A[ r, s ] benötigt Platz r s (Wörter) Beispiel: r =ASCII-Zeicen pro Wort, Σ={, }, w = A[ r, s ] benötigt rs(w/)= = Bytes, d knapp kb Sinnvoll nur für große Hastabellen Platzsparend, etwas langsamer: Σ={, }, Tetraden Platz im Beispiel: rs(w/)= = Bytes ((,,,,, )) = (die ersten Bits von ) = (die ersten Bits von ) = FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Vorteile von Tabellenasing: Etrem scnelle Auswertung ( ebenso scnell wie +) Dasselbe A kann für m =,,,, w benutzt werden Ideal für die Kombination mit der Verdoppelungsstrategie: Verdopple Tabellengröße = eröe l um ; Einträge in A bleiben unverändert Beweisbar gutes Veralten, wenn Einträge von A zufällig Proposition Wenn die Einträge in Array A[ r, s ] zufällig gewält werden, dann gilt für, z U mit z: Pr(() =(z)) = m Beweis: Übung Leicte Modifikation von vorerigen Beweisen liefert: Proposition Wenn Pr(() =(z)) c m,für beliebige, z U, z, und wenn wir Hasing mit verketteten Listen benutzen, dann ist die erwartete Zal von Sclüsselvergleicen öcstens c α bei der erfolglosen Suce öcstens + c α (Mittelung über,, n ) bei der erfolgreicen Suce Wenn α α sicergestellt ist, α konstant ( Verdoppelungsstrategie): Erwartete Suczeit ist O() FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Universelles Hasing Eine Menge H von Hasfunktionen, d H { : U [m]}, eißt c-universelle Klasse von Hasfunktionen, wenn für beliebige, z U mit z gilt: { H () =(z)} c H m In anderen Worten: wenn für für beliebige, z U mit z und für zufällig gewältes aus H gilt: Beispiele: Universelles Hasing U [p], p Primzal, Tabellengröße m p beliebig () =((a ) modm, für a {,p } Dann ist H p,m = { a a<p} eine -universelle Klasse Pr(() =(z)) c m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Beispiele: Universelles Hasing U = ASCII r = {,,} r, m> Primzal ( r ) a,,a r (c c r )= a i c i mod m, für c c r U i= Dann ist H m,r = { a,,a r a,,a r [m]} eine -universelle Klasse Multiplikatives Hasing mit zufälligem Faktor fürt zu einer -universellen Klasse Tabellenasing fürt zu einer -universellen Klasse Universelles Hasing Die obige Proposition liest sic nun so: Wenn H c-universell ist und man (in empty(m)) ein aus H zufällig wält, dann gelten die oberen Scranken c α bzw + c α für die Anzal der Sclüsselvergleice bei erfolgloser bzw erfolgreicer Suce FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Gesclossenes Hasing oder offene Adressierung Für jeden Sclüssel U gibt es eine Sondierungsfolge (, ), (, ), (, ), in [m] Beim Einfügen von und Sucen nac werden die Zellen von T in dieser Reienfolge untersuct, bis eine leere Zelle oder der Eintrag gefunden wird Beispiel: Lineares Sondieren (, k) =(()+k) modm, k =,,, ( ) Günstig: (, ), (, ), (, ),, (, m ) erreict jede Zelle, d : ((, ),(, ),(, ),,(, m )) ist eine Permutation von [m] Wenn ( ) gilt und mindestens eine Zelle in T leer ist, dann endet jede erfolglose Suce in einer leeren Zelle Bei linearem Sondieren: (, k) =(()+k) modm Andere Folgen sind möglic, zum Beispiel FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Quadratisces Sondieren : U [m] sei beliebige Hasfunktion (, ) = () (, ) = (()+)modm (, ) = (() ) mod m (, ) = (()+)modm (, ) = (() ) mod m (, ) = (()+)modm (, ) = (() ) mod m (, k) = ( ()+ k/ ( ) k+) mod m Fakt Ist m Primzal, m =l +für ein l N, dann ist {(, k) k<m} =[m], d( ) gilt (Beweis: Elementare Zalenteorie) Beispiel: m =, () =, liefert Sondierungsfolge,,,,,,,,,,,,,,,,,, Beobactung Quadratisces Sondieren verält sic der Erfarung nac ser gut (Vor: gut verteilend, Auslastungsfaktor,) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Doppel-Hasing Benutze zwei (unabängig berecnete) Hasfunktionen und setze, für k =,,,: : U [m] : U [m ] (, k) :=( ()+k ( + ())) mod m Beispiel: m =, () =, () =, liefert Sondierungsfolge,,,,,,,,,,,, Übung: Berecne die Folgenglieder inkrementell (Runden k =,,,) one Multiplikationen und Divisionen ( mod m ) (, k) :=( ()+k ( + ())) mod m Proposition Wenn m Primzal ist, dann gilt für Doppel-Hasing: ( ) {(, k) k<m} =[m] Beweis: Sei z =+ () Dann: z m Wenn (, k) =(, l), dann ist ( ()+k z) modm =( ()+l z) modm, also (l k) z (mod m), d m teilt (l k) z Da m Primzal ist und z<m, teilt m die Zal l k, also ist k = l, weil k, l < m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Mitteilung Wenn m = l, : U [m], : U [m/], dann: { ()+k ( ()+) k<m} =[m] Beispiel: m =, () =, () =, liefert Sondierungsfolge,,,,,,,,,,,,,,, Ebenfalls für Doppel-Hasing geeignet, einfacste Berecnung der Folge! (Addition, Bitmaske) Man kann beweisen: Wenn (), (), S, rein zufällig sind, verält sic Doppel-Hasing ser gut, nämlic im wesentlicen wie Uniformes Sondieren Uniformes Sondieren / Ideales Hasing Keine Metode, sondern eine Warsceinlickeitsanname für Verfaren mit offener Adressierung: ((, ),(, ),,(, m )) ist eine rein zufällige Permutation von [m], unabängig für jedes U (Erinnerung: Es gibt m! versciedene Permutationen von [m]) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Effekt:,, n seien gespeicert; y kommt neu inzu Ganz egal was die Haswerte von,, n und was (y, ),,(y, k ) sind: (y, k) nimmt jeden Wert j [m] {(y, ),,(y, k )} mit derselben Warsceinlickeit /(m k) an n: Anzal der Sclüssel in T[ m ]; α = n m T m,n := Zal der untersucten Fäcer (Sondierungen) bei erfolgloser Suce C m,n := E(T m,n) T m,n := Zal der untersucten Fäcer bei erfolgreicer Suce, gemittelt über,, n C m,n := E(T m,n ) Satz Unter der Anname Uniformes Sondieren gilt: (i) C m,n = m+ m+ n = m+ n ( < n/m = α Wenn α fest und n, m, dann gilt C m,n α ) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Beweis:,, n sind gespeicert, y/ {,, n } wird gesuct Es gibt zwei Fälle: Fall: T[(y, )] ist leer Warsceinlickeit: m n m Kosten: Fall: T[(y, )] ist nict leer Warsceinlickeit: n m Kosten: +C m,n (Suce in m Plätzen, von denen n besetzt sind) Rekursionsformel, für n<m: {, falls n = C m,n = m n m + n m ( + C m,n ), falls n C m, = ; C m, = m m + m C m, = m m + m C m, = m m + m und so weiter Dies liefert: + (+)=m m ; ( + m ) m ( + m ) m C m,n = m + m + n (Formaler Beweis durc vollständige Induktion) =+ m = m + m ; =+ m = m + m ; FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Satz Unter der Anname Uniformes Sondieren gilt bei α = n/m: (i) C m,n = m+ m+ n = m+ n Dies ist < n/m = α Wenn α fest und n, m, dann gilt C m,n α (ii) Für T m,n = mittlere (über S) erwartete (mit (UF ) Anzal getesteter Tabellenplätze bei erfolgreicer Suce gilt: C m,n = E(T m,n ) < α ln( α ) Beweis: Sucaufwand für i = Einfügeaufwand für i Also Mittelung über C m,,c m,,,c m,n : C m,n = n i n = m + n m + m + (i ) ( m + + ) m + + m + (n ) Leict zu seen (Untersumme!): m+ + m + + m+ (n ) m+ ( = ln(m +) ln(m + n) =ln dt m+ n t = m+ m+ n ) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Also: C m,n m + n ( ) ln n m+ (!) < m ( ) n ln n m Für α = n/m, α fest, n, m, ist C m,n α ln( α ) (!) Für < beweist man durc Kurvendiskussion: α α ln( α ) ist für <α< monoton wacsend Bemerkung: Für α get α ln( α ) etrem langsam gegen Uniformes Hasing Anzal Vergleice α erfolglos erfolgreic FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Löscungen? Problem: Z B Quadratisces Sondieren Sucfolge Dezember mit (Dezember) =:,,, Lösce Juli! T : : : : : : : : : : : : : : April () August () Oktober () Mai () November () Juli () Juni () Januar () Februar () September () Dezember () Maerz () FG KTuEA, TU Ilmenau AuD Löscungen? Problem: Z B Quadratisces Sondieren Sucfolge Dezember mit (Dezember) =:,,, T : : : : : : : : : : : : : : April () August () Oktober () Mai () November ()!!! Juni () Januar () Februar () September () Dezember () Maerz () Lösce Juli! Dezember wird nict mer gefunden FG KTuEA, TU Ilmenau AuD Ausweg: Zelle at Statusvariable status (voll, leer, gelösct ) Löscen: Zelle nict auf leer, sondern auf gelösct setzen Sucen: Immer bis zur ersten leer en Zelle geen Zellen, die gelösct sind, dürfen mit einem neuen Sclüssel überscrieben werden Überlauf tritt spätestens ein, wenn die letzte leer e Zelle bescrieben werden würde Sinnvoller: Überlauf tritt ein, wenn die Anzal der voll en und gelösct en Zellen zusammen eine feste Scranke bound überscreitet ZB m oder α m, α passend zum Sondierungsverfaren Operationen bei offener Adressierung empty(m): Lege leeres Array T[ m ] an Initialisiere alle Zellen T[j] mit (,, leer) Initialisiere inuse mit (Zält nict-leere Zellen) Initialisiere load mit (Zält Einträge) Initialisiere bound (maimal m ) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Operationen bei offener Adressierung lookup(): Finde erstes l in der Folge (, ), (, ), (, ), mit T[l]status = leer oder (T[l]status = voll und T[l]key = ); Falls T[l]status = leer : return not found ; Sonst: return T[l]data Operationen bei offener Adressierung delete(): Finde erstes l in der Indefolge (, ), (, ), (, ), mit T[l]status = leer oder (T[l]status = voll und T[l]key = ); Falls T[l]status = leer : tue nicts; ( Warnung: not found ) Sonst: T[l]status gelösct; load-- FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Operationen bei offener Adressierung insert(, r): Finde erstes l in der Indefolge (, ), (, ), (, ), mit T[l]status = leer oder (T[l]status = voll und T[l]key = ); Merke dabei das erste l in dieser Folge, das T[l ]status {gelösct, leer} erfüllt; Fall : T[l]status = voll : T[l]data r; ( Update ) Fall : T[l ]status = gelösct: T[l ] (, r, voll ); load++; Fall : T[l ]status = leer : ( l = l, neue Zelle ) if inuse +> bound ten Überlaufbeandlung else inuse++; load++; T[l] (, r, voll ); Operationen bei offener Adressierung Überlaufbeandlung, Verdopplung: Sinnvoll: Überlauf tritt ein, wenn die Anzal der voll en und gelösct en Zellen zusammen (in inuse) eine Scranke α m (in bound) überscreitet (α passend zum Sondierungsverfaren festlegen) Anzal der voll en Zellen: load Falls load + >α m für (z B) α =α, verdopple Tabellengröße, und trage Sclüssel neu in die größere Tabelle ein Sonst: Trage alle Sclüssel neu in die alte Tabelle T ein, eliminiere alle gelösct -Markierungen, wie folgt FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Operationen bei offener Adressierung Trick für Umorganisieren: (One zusätzlicen Platz) ) Für i =,,,m tue folgendes: Wenn T[i]status = voll, setze T[i]status alt Wenn T[i]status = gelösct, setze T[i]status leer ) Für i =,,,m tue folgendes ( cecke jeden Platz ): Wenn T[i]status = alt, dann setze (, r) (T[i]key, T[i]data), setze T[i]status = leer, und füre insert (, r) aus dabei weist insert (, r) folgende Besondereit auf: Wenn eine mit alt markierte Zelle gefunden wird, wird sie wie leer beandelt, der dort entaltene Eintrag (,r ) wird durc (, r, voll ) verdrängt; sofort anscließend wird insert (,r ) ausgefürt; dies setzt sic fort, bis eine Einfügung in eine mit leer markierte Zelle erfolgt (Erst dann färt man mit der Abarbeitung der i-scleife fort) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD () m Cuckoo Hasing Kuckucks-Hasing [-] T y T y () m Implementierung eines dynamiscen Wörterbucs mit konstanter Suczeit im sclectesten Fall Tabellen T,T,Größe jeweils m; Eintrag/Platz Invariante: S ist in T [ ()] oder in T [ ()] gespeicert Konstante Suczeit garantiert Kuckucks-Hasing Grundansatz: Sondierungsfolge at nur Länge Auc Rückwärtsgeen in der Sondierungsfolge und Verdrängen von Sclüsseln möglic Kuckucks-Hasing wegen interessanter Einfügeprozedur: Sclüssel, der eingefügt werden soll, kann anderen Sclüssel y, der in T [ ()] oder T [ ()] sitzt, inauswerfen FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Kuckucks-Hasing T T m m Füge ein Versuce T [ ()] Besetzt! FG KTuEA, TU Ilmenau AuD Kuckucks-Hasing T T m m Sclüssel aus T inauswerfen FG KTuEA, TU Ilmenau AuD Kuckucks-Hasing T T m m Sclüssel aus T inauswerfen FG KTuEA, TU Ilmenau AuD Kuckucks-Hasing T m m T Sclüssel aus T inauswerfen FG KTuEA, TU Ilmenau AuD
Kuckucks-Hasing T T Kuckucks-Hasing T T fertig! m m m m Sclüssel aus T inauswerfen Sclüssel in T einfügen Fertig! FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Kuckucks-Hasing Mitteilung Sei m ( + ε)n, für eine Konstante ε>: Wenn, vollständig zufällig sind (UF ), dann gilt: ) Die Warsceinlickeit, dass beim Einfügen von n Sclüsseln einmal eine Verklemmung (unendlice Scleife) auftritt, ist O(/n) (Im Algoritmus: abfangen!) Bei m ( ε)n: Hoe Warsceinlickeit für Verklemmung ) Die erwartete Einfügezeit ist O(/ε) Beweis: Originalliteratur, fortgescrittene Vorlesungen Praktisc ser effizient (auc mit Tabellenasing, jedoc lineare Hasfunktionen lieber nict benutzen!) Nacteil: Auslastung der Tabelle unter % d-äres Kuckucks-Hasing d Has-Funktionen,, d : U [m], eine Tabelle T [ m ] S muss in einer der Zellen T [ i ()] gespeicert sein, i =,,d Suce erfordert d Auswertungen von Hasfunktionen und Arrayzugriffe, Zeit O(d) FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Bei d Funktionen genügt Platz m =(+ε)n, mit ε>ε d Dabei: ε d log (e)e d für d Beispielwerte: d +ε d,,,, Beobactung: Erwartete Einfügezeit mit Kuckucks- Verfaren konstant (teoretisc noc nict voll analysiert) Hervorragendes Veralten in Eperimenten Kuckucks-Hasing mit Funktionen und Blöcken z y S n = ε= m= m Tabelle T [m ] at m Blöcke mit Kapazität jeweils d Günstig für Cace-Arcitekturen! FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Mitteilung Sei S U mit S = n Wenn die Funktionen, die Unabängigkeitsbedingung (UF ) erfüllen, dann gilt: Wenn m ( + ε)n/d, mit ε>(e/) d, dann passen und für S mit oer Warsceinlickeit, d man kann die n Sclüssel so auf die m Fäcer verteilen, dass in Fac () oder () sitzt und in keinem Fac mer als d Sclüssel untergebract sind Mitteilung Falls S zu Anfang gegeben ist ( statiscer Fall ): Es gibt ein ser effizientes Verfaren zur Verteilung der Sclüssel ( selfless algoritm ) Eperimente: Kumulative Laufzeiten für erfolgreice Suce Jeder von Sclüsseln wird einmal gesuct Jeweils: bestes d Beobactung: Kuckucksverfaren (sclectester Fall!) mit Linearem Sondieren (durcscnittlic!) konkurrenzfäig ε cuckoo-d-ary cuckoo-block Lin Sond time [s] d time [s] d time [s] FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Eperimente: Kumulative Laufzeiten für erfolglose Suce Sclüssel gespeicert; andere werden gesuct Jeweils: bestes d Beobactung: Kuckucksverfaren sclägt Lineares Sondieren bei etrem voll gepackten Tabellen ε cuckoo-d-ary cuckoo-block Lin Sond time d time d time Einfügen mit der randomisierten Kuckucks-Prozedur Zu Sclüssel berecne () und () Falls in einem der beiden Fäcer Platz ist (Beladung <d): Füge an beliebiger Stelle ein Falls beide Fäcer voll: Wäle einen zufälligen der d Sclüssel in diesen Fäcern, genannt y, verdränge in, setze an seinen Platz Nun beginne mit der Einfügung von y FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Einfügen mit der randomisierten Kuckucks-Prozedur Einfügen mit der randomisierten Kuckucks-Prozedur m m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Einfügen mit der randomisierten Kuckucks-Prozedur Einfügen mit der randomisierten Kuckucks-Prozedur m m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Einfügen mit der randomisierten Kuckucks-Prozedur Einfügen mit der randomisierten Kuckucks-Prozedur y m m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD
Einfügen mit der randomisierten Kuckucks-Prozedur y Einfügen mit der randomisierten Kuckucks-Prozedur m m FG KTuEA, TU Ilmenau AuD FG KTuEA, TU Ilmenau AuD Eperimente: Kumulative Laufzeiten für Einfügen Sclüssel Jeweils: bestes d Beobactung: Kuckucksverfaren nur um Faktor langsamer als Lineares Sondieren ε cuckoo-d-ary cuckoo-block Lin Sond time [s] d time [s] d time [s] FG KTuEA, TU Ilmenau AuD