• Keine Ergebnisse gefunden

10. Sortieren III

N/A
N/A
Protected

Academic year: 2021

Aktie "10. Sortieren III"

Copied!
111
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Bucketsort

269

(2)

270

(3)

Untere Schranke f ¨ur das Sortieren

Bis hierher: Sortieren im schlechtesten Fall benötigtΩ(nlogn) Schritte.

Geht es besser?

und im Mittel mindestens Ω(nlogn)Schlüsselvergleiche.

271

(4)

Bis hierher: Sortieren im schlechtesten Fall benötigtΩ(nlogn) Schritte.

Geht es besser? Nein:

Theorem

Vergleichsbasierte Sortierverfahren benötigen im schlechtesten Fall und im Mittel mindestens Ω(nlogn)Schlüsselvergleiche.

271

(5)

Vergleichsbasiertes Sortieren

Algorithmus muss untern!vielen Anordnungsmöglichkeiten einer Folge (Ai)i=1,...,n die richtige identifizieren.

Zu Beginn weiss der Algorithmus nichts.

Betrachten den “Wissensgewinn” des Algorithmus als Entscheidungsbaum:

272

(6)

Vergleichsbasiertes Sortieren

Algorithmus muss untern!vielen Anordnungsmöglichkeiten einer Folge (Ai)i=1,...,n die richtige identifizieren.

Zu Beginn weiss der Algorithmus nichts.

Betrachten den “Wissensgewinn” des Algorithmus als Entscheidungsbaum:

272

(7)

Vergleichsbasiertes Sortieren

Algorithmus muss untern!vielen Anordnungsmöglichkeiten einer Folge (Ai)i=1,...,n die richtige identifizieren.

Zu Beginn weiss der Algorithmus nichts.

Betrachten den “Wissensgewinn” des Algorithmus als Entscheidungsbaum:

272

(8)

Vergleichsbasiertes Sortieren

Algorithmus muss untern!vielen Anordnungsmöglichkeiten einer Folge (Ai)i=1,...,n die richtige identifizieren.

Zu Beginn weiss der Algorithmus nichts.

Betrachten den “Wissensgewinn” des Algorithmus als Entscheidungsbaum:

Knoten enthalten verbleibende Möglichkeiten

272

(9)

Algorithmus muss untern!vielen Anordnungsmöglichkeiten einer Folge (Ai)i=1,...,n die richtige identifizieren.

Zu Beginn weiss der Algorithmus nichts.

Betrachten den “Wissensgewinn” des Algorithmus als Entscheidungsbaum:

Knoten enthalten verbleibende Möglichkeiten Kanten enthalten Entscheidungen

272

(10)

a < b

b < c

abc a < c

acb cab

b < c

a < c

bac bca

cba

Ja Nein

Ja Nein Ja Nein

Ja Nein Ja Nein

abc acb cab bac bca cba

acb cab bac bca

273

(11)

log2L. ⇒Höhe des Entscheidungsbaumes h ≥ logn! ∈ Ω(nlogn).11

Somit auch die Länge des längsten Pfades im Entscheidungsbaum

∈ Ω(nlogn).

Bleibt zu zeigen: mittlere Länge M(n) eines Pfades M(n) ∈ Ω(nlogn).

11logn!Θ(nlogn):

logn! =Pn

k=1logknlogn.

logn! =Pn

k=1logkPn

k=n/2logkn2 ·logn2.

274

(12)

Tbl

Tbr

← br

←bl

EntscheidungsbaumTnmitnBlättern, mittlere Tiefe eines Blattsm(Tn)

Annahme:m(Tn)lognnicht für allen.

Wähle kleinstesbmitm(Tb)<lognb 2 bl+br =b, oBdAbl >0undbr>0 bl < b, br < bm(Tbl)logbl und m(Tbr)logbr

275

(13)

m(Tb) = bl

b(m(Tbl) + 1) +br

b(m(Tbr) + 1)

1

b(bl(logbl+ 1) +br(logbr+ 1)) = 1

b(bllog 2bl+brlog 2br)

1

b(blogb) = logb.

Widerspruch.

Die letzte Ungleichung gilt, daf(x) = xlogx konvex ist und für eine konvexe Funktion giltf((x+y)/2)1/2f(x) + 1/2f(y)(x= 2bl,y= 2br einsetzen).12 Einsetzen vonx= 2bl,y= 2br, undbl+br=b.

12allgemeinf(λx+ (1λ)y)λf(x) + (1λ)f(y)für0λ1.

