ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

53
Algorithmen und Datenstrukturen (ALP 3) Simon Putzke - 16. Oktober 2008 21. Oktober 2008 23. Oktober 2008 30. Oktober 2008 04. November 2008 06. November 2008 11. November 2008 13. November 2008 18. November 2008 20. November 2008 25. November 2008 27. November 2008 02. Dezember 2008 04. Dezember 2008 09. Dezember 2008 1

description

This is my paper of the ALP lecture at Uni.It is in german and mainly about abstract data types as trees, heaps and these kinds.

Transcript of ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Page 1: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Algorithmen und Datenstrukturen (ALP 3)

Simon Putzke

-

• 16. Oktober 2008

• 21. Oktober 2008

• 23. Oktober 2008

• 30. Oktober 2008

• 04. November 2008

• 06. November 2008

• 11. November 2008

• 13. November 2008

• 18. November 2008

• 20. November 2008

• 25. November 2008

• 27. November 2008

• 02. Dezember 2008

• 04. Dezember 2008

• 09. Dezember 2008

1

Page 2: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Inhaltsverzeichnis

1 Analyse von Algorithmen 4

1.1 E!zienz (insbesondere Laufzeit) von Algorithmen . . . . . . . . . . . . . . . . . . . . . 4

1.1.1 Experimentelle Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.1.2 Theoretische Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.1.3 Pseudo- Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.1.4 Registermaschine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.1.5 Laufzeit von Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.1.6 Asymptotisches Laufzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.1.7 Rekursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.1.8 Rekursion auf der RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.2 Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.2.1 Beispiel Stapel (Stack) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.2.2 “Indirekte” Anwendung von Stapeln . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.3 Dynamisierung Array- basierter Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . 20

2 Datenabstraktion 24

2.1 Geheimnisprinzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.2 Abstrakte Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2.1 Explizite Schnittstellenbeschreibung in Java . . . . . . . . . . . . . . . . . . . . . 26

3 ADT- Anwendungen, Implementierungen 28

3.1 Der ADT - Prioritätswarteschlange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.1.1 Implementierung des ADT PWS (für U = N) . . . . . . . . . . . . . . . . . . . . 29

3.2 Implementieruung des Heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.3 Erweiterung des ADT PWS : VPWS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.4 neue Implementierung als Binomialheaps . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.5 Lokalisierung von Einträgen in Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . 39

3.6 Bäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

3.6.1 Schnittstelle zum ADT Baum (Auswahl) . . . . . . . . . . . . . . . . . . . . . . . 41

3.6.2 weitere Anwendungen: Spielbäume . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3.6.3 Breitensuche in Bäumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

2

Page 3: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

3.6.4 Tiefensuche in Bäumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.7 ADT Wörterbuch (Dictionary) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.7.1 Implementierung des ADT Wörterbuch . . . . . . . . . . . . . . . . . . . . . . . 46

3.7.2 Implementierung durch Hashing . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

3.7.3 Hashcodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

3.7.4 Zufallsexperiment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.7.5 Universelle Hashfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

3

Page 4: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

16. Oktober 2008

1 Analyse von Algorithmen

“Def.”: Ein Algorithmus ist eine Schritt-für-Schritt Anleitung zur Lösung eines Problems

• Speicherverbrauch kann durch geeigneten Algorithmus gering gehalten werden

• Zeitbedarf kann durch geeigneten Algorithmus gering gehalten werden

Frage nach

1. der E!zienz von Algorithmen

2. der Korrektheit von Algorithmen

1.1 E!zienz (insbesondere Laufzeit) von Algorithmen

• Algorithmus transformiert Eingabe in Ausgabe

• Die Laufzeit eines Algorithmus hängt von der Größe der Eingabe ab

(Funktion die einer Eingabe die Laufzeit des Algorithmus darauf zuordnet)

1.1.1 Experimentelle Analyse

oft gar nicht möglich, bzw. sinnvoll

• Implementierung

• Messung der Laufzeit auf vielen, “typischen” Eingaben

Problematisch!

4

Page 5: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

1.1.2 Theoretische Analyse

• abstrakte Beschreibung des Algorithmus (Pseudocode)

• Charakterisierung der Laufzeit (als Funktion der Größe der Eingabe)

• dabei betrachten wir den schlechtesten Fall für alle Eingaben fester Länge (“worst case”- Analyse)

1.1.3 Pseudo- Code

• abstrakte Beschreibung eines Algorithmus “Programm”

• “strukturierter” (& detaillierter) als prosaische Beschreibung

• weniger detailliert als Java- Programm

Bsp.

ArrayMax (A, n)

Input: Feld A [1, ..., n] von n ganzen Zahlen

Output: max1! i!n A [i]

currentMax ! A [1]

for i = 2 to n

if current Max < A [i] then currentMax = A [i]

return currentMax

Im Detail:

• Kontrollflussanweisungen (for, while, repeat, if then ... else, goto)

• Deklariationen

• Methodenaufrufe

• Wertrückgabe

• Ausdrücke (Zuweisungen, Tests, ...)

“Verboten”:

ArrayMax+ (A, n)

return max1! i!n A [i]

• nicht verboten bei Test auf Korrektheit, aber bei Analyse

5

Page 6: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

1.1.4 Registermaschine

• Rechenkern = arithm. Operationen (+, -, ·, /)

• Kontrollflussoperationen (JMP, bedingte Sprünge)

• all diese Operatoren können in einem Takt bearbeitet werden

– linear organisierter Speicher mit whalfreiem Zugri"

" jede Zelle kann eine ganze Zahl speichern" auf jede Zelle kann in einem Takt (durch Angabe der Adresse) zugegri"en werden" der Speicher ist unbegrenzt

Pseudo Code ist O.K. falls jede primtive Operation durch # 10 RAM- Anweisungen ausgeführt werdenkann.

1.1.5 Laufzeit von Algorithmen

Def:

A Algorithmus (RAM- Programm)

I Eingabe für A

TA(I) = Anzahl der RAM Operationen die A auf Eingabe I macht “Rechenzeit von A uf I”

TA(n) = max maxI,Groesse von I=n TA(I) “worst- case Rechenzeit von A”

Laufzeit von A (Funktion N $ N)

Beispiel (I) mit Addition:

Algorithm double ( x )

6

Page 7: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Input x % N

Output 2xy <& xy <& y + xreturn y

(Pseudocode)

LOAD 0 (CPU <& x )STORE 1 (CPU <& y )LOAD 1 (CPU <& y )ADD 0 (CPU <&CPU + x)STORE 1 (CPU <& y )LOAD 1 (CPU <& y )RETURN RAM