276

(14)

277

(15)

Radix Sort

Vergleichsbasierte Sortierverfahren: Schlüssel vergleichbar (< oder

>, =). Ansonsten keine Voraussetzung.

278

(16)

Vergleichsbasierte Sortierverfahren: Schlüssel vergleichbar (< oder

>, =). Ansonsten keine Voraussetzung.

Andere Idee: nutze mehr Information über die Zusammensetzung der Schlüssel.

278

(17)

Annahmen

Annahme: Schlüssel darstellbar als Wörter aus einem Alphabet mit m Elementen.

Beispiele

m heisst die Wurzel (lateinisch Radix) der Darstellung.

279

(18)

Annahmen

Annahme: Schlüssel darstellbar als Wörter aus einem Alphabet mit m Elementen.

Beispiele

m heisst die Wurzel (lateinisch Radix) der Darstellung.

279

(19)

Annahmen

Annahme: Schlüssel darstellbar als Wörter aus einem Alphabet mit m Elementen.

Beispiele

m = 10 Dezimalzahlen 183 = 18310

m heisst die Wurzel (lateinisch Radix) der Darstellung.

279

(20)

Annahmen

Annahme: Schlüssel darstellbar als Wörter aus einem Alphabet mit m Elementen.

Beispiele

m = 10 Dezimalzahlen 183 = 18310

m = 2 Dualzahlen 1012 m = 16 Hexadezimalzahlen A016

m heisst die Wurzel (lateinisch Radix) der Darstellung.

279

(21)

m Elementen.

Beispiele

m = 10 Dezimalzahlen 183 = 18310

m = 2 Dualzahlen 1012 m = 16 Hexadezimalzahlen A016

m = 26 Wörter “INFORMATIK”

m heisst die Wurzel (lateinisch Radix) der Darstellung.

279

(22)

Annahmen

Schlüssel =m-adische Zahlen mit gleicher Länge.

Verfahrenz zur Extraktion derk-ten Ziffer eines Schlüssels in O(1)Schritten.

z10(2,85) = 0

280

(23)

Annahmen

Schlüssel =m-adische Zahlen mit gleicher Länge.

Verfahrenz zur Extraktion derk-ten Ziffer eines Schlüssels in O(1)Schritten.

z10(2,85) = 0

280

(24)

Schlüssel =m-adische Zahlen mit gleicher Länge.

Verfahrenz zur Extraktion derk-ten Ziffer eines Schlüssels in O(1)Schritten.

Beispiel z10(0,85) = 5 z10(1,85) = 8 z10(2,85) = 0

280

(25)

Schlüssel mit Radix 2. Beobachtung: Wennk ≥ 0,

z2(i, x) = z2(i, y) für alle i > k und

z2(k, x) < z2(k, y), dann x < y.

281

(26)

Idee:

Starte mit maximalem k.

Binäres Aufteilen der Datensätze mit z2(k,·) = 0 vs.z2(k,·) = 1 wie bei Quicksort.

k ←k −1.

282

(27)

Radix-Exchange-Sort

0111 0110 1000 0011 0001

0001 0011 0110 0111 1000 0001 0011 0110 0111 1000

283

(28)

Radix-Exchange-Sort

0111 0110 1000 0011 0001

0001 0011 0110 0111 1000 0001 0011 0110 0111 1000

283

(29)

Radix-Exchange-Sort

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000

0001 0011 0110 0111 1000

283

(30)

Radix-Exchange-Sort

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000

0001 0011 0110 0111 1000

283

(31)

Radix-Exchange-Sort

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000 0011 0001 0110 0111 1000

283

(32)

Radix-Exchange-Sort

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000 0011 0001 0110 0111 1000

283

(33)

Radix-Exchange-Sort

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000 0011 0001 0110 0111 1000 0001 0011 0110 0111 1000

283

(34)

Radix-Exchange-Sort

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000 0011 0001 0110 0111 1000 0001 0011 0110 0111 1000

283

(35)

0111 0110 1000 0011 0001 0111 0110 0001 0011 1000 0011 0001 0110 0111 1000 0001 0011 0110 0111 1000 0001 0011 0110 0111 1000

283

(36)

Output : Array A, im Bereich [l, r] nach Bits [0, . . . , b] sortiert.

if l > r and b0 then il1

j r+ 1 repeat

repeat ii+ 1 untilz2(b, A[i]) = 1 andij repeat j j+ 1 until z2(b, A[j]) = 0 and ij if i < j thenswap(A[i], A[j])