Beispiel (II) ohne Addition:

Algorithm double ( x )

Input x % N

Output 2xz <& xy <& xf o r i=1 to z doy <& y + 1return y

(Pseudocode)

TA(x)& ”3 + 2x

Typischerweise analyisieren wir Algorithmen im Pseudocode (Laufzeit 'Anzahl der Pseudocodezeilen)

Das ist zulässig, solange der verwendete Pseudo- Code die Eigenschaft hat, dass jede Code- Zeile durchkonstant viele RAM- Operationen realisiert wrrden können.

7

Page 8: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

1.1.6 Asymptotisches Laufzeit

• “moderate” Änderungen des Maschinenmodells ändern die Laufzeit nur um einen konstantenFaktor.

• die asymptotische Laufzeit ignoriert konstante Faktoren und Terme niederer Ordnung.

Bsp.:

TA(n) = 1, 75n3 + (0, 4 log2n) = !(n3)

Erinnerung (O- Notation):DEF.:

f, g % NN

f = O(g) ( )c > 0 )n0 % N *n + n0 : f(n) # c · g(n)

manchmal schreibt man auch für f = O(g) auch

1. f(n) = O(g(n))

2. f % O(g)

BSP :

1. 12n& 4 # 12n d.h. 12n& 4 = O(n)

2. n2 = O(n) gilt nicht!!

O-Notation HOWTO1.)

f(n) =!d

i=0 aini mit ai + 0

f(n) = O(nd)

2.)

Wir sagen ”2n = O(n)” statt ”2n = O(n2)”

3.)

Wir sagen ”2n = O(n)” statt ”2n = O(3n& 6)”

4.)

Die Analogie O=̂ #, "=̂ +, !=̂ =

klappt oft (aber Vorsicht: nicht immer)

5.)

8

Page 9: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

n! = O(n") *" # #

6.)

(log n)! = O(n") *", # > 0

Beispiel:

Algorithm PrefixAverage (X, n)

Input X[0], . . . , X[n& 1], n

Output A[0], . . . , A[n& 1] mit A[i] = 1i+1

!j!i A[j]

A<&l e e r e s Feld mit n Elementen //1&mal durch lau fenf o r i = 0 to n&1 do //n&mal durch lau fensum <& 0 //n&mal durch lau fenf o r j = 0 to i do //( i+1 mal durch lau fen )sum <& sum + X[ j ] //im i&ten Durchlauf der äußeren S c h l e i f eA[ i ] <& (sum)/( i +1) //n&mal durch lau fenreturn A //1&mal durch lau fen

Gesamtkosten:

O(1)"#$%1&7

+O(n)" #$ %2&6,3

+O(n"1&

i=0

(i + 1))

" #$ %4&5

= O(1) + O(n) + O(n2) = O(n2)

Algorithmus PrefixAverage2 (A,n)

In : s . o .Out : s . o .A <& l e e r e s Feld //1&malsum <& 0 //1&malf o r i = 0 to n&1 do //n&malsum <& sum + X[ i ] //n&malA[ i ]<& (sum)/( i +1) //n&malreturn A //1&mal

Laufzeit O(n)

1.1.7 Rekursion

Beispiel:

Potenzieren x, n % Np(x, n) := xn = x · . . . · x" #$ %

n"mal

9

Page 10: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Lösung 1: Iterartiv O(n)

Lösung 2: p(x, n) =

'x · p(x, n& 1)

1n > 0n = 0

Algorithm Pow (x,n)

Input x, n % N

Output xn

i f n = 0 then return 1return x " Pow (x , n&1)

Laufzeit:

T (n) =

'O(1)

T (n& 1) + O(1)n = 0n > 0

Lösung (n > 0) mit C > 0

T (n) # T (n& 1) + C # T (n& 2) + 2 · C # T (n& 3) + 3 · C

per Induktion: T(n) # T(n& k) + k · C

*k # 1 für k = n: T (n) # T (0) + n · C

Beweis:

x · Pow(x, n& 1)

x"Pow(x , n&1)=x"x"Pow(x , n&2)=x"x"x"Pow(x , n&3)=x"(n&mal )"x"Pow(x , 0 ) //Pow(x ,0)=1

Damit T (n) = O(n)

Lösung 3:

p(x, n) =

()*

)+

1,p

,x, n

2

--2

,p

,x, n"1

2

--2 · x

n = 0n = 2k

n = 2k & 1

Algorithm PowFast(x,n)

i f n=0 return 1i f n=2k thenz <& PowFast (x , 1/2 ) // n i cht so ! Syntakt i s ch aber kor rektre turn z"zi f n=2k+1 thenz <& PowFast (x , ( n&1)/2)re turn z"z"x

10

Page 11: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Laufzeitanalyse

Beschränken auf n = 2r für r + 0

T (n) =

'O(1)

T,

n2

-+ O(1)

n = 1n > 1

S(r) := T(2r)

S(r) =

'O(1)

S(r & 1) + O(1)r = 1r > 0

wie in (2:)

S(r) = O(r) = T (2r)

also

T (n) = O(log n)

28.Oktober 2008

1.1.7.1 Rekursionsbäume

Bsp.: PowFast

Fibonacci Zahlen

Bsp: Fibonacci- Zahlen

11

Page 12: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

F(0)=F(1)=1

F(n)=F(n-1)+F(n-2), n + 2

Definition:

Rekursionbaum einer Prozedur A ist ein Baum TA, wobei

• jeder Aufruf der Prozedur entspricht einem Knoten

• Kinder von Knoten v sind die (rek.) Aufrufe von A die v tätigt (mit den jeweiligen Argumenten)

Die Rechenzeit von A auf x lässt sich bestimmen, indem man die in den Knoten des Berechnugsbamvon A auf x anfallende Arbeit aufsummiert.

Bsp: Mergesort

zum Sortieren von A[0], A[n + 1](n = 2kmit k + 0)

Anm. d. A.:

Mergesort funktioniert wie Quicksort nach dem Teile- und- Herrsche- Prinzip.

Es zerlegt die Liste in immer kleinere Listen, bis die Liste nur noch aus einem Element besteht unddiese Teillisten werden dann sortiert Schritt für Schritt wieder zusammengeführt.

12

Page 13: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Analyse

(a) T (n) = 2 · T (n2 ) + O(n)

per Induktion: T (n) = O(n · log n)

(b) Rekursionsaufruf für M.S. auf A[0], ..., A[n]

13

Page 14: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Gesamtkosten:

c · n"#$%Wurzel