until ij

RadixExchangeSort(A, l, i1, b1) RadixExchangeSort(A, i, r, b1)

284

(37)

RadixExchangeSort ist rekursiv mit maximaler Rekursionstiefe = maximaler Anzahl Ziffernp.

Laufzeit im schlechtesten FallO(p·n).

285

(38)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 131 21 122 3 23 8 18 19 29

286

(39)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

3

121 131 21 122 3 23 8 18 19 29

286

(40)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

3 8

121 131 21 122 3 23 8 18 19 29

286

(41)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

3 8

18

121 131 21 122 3 23 8 18 19 29

286

(42)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

122 3 8

18

121 131 21 122 3 23 8 18 19 29

286

(43)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 122 3 8

18

121 131 21 122 3 23 8 18 19 29

286

(44)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 131

122 3 8

18

121 131 21 122 3 23 8 18 19 29

286

(45)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 131

122 3 23

8 18

121 131 21 122 3 23 8 18 19 29

286

(46)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 131 21

122 3 23

8 18

121 131 21 122 3 23 8 18 19 29

286

(47)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 131 21

122 3 23

8 18

19

121 131 21 122 3 23 8 18 19 29

286

(48)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 122 121 131 23 21 19 29

0 1 2 3 4 5 6 7 8 9

121 131 21

122 3 23

8 18

19 29

286

(49)

0 1 2 3 4 5 6 7 8 9

121 131 21

122 3 23

8 18

19 29

121 131 21 122 3 23 8 18 19 29

286

(50)

Bucket Sort (Sortieren durch Fachverteilen)

121 131 21 122 3 23 8 18 19 29

3 8

18 19

121 21 122

23 29

131

3 8 18 19 121 21 122 23 29

287

(51)

Bucket Sort (Sortieren durch Fachverteilen)

121 131 21 122 3 23 8 18 19 29

0 1 2 3 4 5 6 7 8 9

3 8

18 19

121 21 122

23 29

131

287

(52)

0 1 2 3 4 5 6 7 8 9

3 8

18 19

121 21 122

23 29

131

3 8 18 19 121 21 122 23 29

287

(53)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 19 121 21 122 23 29

3 8 18 19 21

121 122 131

3 8 18 19 21 23 29 121 122 131

288

(54)

Bucket Sort (Sortieren durch Fachverteilen)

3 8 18 19 121 21 122 23 29

0 1 2 3 4 5 6 7 8 9

3 8 18 19 21 23 29

121 122 131

288

(55)

0 1 2 3 4 5 6 7 8 9

3 8 18 19 21 23 29

121 122 131

3 8 18 19 21 23 29 121 122 131

288

(56)

Implementationsdetails

Bucketgrösse sehr unterschiedlich. Zwei Möglichkeiten

289

(57)

Implementationsdetails

Bucketgrösse sehr unterschiedlich. Zwei Möglichkeiten Verkettete Liste für jede Ziffer.

289

(58)

Bucketgrösse sehr unterschiedlich. Zwei Möglichkeiten Verkettete Liste für jede Ziffer.

Ein Array der Länge n, Offsets für jede Ziffer in erstem Durchlauf bestimmen.

289

(59)

Implementationsvarianten der verketteten Liste, amortisierte Analyse [Ottman/Widmayer, Kap. 1.5.1-1.5.2, Cormen et al, Kap.

10.1.-10.2,17.1-17.3]

290

(60)

Abstrakte Datentypen

Wir erinnern uns13 (Vorlesung Informatik I)

EinStackist ein abstrakter Datentyp (ADT) mit Operationen

isEmpty(S): Lieferttrue wenn Stack leer, sonst false. emptyStack(): Liefert einen leeren Stack.

13hoffentlich

291

(61)

Abstrakte Datentypen

Wir erinnern uns13 (Vorlesung Informatik I)

EinStackist ein abstrakter Datentyp (ADT) mit Operationen push(x, S): Legt Element x auf den StapelS.

emptyStack(): Liefert einen leeren Stack.

13hoffentlich

291

(62)

Abstrakte Datentypen

Wir erinnern uns13 (Vorlesung Informatik I)

EinStackist ein abstrakter Datentyp (ADT) mit Operationen push(x, S): Legt Element x auf den StapelS.

pop(S): Entfernt und liefert oberstes Element vonS, oder null.

13hoffentlich

291

(63)

Abstrakte Datentypen

Wir erinnern uns13 (Vorlesung Informatik I)

EinStackist ein abstrakter Datentyp (ADT) mit Operationen push(x, S): Legt Element x auf den StapelS.

pop(S): Entfernt und liefert oberstes Element vonS, oder null. top(S): Liefert oberstes Element vonS, oder null.

13hoffentlich

291

(64)

Abstrakte Datentypen

Wir erinnern uns13 (Vorlesung Informatik I)

EinStackist ein abstrakter Datentyp (ADT) mit Operationen push(x, S): Legt Element x auf den StapelS.

pop(S): Entfernt und liefert oberstes Element vonS, oder null. top(S): Liefert oberstes Element vonS, oder null.

isEmpty(S): Lieferttrue wenn Stack leer, sonst false.

13hoffentlich

291

(65)

Wir erinnern uns (Vorlesung Informatik I)

EinStackist ein abstrakter Datentyp (ADT) mit Operationen push(x, S): Legt Element x auf den StapelS.

pop(S): Entfernt und liefert oberstes Element vonS, oder null. top(S): Liefert oberstes Element vonS, oder null.

isEmpty(S): Lieferttrue wenn Stack leer, sonst false. emptyStack(): Liefert einen leeren Stack.

13hoffentlich

291

(66)

Implementation Push

top xn xn−1 x1 null

push(x, S):

Erzeuge neues Listenelement mit und Zeiger auf den Wert von top.

2 Setze topauf den Knotem mit x.

292

(67)

Implementation Push

top xn xn−1 x1 null