+ c(n

2) + c(

n

2)

" #$ %Kinder d. Wurzel

+ c(n

4) + c(

n

4) + c(

n

4) + c(

n

4)

" #$ %Enkel der Wurzel

+ . . .

= c · (n + n2 ) + n

2 ) + (n4 + n

4 + n4 + n

4 ) + . . .)

= c(n + n + n + n + . . .)

= c · n (1 + 1 + 1 + . . . + 1)" #$ %#Rekursionsstufen

= c · n· Höhe des Baumes = c · n · log n

zu BSP (Fibonacci- Rekursion)

Laufzeit der direkten Rekursion

T (n) =

'!(1)

T (n& 1) + T (n& 2) + !(1)n # 1n > 1

also

T (n) +'

1T (n& 1) + T (n& 2)

n # 1n > 1

damit T (n) + F (n) (per Induktion)

F(0)=F(1)=1

F(n)=F(n-1)+F(n-2), n > 1 (s.o.)

14

Page 15: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

= F (n& 2) + F (n& 3) + F (n& 2)

+ 2F (n& 2)

+ 2(2F (n& 4))

+ 2(2(2 · F (n& 6)))

+ 2i · F (n& 2i) (per Induktion)

Damit (i = u2 )

F (n) = 2n2 = (

,2)n

Alternativen

• tabellieren der bereits berechneten F(1) für 0 # i < n (dynamisches Programmieren)Laufzeit O(n), Platzbedarf "(n)

• iterative LösungLaufzeit O(n), Platzbedarf "(1)

•.

F (n)F (n& 1)

/=

.F (n& 1) + F (n& 2)

F (n& 1)

/=

.1 11 0

/ .F (n& 1)F (n& 2)

/

mit $fn :=.

F (n)F (n& 1)

/

$fn =.

1 11 0

/

" #$ %M

·$fn"1

$f1 =.

11

/

Iteration:

$fn = M · $fn"1 = M · M · $fn"2 = M · M · M · $fn"3Ind.= M · . . . · M · $fn"i" #$ %

i"mal

(i + 1)

= M i · $fn"i

i=n"1= Mn"1 · $f1

Kann in O(log n) Zeit durch schnelle (Matrix-) Exponentiation berechnet werden.

1.1.8 Rekursion auf der RAM

Algorithm min ( )x <& 5subrout ine1 (x )

15

Page 16: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Algorithm subrout ine1 ( i )k <& i+1subrout ine2 (k )

Algorithm subrout ine (k )y <& 6

• merken, welche Unterroutine gerade ausgeführt wird

• es gibt für jede Unterroutine eine Struktur in der ihr idealer Kontext (Variablenwerte, Rück-sprungadresse) gespeichert wird

(vgl. Rekursionsaufruf in z.B. MMIX)

30. Oktober 2008

1.2 Datenstrukturen

Schema zur Organisation von Daten, so dass gewisse Operationen auf / Manipulationen von Datene"ektiv durchführbar sind.

1.2.1 Beispiel Stapel (Stack)

Manipulation von von Objekten erfolgt nach dem LIFO (last in- first out) Prinzip (hier: “Objekte”=int)

d.h. wir benötigen die Operationen

• einfügen eines neuen Elements (push)

• entfernen des zuletzt eingefügten Elements (pop)

• lesen des zuletzt eingefügten Elements (ohne es zu entfernen) (top)

• Test, ob der Stapel leer ist

(x#, S#) = pop(push(x, S)) - x# = x und S# = S

wobei :pop : Stape l ( i n t ) &> in t x Stape l ( i n t )push : i n t x Stape l ( i n t ) &> Stape l ( i n t )

Implementierung:

16

Page 17: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

• int-Array F mit M Einträgen

• Zeiger top auf oberstes Element (int top=-1)

Melde Fehler , f a l l s Array F v o l l ( top = M&1)

& push (x ) top <& top + 1F [ top ] <& x

& pop ( ) re turn F [ top&&]Feh ler s i g n a l i s i e r e n , f a l l s Stack l e e r i s t ( top = &1)

Java- Implementierung:

c l a s s i n t ArrayStack {i n t F [ ] ;i n t top ;i n t M;i n t ArrayStack ( i n t m) {

M = m;top = &1;F = new in t M[ ] ;

}

i n t pop ( ) throws EmptyIntArrayStackEception {i f ( top == &1) throw . . .e l s e re turn F [ top&&];

}

Analyse von Datenstrukturen

• Wie e!zient sind die Operatoren auf der D.S.?(in Abhängigkeit von der Anzahl der in der Struktur gespeicherten Objekte)

• Wie viel Speicherplatz benötigt die Struktur?

hier:

17

Page 18: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

• Platzbedarf !(M)

• !(1) Zeit für push & pop

Probleme:

• maximale Größe fest

• Implementierungsspezifische Ausnahmebehandlung

Implemetierung mittels verketteten Listen

• einfach verkettete Liste

• Einfügen und Löschen am Anfang der einfach verketteten Liste ist einfach (!(1) Zeit )

1.2.2 “Indirekte” Anwendung von Stapeln

• als Hilfsstruktur für andere D.S.

• beim Entwurf von Algorithmen

Beispiel: Gegeben

18

Page 19: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

x2 wird von x3 verdeckt, x4 wird von x5 verdeckt. Wäre ein x6 größer als x5 und kleiner als x3, wäreauch x5 verdeckt.

Span berechnen:

Feld X[0],...,X[1] von n Zahlen

Berechne für alle 0 # i # n& 1

S[i] = max. Anzahl von aufeinanderfolgenden Elementen unmittelbar vor X[i] die kleiner als X[i] sind.

Algorithm Span (X, n)S <& Neues Feld mit n Einträgen

| f o r i = 0 to n&1 do| S [ i ] <& 0| | f o r j = 0 to i do| | i f X[ i&j ] " k l e i n e r g l e i c h " X[ i ] do| | S [ i ]++| | e l s e break ;

i

!(n"1&

i=0

&

j=0

1) = !(n2)

04. November 2008

Besser mittels Hilfsfunktion

• arbeiten X von links nach rechts

• von rechts “sichtbare” Elemente im Stapel (von rechts nach links)

19

Page 20: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

• am Index ientferne alle Elemente von der Spitze des Stapels die # X[i] sind und zähle span(X[i]) je umeins hochlege X[i] auf Stapel

Algorithm span (X, n)S <& neues Feld von n ZahlenA <& neuer l e e r e r Stape l

f o r i=0 to n&1 dowhi l e ( ! isEmpty (A)&&((X[ top (A)])<= X[ i ] ) ) do // en t f e rn e a l l e Elementepop (A) // aus A d i e k l e i n e r a l s X[ i ] s ind

i f isEmpty (A) S [ i ] <& i+1e l s e S [ i ] <& i & top (A)push ( i ,A)

# i wird gelöscht und i wird hinzugefügt.

Analyse:

n push&Operationen# n pop&Operationen# 2n isEmpty &Operationen

Stack mit einfach verketteten Listen - !(n) Gesamtlaufzeit.

1.3 Dynamisierung Array- basierter Datenstrukturen

Konkretes Beispiel : Stapel

Ziel:

• Implemetierung von Stacks durch Arrays

20

Page 21: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

• keine feste Größe

Idee: (nur push-Ops)

• Wir haben zu jedem Zeitpunkt ein Array in dem alle Elemente des Stapels abgespeichert sind.

• Wenn Platz in diesem Array nicht mehr ausreicht, legen wir ein neues Array doppelter Größeran und kopieren das alte Feld in den Anfang des neuen Feldes.

!(1) Zeit für push-Op (solange noch Platz!)

!(M) Zeit für push-Op die Umkopieren erfordert.

(typisch ist M’=2M, hier im Bild jedoch nicht.)

Probleme dabei:

Es gibt push- Operationen die "(#Elemente im Stapel) Zeit benötigen.

ABER:

Jede Folge von n push/pop- Operationen benötigt O(n) Zeit.

alternatives Argument via Bankiermethode.

Begründung:

1. Eine pop- Op benötigt nur !(1) Zeit. D.h. alle pop- Op’s in einer Folge von n push/pop- Op’sbenötigt O(n) Zeit.

21

Page 22: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

2. Betrachte Folge von n push- Op’s.

Die k-te push- Operation benötigt Zeit Tk =

'O(k)O(1)

k = 2i

sonst

Gesamtzeit für n push- Operationen

n&

k=0

Tk = O(n) +$log2 n%&

i=0

T2i

= O(n) +$log2 n%&

i=0

O(2i)

= O(n) + O(n)n&

k=0

Tk = O(n)

amortisierte Kosten von “O(1)”

Idee: (Wiederholung von oben)

• Jede elementare Operation verursacht gewisse Kosten

(z.B.: Kosten von pop: O(1) : 1$ ;Kosten von von push (kein Umkopieren): O(1) : 1$ , (mit Umkopieren) O(Größe des Arrays : #Elementeim Stack $))

Definition (amortisiert):

Gegeben sie eine Datenstruktur, für die eine Folge von n Operationen insgesamt T(n) Zeit benötigt.

Dann nennen wir T (n)n die amortisierten Kosten pro Operation.

06. November 2008

• Eine Folge F von Operationen verursacht damit Gesamtkosten cF

(Ziel: zeige, dass cF = O(n) falls |F | = n)

• Wir werden zeigen: Falls wir jeder Operation 2$ “mitgeben”, können wir am Schluss die KostencF begleichen.

22

Page 23: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Buchhaltervorschrift

• pop- Operation (bringt 2$ mit) :bezahle die Kosten (1$) und lege 1$ auf Sparbuch (der DS)

• push- Operation (bringt 2$ mit) :

– kein Kopieren : bezahle Kosten (1$) und lege 1$ auf das DS Sparbuch– mit Kopieren: bezahle Kosten (# Elemente im Stack) von meinen 2$ auf Sparbuch

Wir werden zeigen: das Sparbuch ist nie im Minus

1. die Kosten cF können bezahlt werden

2. es gilt cF = 2$ · |F |

• eine push- Op veranlasst, das im Fall mit M Einträgen verdoppelt wird, hat zur Folge, dassdanach mind. M Operationen ausgeführt werden können, die nur 1$ kosten.

• der nächste au"allende Verdopplung kostet 2M $.

Problem: Der Platzbedarf der DS hängt nicht von der Anzahl der Elemente (tatsächlich von der ma-ximalen Stackgröße) ab, die in der DS gespeichert worden, sondern von der Anzahl der durchgeführtenOperationen.

Lösung: Modifiziere pop

(falls Array nur noch zu 14 belegt ist, halbiere & kopiere um)

Implementierung (in Java)

23

Page 24: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

2 Datenabstraktion

2.1 Geheimnisprinzip

Kenntnis der Spezifikationen eines Moduls, Datentyp, Systems ist notwendige und hinreichende Vor-aussetzung für deren konkrete Benutzung.

Bsp.: Prozentuale Abstraktion

Datenabstraktion ist die Anwendung des Geheimnisprinzips auf die Darstellung komplexer Datenstruk-turen:

• nicht direkt manipulierbar

• nur über (prozedurale) Schnittstelle manipulierbar (die geeignete Operationen zur Verfügungstellt)

Einschränkung der Sichtbarkeit bei der klassenbasierten Datenabstraktion

• Das Klassenkonzept untersützt die Zusammenfassung von Daten und dem sie manipulierendenOperationen (in einer syntaktischen Form).

• In Java kann das Verberigen der internen Repräsentation durch Sichtbarkeitsmodifikatoren er-reicht werden.

– public : überall– protected : innerhalb des eigenen Pakets und in den Unterklassen– private : nur innerhalb der umschließenden Klasse– default : innerhalb des Pakets

• Diese steuern die Sichtbarkeit von Attributen und Methoden

Bsp.: Stacks (als Arrays)

class Stack {int max = 100 ;Object [ ] S = new Object [max ] ;int t = 0 ;

void push ( Object o ) throws Exception {i f ( t == max) throw new Exeption ( ) ;s [ t++] = o ; // e r s t s [ t ] o zuweisen und dann t inkrement ieren

}

Object pop ( ) . . .}

24

Page 25: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Problem: direkte Manipulation der Daten möglich.

Stack s = new Stack ( ) ;s t = 124 ;s . push ( 3 ) ;

11. November 2008

2.2 Abstrakte Datentypen

Definition ADT :

Ein ADT ist eine Menge von Objekten mit einer Menge von Operationen auf diesen Objekten.

alternativ:

Ein Typ, dessen Objekte nur über die Operationen seiner Schnittstelle manipuliert werden können.

Beispiel: Stack

Operationen :push : ( x , S ) &> Spop : ( S) &> S

Objekte

Folgen (von Elementen)

. nach dem LIFO- Prinzip

Vorteile der Datenabstraktion

• Implementierung unabhängig vom Modell

• Sicherheit : Objekte können nicht in ungültige Zustände versetzt werden

• Flexibilität : Code kann unabhängig vom benutzten Code entwickelt werden

• Komfort : Benutzer abstrahiert von der Repräsentation

25

Page 26: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Reale Welt“reelle” Objekte mit “rellen” Operatoren

/ Modellierung

Modell abstrakte Objekte , Operationen

/ Implementierung

Datenstruktur, Methoden

2.2.1 Explizite Schnittstellenbeschreibung in Java

“Probleme”

• Operationen müssen aus dem Quelltext der Klasse herausgesucht werden

• die Implemetierung der Methoden wird nicht vom Benutzer verborgen

9, 1, 2, 5, 7, 5,

push_left push_rightpop_left pop_right

Deklaration eines Schnittstellentyps

interface S ta ck In t e r f a c e {void push ( Object o ) ;Object pop ( ) ;

}

• Methoden haben leeren Rumpf

• keine (non-const) Attribute

• Standardsichtbarkeit public

Im Programm:

(1 ) Fest legung aud e ine konkrete Implementierung

Stack s = new Stack ( ) ;

(2 ) e v t l . andere

S t a ck In t e r f a c e s = new Stack ( ) ;

26

Page 27: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

(3 ) geht n i cht !

S t a ck In t e r f a c e s = new S ta ck In t e r f a c e ( ) ;

Implementierung einer Schnittstelle

Pflichten:

1. alle Schnittstellenmethoden müssen implementiert werden

2. alle Schnittstellenmethoden müssen public sein

Rechte:

1. Parameter von Schnittstellenmethoden dürfen umbenannt werden

2. beliebige weitere Attribute/Methoden

3. Schnittstelle kann als Typ verwendet werden (aber keine Instanzen möglich)

Bemerkung:

• Eine Klasse kann mehrere Schnittstellen implementieren

• guter Stil als Typbezeichner möglichst Schnittstellentypen verwenden, Klassentypen nur bei In-stanzierung

27

Page 28: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

13. November 2008

3 ADT- Anwendungen, Implementierungen

3.1 Der ADT - Prioritätswarteschlange

Motivation:

1. Scheduling von Prozessen im Betriebssystem (benötigt Operationen)

• finde Prozess mit höchster Priorität• erzeuge neuen Prozess (mit vorgegebener Priorität)• verringere Priorität eines Prozesses

2. Sortieren durch wiederholes Betimmen des kleinsten Elements: benötigt Operationen

• finde Element das am kleinsten ist• entferne dieses Element

ADT PWS (priority queue)

U: Universum, total geordnet via # (Relation)

Objekte des ADT: endl. Teilmengen S 0 U

Operationen & ! &: findmin : S $ U liefert min {x % S}

deletemin S 1$ S# mit S# = S \ min S

insert : (x, S) 1$ S# mit S# = S 2 {x} x % U

Damit:

Algorithm PQSort (A)

Input : Array A [ 1 ] , . . . ,A[ n ] von Elementen aus UOutput : Sor t i e rung von A ( bzg l . der Ordnung auf U)

PQ H;f o r i = 1 to n do

H. i n s e r t (A[ i ] ) ;

f o r i = 1 to n dopr in t H. f indmin ( ) ;H. de letemin ( ) ;

28

Page 29: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Laufzeit von PQSort:

TX Laufzeit von X % {findmin, deletemin, insert}

Gesamtlaufzeit: O(n · Tinsert + n · Tfindmin + n · Tdeletemin + n)

Damit: Gesamtlaufzeit O,n2

-

3.1.1 Implementierung des ADT PWS (für U = N)

(a)

Implementierung der PWS als einfach verkettete Liste

Tfindmin = O(|S|), Tinsert = O(1), Tdeletemin = O(|S|)

(b)

Als Folge l unsortierter Listen mit

'l & 1 haben m Elemente

1 hat # m Elementebei denen die Minima in einer

Liste (unsortiert) verkettet sind.

l · n = m

29

Page 30: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Tfindmin = O(l)

Tinsert = O(l)

Tdeletemin = O(l + m)

Damit:

Gesamtlaufzeit : (Optimal für l = m =,

n)

O(n · l + n · m + n) = O(n ·,

n)

(c) Heaps

Ein heapgeordneter Baum für eine Menge S 0 U ist ein Baum auf den Elementen von S, wobei gilt:

u Kind von v - u + v

Bsp.:

30

Page 31: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

insbesondere:

Eigenschaften heapgeordneter Bäume:

• Minimum ist in der Wurzel

• Jeder Teilbaum ist Heap-g.

interface Pr ior i tä t sWarteSch lange {void i n s e r t ( Object o ) ;Object f indmin ( ) ;void de letemin ( ) ;

}

31

Page 32: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

18. November 2008

3.2 Implementieruung des Heap

heapgeordneter Bäume (s.o.) | Wälder

Implementierung des PWS - Op auf H- geordneten Bäumen

* findmin trivial

* deletemin setzt die Wurzel auf ”3” und lässt sie “absinken” bis zu einem Blatt und entfernt dieses

* insert ausgehend von einer “freien Position” (abhängig von Details der Baumstruktur)füge neues Objekt ein und lass es “aufsteigen”

Konkreter binärer Heap

wir betrachten:

• binär

• heap- geordnete Bäume, wo die Tiefe von Blättern sich max im 1 unterscheidet

• alle bis auf einen inneren Knoten genau zwei Kinder haben

Fakt:

Diemaximale Tiefe eines binären Heaos mit n Elementen ist O(log n)

• deletemin auf bin. Heaps:Schreibe rechtetes Blatt in die Wurzel & lass es absinken (entferne das Blatt, mache es zumersten Blatt und aktualisiere das rechteste Blatt)

32

Page 33: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

• insert auf bin. Heaps:Schreibe das neue Element in das nächste freie Blatt & lass es aufsteigen, mache es zum rechtestenBlatt und bestimme das neue rechte nächste freie Blatt

• wir stellen binäre Heaps so dar, dass die letzte Ebene des Baumes von links nach rechts aufgefülltist

• wir “merken” uns das “rechteste” Blatt der letzten Ebene & das erste freie Blatt

Mögliche Implemetierung von binären Heaps

1. verzeigerte Struktur (später)

2. flach in einem Array

33

Page 34: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

• Speichere bin. Heap mit n Elementen in Feld der Länge n

• Knoten mit Index i hat linke (rechte) Kind bei Index Index 2i (2i+1)

• “letztes” Element ist bei Index n gespeichert, die erste freie Position bei Index n+1

• Dynamisierung durch iteriertes Verdoppeln/Halbieren (amortisiert O(1) pro Operation)

Laufzeit:

deletemin & isert O(log n)findmin O(1)

Damit Laufzeit von PWSSort (Heapsort):

O(n · log n)

Ziel:

(E!ziente) Implementierung der Operation (P,Q, PWS)

34

Page 35: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

20. November 2008

3.3 Erweiterung des ADT PWS : VPWS

triviale Implementierung

interface VPWS {void i n s e r t ( Object o ) ;void de letemin ( ) ;Object f indmin ( ) ;void meld (VPWS P) ;

}

interface PWS {void i n s e r t ( Object o ) ;void de letemin ( ) ;Object f indmin ( ) ;

class NameVPWS implements VPWS {private BinaererHeap P;// irgendwo i s t " c l a s s BinaererHeap implements PWS{ . . . } "

void de letemin ( ) {P. de letemin ( ) ;

}

void meld (NameVPWS Q) {so lange Q nicht l e e r :

P . i n s e r t (Q. f indmin ( ) ) ;Q. de letemin ( ) ;

}}

35

Page 36: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Vererbung (Einschluss- Polymorphie) in Java

(Polymorphie = Vielgestaltigkeit)

Klasse (bzw. Schnittstelle) Y wird als Erweiterung der Klasse X vereinbart und erbt damit die eigen-schaften von X.

Syntax:

class X { Text von X }

class Y extends X {Text von Y}&&&&&en t sp r i c h t f a s tclass Y {

Text von XText von Y

}

Umgesetzt:

interface VPWS extends PWS {void meld ( . . . ) ;

}

bzw.

class VBinaerHeap extends BinaerHeap implements VWPS {void meld . . .

}

36

Page 37: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

3.4 neue Implementierung als Binomialheaps

Binomialbäume:

Bi bezeichnet einen Binomialbaum vom Grad i.

induktiv definiert:

Bsp:

Es gilt:

1. Bi hat 2i Knoten (Induktion)

2. Die Wurzel von Bi hat i Knoten

3. Die Tiefe von Bi ist i

Ein Binomialheap mit n Elementen S ist ein Wald von Binomialbäumen in denen die Elemente von Sheap- geordnet gespeichert sind. Jeder Bi kommt dabei höchstens 1x vor. Das gilt immer !

Bsp:

S = {7, 5, 1, 4, 13, 6} n = 6 = 22 + 21 - B1 und B2

37

Page 38: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Es gilt: wir benötigen !(log n)

Binomialbäume in einem Binomialheap für n Elemente

(hint: Binärdarstellung)

Die (Wurzeln) der Binomilabäume sind in einer Liste verkettet, sortiert nach ihrem Grad.

Bsp.: S = {7, 5, 1, 4, 13, 6, 15, 9, 3, 8, 27, 21, 34, 99} n = 14 = 23 + 22 + 21

Implementierung der VPWS- Operationen

(a) meld

• durchlaufe Wurzellisten P und Q (angefangen beim kleinsten Grad)

• zu jedem Zeitpunkt stellen wir sicher, dass es im Resultat nur einen Baum pro Grad gibt

• es gibt jeweils maximal einen Baum C der aus dem vorherigen Schritt als Übertrag kommt

• sei A der aktuelle Binomialbaum von Psei B der aktuelle Binomialbaum von Q

– Fall 1: es gibt kein C

" deg A < deg B : schreibe A in die Wurzelliste von P 2 Q , ersetze A durch seinenNachfolger

" deg A > deg B : umgekehrt" deg A = deg B

· min B < min A : mache A zu Kind der Wurzel B und setze das Ergebnis als ÜbertragCErsetze A (und B) durch ihre Nachfolge

· min A < min B : umgekehrt

– Fall 2: es gibt ein C (=- Übungsaufgabe)

38

Page 39: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

25. November 2008

verschmelzen

n = 4

8 + 4 + 2 = 23 + 22 + 21

Implemetierung der restlichen Heap- Op

• findmin(P)

– Durchlaufen der WurzellisteO(log |P |) Zeit

• insert(P,x)

– durch meld (P,{x})O(log |P |) Zeit

• deletemin(P)

– Finde Bi in der Wurzelliste der Minimum speichert (in seiner Wurzel), entferne Bi ausder Wurzelliste, entferne Wurzel von Bi (resultiert in {B0, . . . , Bi"1}) und erzeugen damitneuen Binärheap.Verschmelzen den neuen & den alten Heap.O(log |P |) Zeit

3.5 Lokalisierung von Einträgen in Datenstrukturen

Typischerweise “wissen” Einträge in einer DS wo sie in der Struktur gepeichert sind.

Sonst ist das manipulieren von Einträgen in der DS “schwierig” (d.h. unmöglich/ine!zient).

39

Page 40: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Bsp.:

• Löschen von einträgen aus einer PWS

• Ändern der Priorität von Einträgen einer PWS

mögliche Lösung

Schnittstellenmethoden zum Einfügen von Objekten liefern einen “Zeiger” auf den Eintrag der Objektein der DS.z.B.:

class PWSEintrag {int Pr i o r i t a e t ;Object Eintrag ;int Pos i t i on ;

}

3.6 Bäume

mathematischer Kontext Informatik KontextKreisfreier zusammenhängender Graph gerichteter Graph T = (V,E)typischerweise gibt es eine (totale Ordnung) Wurzel w % Vauf den Kindern eines Knotens. (u, v) % E

v heißt Kind (Nachfolger) von uu heißt Erziehungsberechtigter (Vorgänger) von v

Bäume als ADT

ADT Knoten

• speichert Objekte

• Manipulation/Zugri"void setInfo (Object o);Object getInfo();

40

Page 41: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

3.6.1 Schnittstelle zum ADT Baum (Auswahl)

Knoten getRoot ( ) ;Knoten getParent (Knoten k ) ;boolean aLeaf (Knoten k ) ;Knoten getChi ld (Knoten k , int i ) ;int getDegree (Knoten k ) ;

41

Page 42: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

27. November 2008

Implementierung von Bäumen

1. Verkettete Struktur auf den KnotenPlatzbedarf für Baum mit n Knoten : O(n)

Spezialfall: k- näre Bäume (k > 2)

• jeder Knoten hat # k Kinder

• falls jeder inäre Knoten genau k- Kinder hat, heißt der Baum wohl

• bei geordneten Binärbäumen heißt das

– 1. Kind auch linkes Kind– 2. Kind: auch rechtes Kind

Bsp. k=3

Höhe des Baumes ist h.

h = 0 30 = 1

h = 1 30 + 3 · 30 = n0 + 3n0 = 4

h = 2 4 + 3 · 3 = 13

h = 3 13 + 9 · 3 = 40

h&

i=0

qi =qn+1 & 1

q & 1

42

Page 43: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

2. Arraydarstellung k- närer Bäumek- närer Baum der Höhe h wird im Array mit kh+1"1

k"1 Elementen abgespeichert.Das i-te Kind (1 # i # k) eines Knotens der beim j-ten Eintrag gespeichert ist, wird im(k · j + i) Eintrag abgelegt.

Zugri" auf Elternknoten durch gannzahlige Division.

(evtl. Problem)

Das Array kann exponentiell groß (im Vergleich zum Baum) sein.

Algorithmen auf Bäumen

• Traversierung von Bäumen

inorder: besuche erst den linken Teilbaum unter der Wurzel, dann die Wurzel, dann ihrenrechten Teilbaum

preorder: besuche zuerst die Wurzel, dann dann links, dann rechts

postorder: besuche erst links, dann rechts, dann Wurzel

(1) Anwendung von inorder- Traversierung

T = (V,E)

in : V $ N inorder Traversierung

h : V $ N Höhenfunktion

% =

'V $ R2

2 $ (in(u), h(u))

ist eine kreuzungsfreie Zeichnung von T in der Ebene.

43

Page 44: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

(2) Arithmetische Ausdrücke (auf ganzen Zahlen)

(über {+,&})

rekursiv definiert:

(i) x % Z ist ein arithm. Ausdruck

(ii) e, f arithmetische Ausdrücke- (e + f) sind arithm. Ausdrücke(e& f)

z.B. 12345+3456.

Darstellung als Ausdrucksbaums z.B.: ((2 + 5)& (7 + 12))

Auswertung durch postorder- Traversierung.

Umgekehrte Polnische Notation (UP- Notation): 2, 5,+, 7, 12,+,&

44

Page 45: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

02. Dezember 2008

3.6.2 weitere Anwendungen: Spielbäume

TicTacToe

Beginnt der Kreis- Spieler in der Mitte, hat der Kreuz- Spieler acht verschiedene Möglichkeiten seinKreuz zu setzen.

Dann hat der Kreis- Spieler sieben Möglichkeiten. ...

Nehme als Root das leere Spielfeld. Der erste Nachfolger sind neun Knoten, alle Möglichkeiten für dieerste Belegung. Die Nachfolger dieser Knoten sind jeweils die acht Möglichkeiten, ein Kreuz zu setzen.usw.

Es gibt besondere Knoten, bei denen das Spiel zu Ende ist. Dieser Knoten ist ein Blatt. Entweder, dasSpiel wird gewonnen oder es gibt ein Remis.

Zunächst werden alle Nachfolger der Wurzel erzeugt, erfüllen sie die Anforderung? Nun werden dieKinder erzeugt, usw.

- Breitensuche

3.6.3 Breitensuche in Bäumen

Traversiere den Baum in der folgenden Reihenfolge.

(Hier ein Baum mit immer drei Nachfolgern)

1. Wurzel (r)

2. Kinder der Wurzel (seien diese w1, w2, w3)

3. Kinder der Knoten aus 2. ; erst die Kinder von w1 , dann die Kinder von w2 , dann die Kindervon w3

4. Deren Kinder. Nach Methodik von 3.

Diese Knoten werden in einer Liste verwaltet:

r, w1, w2, w3, w11, w12, w13, w21, w22, w23, w31, w32, w33

Dies ist eine Warteschlange (Queue).

45

Page 46: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

3.6.4 Tiefensuche in Bäumen

Traversierung mittels Stack

Erst ganz links bis nach unten, dann von “ganz unten” zum ersten Vater, dessen nächstes Kind, danneins hoch, nächstes Kind,...

3.7 ADT Wörterbuch (Dictionary)

Verwalten einer endlichen Teilmenge S 0 U eines Universums U

Operationen :

find(k,S) bestimme, ob k % S

insert(k,S) füge k zu S hinzu

delete(k,S) lösche k aus S

Bemerkung:

• Gegebenenfalls Fehlerbehandlung (z.B. bei delete)

• im Allgemeinen is S eine Multimenge

Vielfache Anwendungen!

3.7.1 Implementierung des ADT Wörterbuch

1. Verkettete ListePlatzbedarf !(|S|)Laufzeit:insert !(1) ggf. !(|S|)find !(|S|)delete !(1) falls falls Zeiger in die Liste zeigtsonst !(|S|)

2. Hashing (Streuspeicherung)

1.Idee Finde “gute” Abbildung h1 : U $ N

2.Idee Finde “gute” Abbildung h2 : N $ [1, . . . N ]

Speichere S in ein Array T [1, . . . , N ]

und zwar speichern x % U in T [h2(h1(x))]

46

Page 47: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

04. Dezember 2008

3.7.2 Implementierung durch Hashing

U Universum

S 0 U

h1 : U $ N

h2 : N $ [1, . . . N ]

h2(n) = 1 + (n mod 4)

3.7.3 Hashcodes

1. Zeichenketten s = s1 . . . sk %!&

(a) Länge

(b) h!(s) =!0h1(si)|

!|

!{&0, . . . ,&l}

wobei 0h1 =

'!$ N

&i 1$ i

z.B.: ASCIIs = AFFE|!

| = 256, h1(A) = 65 , h2(F ) = 70 , h3(E) = 69 , h1(s) = (((65 ·256+70) ·256)+70) ·256+69

2. Floatingpoint- Zahlen

(a) h1(x) = 4x5(b) h1(x) = Mantisse von x als Integer

Kompressionsverfahren

Idee: h2 soll S “möglichst geleichmäßig” auf [1, . . . N ] aufteilen. Typischerweise ist N eine Primzahl

Bsp.:

1. h2(x) = 1 + (x modN)

2. h2(x) = 1 + (ax + b modN)a'=0(mod N), a,b(N

47

Page 48: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Hashing mit Verkettung

U Universum

|U | = u

S 0 U, |S| = n

Hashfunktion in Tabelle T der Größe N. (Hashfunktion ist fest)

Hashtabelle mit N Einträgen

h : U $ [0, . . . , N & 1]

n- elementige Teilmengen von U sollen verwaltet werden.

Idee: Speichere x % S an Position h(x) in T

x1, x2 % S kollidieren (bzgl. h), falls h(x1) = h(x2)

Behandlung von Kollisionen durch Verkettung

T [i] zeigt af eine verkettete Liste in der alle x % S mit h(x) = i gespeichert sind.

Bsp.:

• Einfügen/Löschen/Suchen eines Eintrags e mit Schlüssel k

• berechne i = h(k)

• Einfügen / L / S von e in Liste T [i] wie oben

Analyse:

Platzbedarf : O(N)" #$ %Array T

+ O(n)" #$ %Knoten der Liste

= O(n + N)

48

Page 49: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Laufzeit (für Eintrag mit Schlüssel k)

hängt ab von

1. der Zeit, die zur Berechnung von h() benötigt wird.

2. der Länge der Liste die den Eintrag speichert.

Cs(k) = {y % S|h(y) = h(k)}

Falls h in O(n) Zeit ausgewertet werden kann, benötigen alle Operationen !(1 + |Cs(k)|) Zeit.

Analyse der mittleren Laufzeit von Hashing mit Verkettung

U sei fest. (U sei endlich, |U | = u)

n sei fest.

h sei fest.

S 0 U wird zufällig (gleichverteilt) gewählt.

U hat.

un

/= |W | viele n- elementigen Teilmengen

Für V 0 U mit |V | = n fest, gilt:

Pr(S = V ) = pv =1.un

/ =1

|W |

W = {S 0 U | |S| = n}

Für k % U fest betrachten wir Cs(k) Zufallsvariable und interessieren uns für

E [CS(K)] =

&

v(W

pv |Cv(k)| =1

|W |

!v(W [CS(K)]

Beweis:

49

Page 50: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

[CS(K)] =&

y(S, h(k)=h(y)

1 =&

y(U, h(k)=h(y)

iS(y) mit iS(y) =

'1 y % S

0 sonst

Damit

E [CS(K)] =1

|W | ·&

V (W

[CV (K)]

=1

|W | ·&

V (W

·&

y(U, h(k)=h(y)

v(y)

=&

V (W

·&

y(U, h(k)=h(y)

pv$%"#1

|W | v(y)

=&

V (W

·

E[iS(y)] für y fest$ %" #&

y(U, h(k)=h(y)

p(v) · iv(y)

=&

y(U, h(k)=h(y)

n

u

E[iS(y)] = 1 · Pr(iS(y) = 1) + 0 · Pr(is(y) = 0) = Pr(y % S) =

,u"1n"1

-,n

u

- =n

u

(*)

50

Page 51: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

09. Dezember 2008

3.7.4 Zufallsexperiment

S %,U

n

-wird zufällig (unter Gleichverteilung gewählt)

Analyse Zufallsvariable (für x % U)

|CS(x)| = |{y % S|h(x) = h(y)}| (s.o.)

Fortsetzung von (*)

=- E [CS(x)] =&

y(U, h(k)=h(y)

n

u

=n

&

y(U, h(k)=h(y)

1

=n

u· |CS(x)| = |{y % S|h(x) = h(y)}|

Def.:

Eine Hashfunktion h : U $ [1, . . . , N & 1] heißt fair, falls

|{y % U |h(y) = i}| #1 u

N

2*0 # i # N

Falls h fair:

E [CS(x)] # n

u·1 u

N

2'

Belegungsfaktor der Hashtabelle$%"#n

N

Zusammengefasst:

Die erwartete Zugri"szeit für Hashing mit Verkettung (bei Verwendung einer fairen Hashfunktion) beider Verwaltung von n- elementigen Teilmengen von U in einer Tabelle mit N Einträgen ist

O31 +

n

N

4

Bsp:

h(x) =

'[0, . . . , u& 1] $ [0, . . . , N & 1]x 1$ x mod N

ist fair.

Beweis:

51

Page 52: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

(a) mit N = !(n) erhalten wir !(1) (erwartete) Zugri"szeit und !(n) Speicher.(unter den bekannten Annahmen)

(b) Falls n nicht bekannt ist, kann durch Verdoppeln, bzw. Halbieren der Tabellengröße (inkl.Umkopieren) !(1) amortisierte erwartete Laufzeit bei !(n) Platz erreicht werden.

Alternative: Universelles Hashing

Idee: Wählen h beim Aufbau der Struktur (unter Gleichverteilung) aus einer Menge von “guten”Hashfunktionen H.

Analyse:

Sei S 0 U mit |S| = n und x % U fest.

Für h % H sei

Cx(h) = {y % S|h(x) = h(y)}=

&

y(S

'xy(h)

mit 'xy(h) =

'1 h(x) = h(y)0 sonst

E [|Cx(h)|] = E

5

6&

y(S

'xy(h)

7

8

=&

y(S

['xy(h)]

=&

y(S

(Pr (h(x) = h(y)))

mit

!"

#$Pr(h(x) = h(y)) =

|{h % H|h(x) = h(y)}||H| =

1N

E [|Cx(h)|] #&

y(S

1N

=n

N

Def.:

Eine Menge H 0 {0, . . . , N & 1}U von Hashfunktionen heißt universell, falls *x, y % U mit x 6= y

|{h % H|h(x) = h(y)}| # |H|N

52

Page 53: ALP3 Datenstrukturen und -Abstraktion 08/09 FU- Berlin

Damit:

Die erwartete Zugri"szeit für Hashing mit Verkettung bei zufälliger Wahl von h aus einer universellenFamilie von H- Funktionen bei der Verkettung einer (jeder!) (festen) n- elementigen Teilmenge S 0 U

in einer Tabelle mit N Einträgen ist !31

n

N

4bei !(n + N + |h|"#$%

Platzbedarf, um h zu codieren

) Speicher.

3.7.5 Universelle Hashfunktionen

1. {0, . . . , N & 1}{0,...,u"1} ist universell, aber nicht platsparend repräsentierbar bzw. e!zient aus-wertbar.

2. Angenommen, x % U kann in eindeutiger Weise als (r + 1)- Tupel x = (x1, . . . , xr) mit 0 # xi <t *i und eine Primzahl t. (z.B. t=257 und x wird byteweise gelesen).

Für

a$ %" #(a0, . . . , ar) % {0, . . . t& 1}r+1 definieren wir die Hashfunktion

ha(x) = h(a0,...,ar)(x0, . . . , xr)

=&

0!i!r

aixi mod N

Dann ist H =9

ha|a % {0, . . . , N & 1}r+1:

universell.

Bemerkung:

(a) Zum Abspeichern von h(a0,...,ar) wird !(r) Platz benötigt.

(b) Zum Berechnen von h(a0,...,ar)(x0, . . . xr) wird !(r) Zeit benötigt.

53