x push(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf den Wert von top.

292

(68)

top xn xn−1 x1 null

x push(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf den Wert von top.

2 Setze topauf den Knotem mit x.

292

(69)

Implementation Pop

top xn xn−1 x1 null

pop(S):

Isttop=null, dann gib null zurück

2 Andernfalls merke Zeiger pvon top inr.

3 Setze topauf p.next und gib r zurück

293

(70)

Implementation Pop

top xn xn−1 x1 null

pop(S):

1 Isttop=null, dann gib null zurück

2 Andernfalls merke Zeiger pvon top inr.

3 Setze topauf p.next und gib r zurück

293

(71)

Implementation Pop

top xn xn−1 x1 null

r pop(S):

1 Isttop=null, dann gib null zurück

2 Andernfalls merke Zeiger pvon top inr.

293

(72)

top xn xn−1 x1 null

r pop(S):

1 Isttop=null, dann gib null zurück

2 Andernfalls merke Zeiger pvon top inr.

3 Setze topauf p.next und gib r zurück

293

(73)

Jede der Operationenpush, pop, topund isEmpty auf dem Stack ist in O(1) Schritten ausführbar.

294

(74)

Queue (Schlange / Warteschlange / Fifo)

Queue ist ein ADT mit folgenden Operationen:

head(Q): liefert das Objekt am Beginn der Schlage zurück (null sonst.)

isEmpty(Q): liefert true wenn Queue leer, sonstfalse. emptyQueue(): liefert leere Queue zurück.

295

(75)

Queue (Schlange / Warteschlange / Fifo)

Queue ist ein ADT mit folgenden Operationen:

enqueue(x, Q): fügtx am Ende der Schlange an.

sonst.)

isEmpty(Q): liefert true wenn Queue leer, sonstfalse. emptyQueue(): liefert leere Queue zurück.

295

(76)

Queue (Schlange / Warteschlange / Fifo)

Queue ist ein ADT mit folgenden Operationen:

enqueue(x, Q): fügtx am Ende der Schlange an.

dequeue(Q): entfernt xvom Beginn der Schlange und gibt x zurück (null sonst.)

emptyQueue(): liefert leere Queue zurück.

295

(77)

Queue (Schlange / Warteschlange / Fifo)

Queue ist ein ADT mit folgenden Operationen:

enqueue(x, Q): fügtx am Ende der Schlange an.

dequeue(Q): entfernt xvom Beginn der Schlange und gibt x zurück (null sonst.)

head(Q): liefert das Objekt am Beginn der Schlage zurück (null sonst.)

295

(78)

Queue (Schlange / Warteschlange / Fifo)

Queue ist ein ADT mit folgenden Operationen:

enqueue(x, Q): fügtx am Ende der Schlange an.

dequeue(Q): entfernt xvom Beginn der Schlange und gibt x zurück (null sonst.)

head(Q): liefert das Objekt am Beginn der Schlage zurück (null sonst.)

isEmpty(Q): liefert true wenn Queue leer, sonstfalse.

295

(79)

enqueue(x, Q): fügtx am Ende der Schlange an.

dequeue(Q): entfernt xvom Beginn der Schlange und gibt x zurück (null sonst.)

head(Q): liefert das Objekt am Beginn der Schlage zurück (null sonst.)

isEmpty(Q): liefert true wenn Queue leer, sonstfalse. emptyQueue(): liefert leere Queue zurück.

295

(80)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

enqueue(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf null.

2 Wenntail 6= null , setzetail.next auf den Knoten mitx.

3 Setze tail auf den Knoten mitx.

4 Isthead = null, dann setze head auf tail.

296

(81)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

x null

enqueue(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf null.

296

(82)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

x null

enqueue(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf null.

2 Wenntail 6= null , setzetail.next auf den Knoten mitx.

296

(83)

Implementation Queue

x1 x2 xn−1 xn

head tail

x null

enqueue(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf null.

2 Wenntail 6= null , setzetail.next auf den Knoten mitx.

3 Setze tailauf den Knoten mit x.

4 Isthead = null, dann setze head auf tail.

296

(84)

Implementation Queue

x1 x2 xn−1 xn

head tail

x null

enqueue(x, S):

1 Erzeuge neues Listenelement mit xund Zeiger auf null.

2 Wenntail 6= null , setzetail.next auf den Knoten mitx.

3 Setze tailauf den Knoten mit x.

4 Isthead = null, dann setze head auf tail.

296

(85)

Invarianten!

x1 x2 xn−1 xn

head tail

null

Mit dieser Implementation gilt

head.next 6= null.

297

(86)

Invarianten!

x1 x2 xn−1 xn

head tail

null

Mit dieser Implementation gilt entweder head = tail = null,

297

(87)

Invarianten!

x1 x2 xn−1 xn

head tail

null

Mit dieser Implementation gilt entweder head = tail = null,

oder head = tail 6= null undhead.next = null

297

(88)

head tail Mit dieser Implementation gilt

entweder head = tail = null,

oder head = tail 6= null undhead.next = null

oder head 6= null und tail 6= null und head 6= tailund head.next 6= null.

297

(89)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

dequeue(S):

1 Merke Zeiger von head in r. Wennr = null, gib r zurück.

2 Setze den Zeiger von head auf head.next.

3 Ist nun head = null, dann setze tail aufnull.

4 Gib den Wert vonr zurück.

298

(90)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

r

dequeue(S):

1 Merke Zeiger von head in r. Wennr = null, gib r zurück.

298

(91)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

r

dequeue(S):

1 Merke Zeiger von head in r. Wennr = null, gib r zurück.

2 Setze den Zeiger von head auf head.next.

298

(92)

Implementation Queue

x1 x2 xn−1 xn

head tail

null

r

dequeue(S):

1 Merke Zeiger von head in r. Wennr = null, gib r zurück.

2 Setze den Zeiger von head auf head.next.

3 Ist nun head = null, dann setze tail aufnull.

298

(93)

head tail r

dequeue(S):

1 Merke Zeiger von head in r. Wennr = null, gib r zurück.

2 Setze den Zeiger von head auf head.next.

3 Ist nun head = null, dann setze tail aufnull.

4 Gib den Wert vonr zurück.

298

(94)

Jede der Operationenenqueue,dequeue,head und isEmptyauf der Queue ist in O(1)Schritten ausführbar.

299

(95)

Implementationsvarianten verketteter Listen

Liste mit Dummy-Elementen (Sentinels).

x1 x2 xn−1 xn

head tail

Vorteil: Weniger Spezialfälle!

300

(96)

x1 x2 xn−1 xn

head tail

Vorteil: Weniger Spezialfälle!

Variante davon: genauso, dabei Zeiger auf ein Element immer einfach indirekt gespeichert.

300

(97)

Doppelt verkettete Liste

null x1 x2 xn−1 xn null

head tail

301

(98)

enqueue insert delete search concat

(A) Θ(1) Θ(1) Θ(n) Θ(n) Θ(n)

(B) Θ(1) Θ(1) Θ(n) Θ(n) Θ(1)

(C) Θ(1) Θ(1) Θ(1) Θ(n) Θ(1)

(D) Θ(1) Θ(1) Θ(1) Θ(n) Θ(1)

(A) = Einfach verkettet

(B) = Einfach verkettet, mit Dummyelement

(C) = Einfach verkettet, mit einfach indirekter Elementaddressierung (D) = Doppelt verkettet

302

(99)

Priority Queue = Warteschlange mit Prioritäten.

Operationen

insert(x,p,Q): Füge Objekt xmit Priorität pein.

extractMax(Q): Entferne Objektx mit höchster Priorität und liefere es.

303

(100)

Mit einem Max-Heap!

Also

insertin Zeit O(?) und extractMax in ZeitO(?).

304

(101)

Mit einem Max-Heap!

Also

insertin Zeit O(logn) und extractMax in ZeitO(?).

304

(102)

Mit einem Max-Heap!

Also

insertin Zeit O(logn) und extractMax in ZeitO(logn).

304

(103)

Multistack unterstützt neben den oben genannten Stackoperationen noch

multipop(s,S): Entferne diemin(size(S), k) zuletzt eingefügten Objekte und liefere diese zurück.

Implementation wie beim Stack. Laufzeit vonmultipop ist O(k).

305

(104)

Akademische Frage

Führen wir auf einem Stack mit nElementenn malmultipop(k,S) aus, kostet das dannO(n2)?

306

(105)

Akademische Frage

Führen wir auf einem Stack mit nElementenn malmultipop(k,S) aus, kostet das dannO(n2)?

Sicher richtig, denn jeder multipop kann Zeit O(n) haben.

306

(106)

Führen wir auf einem Stack mit nElementenn malmultipop(k,S) aus, kostet das dannO(n2)?

Sicher richtig, denn jeder multipop kann Zeit O(n) haben.

Wie machen wir es besser?

306

(107)

Wir führen ein Kostenmodell ein:

Aufruf von push: kostet 1 CHF und zusätzlich 1 CHF kommt aufs Bankkonto

Aufruf von pop: kostet 1 CHF, wird durch Rückzahlung vom Bankkonto beglichen.

Kontostand wird niemals negativ. Also: maximale Kosten: Anzahl derpush Operationen mal zwei.

307

(108)

Amortisierte Kosten der i-ten Operation:

ai := ti + Φi −Φi−1.

Es gilt

n

X

i=1

ai =

n

X

i=1

(ti+ Φi −Φi−1) =

n

X

i=1

ti

!

+ Φn −Φ0

n

X

i=1

ti.

Ziel: Suche Potentialfunktion, die teure Operationen ausgleicht.

308

(109)

push(x, S): Reale Kosten ti = 1. Φi −Φi−1 = 1. Amortisierte Kosten ai = 2.

pop(S): Reale Kostenti = 1. Φi −Φi−1 = −1. Amortisierte Kosten ai = 0.

multipop(k, S): Reale Kostenti = k. Φi −Φi−1 = −k. Amortisierte Kosten ai = 0.

Alle Operationen habenkonstante amortisierte Kosten! Im Durchschnitt hat also Multipop konstanten Zeitbedarf.

309

(110)

maximal k Bitflips. Also O(n·k) Bitflips für Zählen von 1 bisn. Geht das besser?

Reale Kostenti = Anzahl Bitwechsel von 0 nach 1 plus Anzahl Bitwechsel von 1 nach 0.

...0 1111111

| {z }

lEinsen

+1 = ...1 0000000

| {z }

lNullen

.

⇒ti = l + 1

310

(111)

...0 1111111

| {z }

lEinsen

+1 = ...1 0000000

| {z }

lNullen

Potentialfunktion Φi: Anzahl der 1-Bits von xi.

⇒Φi −Φi−1 = 1−l,

⇒ ai = ti+ Φi−Φi−1 = l + 1 + (1−l) = 2.

Amortisiert konstante Kosten für eine Zähloperation.

311

Referenzen

ÄHNLICHE DOKUMENTE

Die Abbildung 3 zeigt, wie die lineare Abbildung im unteren der beiden blauen Drei- ecke operiert.. Das ist das durch die Bilder der drei Einheitsvektoren

Programm soll komprimiert

Algorithmus zum Sortieren eines Feldes mit n Variablen:.

[r]

[r]

Wir werden von vome herein sagen, dass diese Wörter, da sie sich dem Bartb'schen Gesetze nicht fügen , entweder assyrische Wörter sind , aber keine. Derivata mit dem Praefix ma- ,

Da für sie Englisch Zweit- und Fremd- sprache sei, falle es ihnen leichter, ihre Schmerzen mit einer Zahl als sprachlich zu beschreiben: «Wenn wir Schmerzen haben, gehen

einem .dafür angewiesenen Zimmer aufbewahrt und stehen den Mitgliedern i^ur Verfügung, um alsdann der allgemeinen Biblio- thek einverleibt zu werden. Das erste