Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Forelesning 3
Rekursiv dekomponering er kanskjeden viktigste ideen i hele faget, ogdesignmetoden splitt og hersk er engrunnleggende utgave av det: Delinstansen i mindre biter, løs problemetrekursivt for disse, og kombinérløsningene.
Pensum
⇤ Kap. 2. Getting started: 2.3
⇤ Kap. 4. Divide-and-conquer:Innledning, 4.1 og 4.3–4.5
⇤ Kap. 7. Quicksort
⇤ Oppgaver 2.3-5 og 4.5-3 medløsning (binærsøk)
⇤ Appendiks B og C i pensumheftet
Læringsmål
[C1] Forstå divide-and-conquer (splittog hersk)
[C2] Forstå maximum-subarray-problemet med løsninger
[C3] Forstå Bisect og BisectÕ (se
appendiks C i pensumheftet)
[C4] Forstå Merge-Sort
[C5] Forstå Quicksort ogRandomized-Quicksort
[C6] Kunne løse rekurrenser medsubstitusjon, rekursjonstrær ogmasterteoremet
[C7] Kunne løse rekurrenser mediterasjonsmetoden (seappendiks B i pensumheftet)
[C8] Forstå hvordan variabelskiftefungerer
mlh@
ntnu.no
1
Forelesningen filmes
2
d&c
Dette er den velkjente induksjonsstigen vår
mlh@
ntnu.no
3
d&c
Vi reduserer en instans til mindre instanser . . .
mlh@
ntnu.no
4
d&c
. . . til vi treffer grunntilfellet
mlh@
ntnu.no
5
d&c
Vi løser grunntilfellet og bygger vi oss opp igjen
mlh@
ntnu.no
6
d&c
Alle induktive trinn er like, så ser bare på ett av dem
mlh@
ntnu.no
7
d&c
Men vi kan også spalte i flere delinstanser
mlh@
ntnu.no
8
d&c
Men vi kan også spalte i flere delinstanser
mlh@
ntnu.no
9
d&c
Denne designmetoden kalles «splitt og hersk» (divide & conquer)
mlh@
ntnu.no
10
Forelesning
Splitt &
hersk3
11
12
1. Rekurrenser
2. Binærsøk
3. Merge sort
4. Quicksort
5. Masterteoremet
6. Variabelskifte 4.1: Selvstudium
Rekurrenser
13
1:6Fibonacci-sekvensen (fra Liber Abaci, 1228)
Én ting er at vi her regner på kjøretider, men merk at strukturen til utregningene og bevisene er den samme som for algoritmedesign og korrekthetsbevis – det er bare «innholdet» som er forskjellig. Det å forstå rekurrensregning kan være nyttig for å bedre forstå rekursiv dekomponering og algoritmedesign generelt – ikke bare for kjøretidsberegninger.
• Rekurrens: Rekursiv ligning
• Beskriver f.eks. kjøretiden til
rekursive algoritmer
• Må kvitte oss med den rekursive biten
14
• Finn løsning:
• Iterasjonsmetoden
• Rekurrenstrær
• Masterteoremet (senere i dag)
• Verifisér løsning:
• Substitusjon (dvs. induksjon)
15
Iterasjonsmetoden står ikke oppført som læringsmål (en forglemmelse!) – men den er pensum (og står også oppført som pensum).
«Iterasjonsmetoden»: Gjentatt ekspandering av den rekursive forekomsten av funksjonen – det gir oss en sum som vi kan regne ut.
d&c › rekurrenser
T(1) = 1
Antar stort sett dette (evt. T(1) = O(1), e.l.)
mlh@
ntnu.no
16
17
Eksempel: 1 + 1 + …
d&c › rekurrenser
T(n) = T(n − 1) + 1
mlh@
ntnu.no
18
d&c › rekurrenser
T(n) = T(n − 1) + 1
Ett rekursivt kall (størrelse n − 1) pluss én operasjon
mlh@
ntnu.no
19
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n − 1)
mlh@
ntnu.no
20
Rekurre
ns-tre
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ T(n − 1) (1)
21
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ T(n − 1) (1)
22
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ T(n − 1 − 1) (2)
23
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ T(n − 2) (2)
24
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ T(n − 3) (3)
25
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n − ?) (?)
26
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n − ?) (n − 1)
27
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n − (n − 1)) (n − 1)
28
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(1) (n − 1)
29
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ 1 (n − 1)
30
mlh@
ntnu.no
d&c › rekurrenser › T(n) = 1 + T(n − 1)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ 1 (n − 1)
T(n) = n
31
32
VerifikasjonMed substitusjon/induksjon
Her må vi også huske å verifisere at grunntilfellet (f.eks. T(1)=1) stemmer med løsningen vår. Det har jeg ikke eksplisitt diskutert her, men det stemmer for de eksemplene vi ser på.
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
33
Denne løsningen har vi kommet frem til litt uformelt – vi kan verifisere den med induksjon. Det kalles «substitusjonsmetoden», og den kan også brukes om vi bare *gjetter* svaret.
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n
34
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n
35
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
= (n − 1) + 1
Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n
36
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
= (n − 1) + 1
= n − 1 + 1
Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n
37
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
= (n − 1) + 1
= n − 1 + 1
= n
Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n
38
mlh@
ntnu.no
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n) = T(n − 1) + 1
= (n − 1) + 1
= n − 1 + 1
= n
Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n
39
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n − 1)
mlh@
ntnu.no
40
d&c › rekurrenser › T(n) = T(n − 1) + 1
T(n − 1)
T(n) = n
mlh@
ntnu.no
41
Binærsøk
42
2:6Sir Thomas Little Heath sin beskrivelse av Herons metode for å approksimere kvadratrøtter ved hjelp av en nær slektning av binærsøk – en metode som antagelig ble brukt allerede av babylonerne.
(Heath, A History of Greek Mathematics, vol. 2, 1921; Fowler & Robson, Square Root Approximations in Old Babylonian Mathematics: YBC 7289 in Context, 1998)
Her bruker vi strengt tatt fortsatt bare én delinstans – men strategien med å halvere instansen er en vanlig ingrediens i mer typiske D&C-algoritmer (som vi straks skal se på).
• Sortert sekvens
• Er det du leter etter i første halvdel?
• Hvis ja: Let videre der
• Hvis nei: Let i den andre halvdelen
43
d&c › binærsøk
11
1
22
2
33
3
44
4
55
5
66
6
77
7
88
8
(Anta at kortet ditt er 6)
mlh@
ntnu.no
44
Her sjekker jeg bare hvilken halvdel jeg skal lete i – og sjekker ikke om kortet vi ser på er det vi er ute etter før vi kommer til bunnen. I pseudokoden senere har vi den sjekken i tillegg.
d&c › binærsøk
11
1
22
2
33
3
44
4
55
5
66
6
77
7
88
8
Er kortet større enn A[4]?
mlh@
ntnu.no
45
d&c › binærsøk
11
1
22
2
33
3
44
4
55
5
66
6
77
7
88
8
55
5
66
6
77
7 88
8
Er kortet større enn A[6]?
mlh@
ntnu.no
46
d&c › binærsøk
11
1
22
2
33
3
44
4
55
5
66
6
77
7
88
8
55
5
66
6
77
7 88
8
55
5
66
6
Er kortet større enn A[5]?
mlh@
ntnu.no
47
d&c › binærsøk
11
1
22
2
33
3
44
4
55
5
66
6
77
7
88
8
55
5
66
6
77
7 88
8
55
5
66
6
66
6
Er A[6] kortet ditt?
mlh@
ntnu.no
48
d&c › binærsøk
11
1
11
1
11
1
11
1
1
lg n
Antall spørsmål: lg n + 1
mlh@
ntnu.no
49
Bisect(A, p, r, v)
A er sortert. Om mulig, finn en indeks i så A[i] == v
A tabellp venstrer høyrev søkeverdi
d&c › binærsøk
mlh@
ntnu.no
50
Bisect(A, p, r, v)
Har vi i det hele tatt et segment å lete i?
1 if p Æ r
A tabellp venstrer høyrev søkeverdi
d&c › binærsøk
mlh@
ntnu.no
51
Bisect(A, p, r, v)1 if p Æ r
Del på midten
2 q = Â(p + r)/2Ê
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
52
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê
Er dette verdien vi leter etter?
3 if v == A[q]
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
53
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]
I så fall er vi ferdige
4 return q
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
54
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q
Ellers: Må v ligge til venstre?
5 elseif v < A[q]
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
55
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]
Let videre til venstre
6 return Bisect(A, p, q ≠ 1, v)
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
56
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)
Ellers må v ligge til høyre, så vi leter videre der
7 else return Bisect(A, q + 1, r, v)
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
57
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)
Vi fant ikke v, så vi returnerer nil
8 return nil
A tabellp venstrer høyrev søkeverdiq midten
d&c › binærsøk
mlh@
ntnu.no
58
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
59
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
60
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
61
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
62
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
63
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
64
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
65
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
66
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
67
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
68
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
69
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
70
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p, q, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
71
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p, q, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
72
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! 5
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p, q, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
73
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
74
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! 5
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
75
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
76
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! 5
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
77
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
78
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
79
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
80
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
81
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
82
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
83
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
84
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
85
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
86
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
q
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
87
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
88
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
89
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, q, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
90
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, q, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
91
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, q, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
92
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
r
p
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4 › 5, 4, 4
d&c › binærsøk
mlh@
ntnu.no
93
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
r
p
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4 › 5, 4, 4
d&c › binærsøk
mlh@
ntnu.no
94
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
r
p
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4 › 5, 4, 4
d&c › binærsøk
mlh@
ntnu.no
95
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
96
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p, r
p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4
d&c › binærsøk
mlh@
ntnu.no
97
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
98
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4 › 5, 8, 4
d&c › binærsøk
mlh@
ntnu.no
99
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
100
Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil
! nil
1 1
2 2
2 3
3 4
5 5
5 6
6 7
7 8
p
r
p, r, v = 1, 8, 4
d&c › binærsøk
mlh@
ntnu.no
101
d&c › binærsøk
T(n) = T(n/2) + 1
mlh@
ntnu.no
102
Her gjør jeg endel antagelser/forenklinger, f.eks. at delproblemet har størrelse n/2 og ikke n/2 – 1 – og at vi ikke finner v før vi har kommet til bunnen. Disse antagelsene har ikke noe å si for den asymptotiske worst-case-kjøretiden.
d&c › binærsøk
T(n) = T(n/2) + 1
Ett rekursivt kall (størrelse n/2) pluss én operasjon
mlh@
ntnu.no
103
d&c › binærsøk › T(n) = T(n/2) + 1
T(n/2)
mlh@
ntnu.no
104
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ T(n/2) (1)
105
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ T(n/2) (1)
106
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ T(n/2/2) (2)
107
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ T(n/4) (2)
108
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ T(n/8) (3)
109
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n/2?) (?)
110
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n/2?) (lg n)
111
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n/2lg n) (lg n)
112
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(n/n) (lg n)
113
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ T(1) (lg n)
114
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ 1 (lg n)
115
mlh@
ntnu.no
d&c › binærsøk › T(n) = 1 + T(n/2)
T(n) = 1
+ 1 (1)
+ 1 (2)
+ 1 (3)
......
+ 1 (lg n)
T(n) = lg n + 1
116
117
VerifikasjonMed substitusjon/induksjon
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
118
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1
119
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1
120
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
= (lgn
2+ 1) + 1
Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1
121
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
= (lgn
2+ 1) + 1
= lg n − lg 2 + 2
Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1
122
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
= (lgn
2+ 1) + 1
= lg n − lg 2 + 2
= lg n + 1
Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1
123
mlh@
ntnu.no
d&c › binærsøk › T(n) = T(n/2) + 1
T(n) = T(n/2) + 1
= (lgn
2+ 1) + 1
= lg n − lg 2 + 2
= lg n + 1
Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1
124
d&c › binærsøk › T(n) = T(n/2) + 1
T(n/2)
mlh@
ntnu.no
125
d&c › binærsøk › T(n) = T(n/2) + 1
T(n/2)
T(n) = lg n + 1
mlh@
ntnu.no
126
254
©
• D . E
. K n u
t h
X: ,~5
) ~
~, , z, ,
... :
¢ ) T
Y, o)
w ' .~ ' - .
~ . , .~
~,) ~ . ,
7,, ,,'> ,
. : ,~ ,.,
., - : / t .
. . . . ,-
~,) a- -
. 7i,
~2) / ¢ " /
r .,o,
"d,"," "
, ' . ~ ",
-
. - ~. ) ...
~ "~
~ , .~.
/o,) ~ - .
~" I
Ab/A~I~¢
7~,..,..,, . ,
~ ,, ~
.,.,.,.~.,,
-f" ,'¢.~
~ ~.,:,
~ a, /,,
, /,, /,.,
c,~,) ~
co,,.v, -- , '
, .~-~,/- , .~
/ ' , - - ~
"~,-~ "I"
< ~2 .
FIG. 1.
The
or igina l
manus
c r i pt .
simply
change
d line
27 to
"SEL B
ETA,
GAMM
A", om
itting li
nes 24,
25, 30,
31, 32,
33, 34,
35 entir
ely, an
d then
he could
have
used B
ETA a
nd GA
MMA
instead
of
ALPHA
1 and A
LPHA2
in the r
emainde
r of
the prog
ram. Th
is would
have sa
ved fou
r of
the prec
ious sh
ort tank
locati
ons, an
d it
would h
ave m
ade th
e calcu
lation s
lightly
faster.
Similarl
y line 3
6 is unn
ecessary
, since
location
EXIT
could b
e stored
in LDE
LTA.
Computi
ng Surve
ys, Voi. 2
, No. 4,
Decemb
er 19T0
Merge sort
127
3:6Kalles også «flettesortering» på norsk.
«[Von Neumann’s] manuscript, written in ink, is 23 pages long; the first page still shows traces of the penciled phrase "TOP SECRET," which was subsequently erased. (In 1945, work on computers was classified, due to its connections with military problems.)»
Donald Knuth, «Von Neumann’s First Computer Program»
http://dl.acm.org/citation.cfm?doid=356580.356581
• Sortér venstre halvdel rekursivt
• Sortér høyre halvdel rekursivt
• Flett sammen halvdelene
128
• Sortér venstre halvdel rekursivt
• Sortér høyre halvdel rekursivt
• Flett sammen halvdelene
129
Merge(A, p, q, r)
Flett sorterte segmenter A[p . . q] og A[q + 1 . . r]
A tabellp venstreq midtenr høyre
d&c › merge sort
mlh@
ntnu.no
130
Merge(A, p, q, r)
Lengden til første segment, A[p . . q]
1 n1 = q − p + 1
A tabellp venstreq midtenr høyren1 v. lengde
d&c › merge sort
mlh@
ntnu.no
131
Merge(A, p, q, r)1 n1 = q − p + 1
Lengden til andre segment, A[p + 1 . . r]
2 n2 = r − q
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengde
d&c › merge sort
mlh@
ntnu.no
132
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q
Vi kopierer midlertidig innholdet i A[p . . q] og A[q + 1 . . r] til L og R
3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.
d&c › merge sort
mlh@
ntnu.no
133
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]
For hver indeks i i L . . .
4 for i = 1 to n1
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i L
d&c › merge sort
mlh@
ntnu.no
134
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n1
Kopier tilsvarende element fra A[p . . q]
5 L[i] = A[p + i − 1]
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i L
d&c › merge sort
mlh@
ntnu.no
135
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]
For hver indeks j i R . . .
6 for j = 1 to n2
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
136
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n2
Kopier tilsvarende element fra A[q + 1 . . r]
7 R[j] = A[q + j]
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
137
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n27 R[j] = A[q + j]
Vaktpost (sentinel) så vi slipper å sjekke om vi er ved slutten
8 L[n1 + 1] = ∞
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
138
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n27 R[j] = A[q + j]8 L[n1 + 1] = ∞
Vaktpost (sentinel) så vi slipper å sjekke om vi er ved slutten
9 R[n2 + 1] = ∞
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
139
Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n27 R[j] = A[q + j]8 L[n1 + 1] = ∞9 R[n2 + 1] = ∞
10 . . .
A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
140
Merge(A, p, q, r)10 . . .
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
141
Merge(A, p, q, r)10 . . .
Hvor er vi i L?
11 i = 1
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
142
Merge(A, p, q, r)10 . . .11 i = 1
Hvor er vi i R?
12 j = 1
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i R
d&c › merge sort
mlh@
ntnu.no
143
Merge(A, p, q, r)10 . . .11 i = 112 j = 1
Vi setter inn i A[p . . r]. For hver indeks k, bruk min{L[i], R[j]}
13 for k = p to r
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A
d&c › merge sort
mlh@
ntnu.no
144
Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r
Hvis L[i] er minst . . .
14 if L[i] Æ R[j]
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A
d&c › merge sort
mlh@
ntnu.no
145
Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]
Bruk L[i]
15 A[k] = L[i]
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A
d&c › merge sort
mlh@
ntnu.no
146
Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]15 A[k] = L[i]
Vi har brukt L[i], så vi flytter oss videre
16 i = i + 1
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A
d&c › merge sort
mlh@
ntnu.no
147
Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]15 A[k] = L[i]16 i = i + 1
Ellers så er R[j] minst, så vi bruker den
17 else A[k] = R[j]
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A
d&c › merge sort
mlh@
ntnu.no
148
Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]15 A[k] = L[i]16 i = i + 117 else A[k] = R[j]
Vi har brukt R[j], så vi flytter oss videre
18 j = j + 1
A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A
d&c › merge sort
mlh@
ntnu.no
149
d&c › merge sort
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
Forenklet fremstilling av samme prosedyre
mlh@
ntnu.no
150
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
2 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
p
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
151
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
2 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
k, p
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
152
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
2 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
k, p
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
153
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
k, p
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
154
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
k, p
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
155
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
156
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
4 2
5 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
157
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
5 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
158
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
5 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
159
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
5 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
160
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
5 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
161
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
2 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
162
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
2 3
7 4
1 5
2 6
3 7
6 8
p
k
r
L
2 1
4 2
5 3
7 4
∞ 5
i
R
1 1
2 2
3 3
6 4
∞ 5
j
d&c › merge sort
mlh@
ntnu.no
163
. . .
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
k, r
L
2 1
4 2
5 3
7 4
∞ 5i
R
1 1
2 2
3 3
6 4
∞ 5j
d&c › merge sort
mlh@
ntnu.no
164
Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1
A
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
p
r
L
2 1
4 2
5 3
7 4
∞ 5i
R
1 1
2 2
3 3
6 4
∞ 5j
d&c › merge sort
mlh@
ntnu.no
165
• Sortér venstre halvdel rekursivt
• Sortér høyre halvdel rekursivt
• Flett sammen halvdelene
166
• Sortér venstre halvdel rekursivt
• Sortér høyre halvdel rekursivt
• Flett sammen halvdelene
167
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
Skal sortere A[1 . . 8]
mlh@
ntnu.no
168
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
Sortér først A[1 . . 4] og så A[5 . . 8]
mlh@
ntnu.no
169
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
Skal sortere A[1 . . 4]
mlh@
ntnu.no
170
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
Sortér først A[1 . . 2] og så A[3 . . 4]
mlh@
ntnu.no
171
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
88
8
77
7
Skal sortere A[1 . . 2]
mlh@
ntnu.no
172
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
88
8
77
7
Sortér først A[1] og så A[2]
mlh@
ntnu.no
173
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
88
8
77
7
88
8
A[1] er sortert
mlh@
ntnu.no
174
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
88
8
77
7
Sortér først A[1] og så A[2]
mlh@
ntnu.no
175
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
88
8
77
7
77
7
A[2] er sortert
mlh@
ntnu.no
176
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
88
8
77
7
Flett sammen A[1] og A[2]
mlh@
ntnu.no
177
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
88
8 77
7
66
6
55
5
77
7
88
8
A[1 . . 2] er sortert
mlh@
ntnu.no
178
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
Sortér først A[1 . . 2] og så A[3 . . 4]
mlh@
ntnu.no
179
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
66
6
55
5
Skal sortere A[3 . . 4]
mlh@
ntnu.no
180
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
66
6
55
5
Sortér først A[3] og så A[4]
mlh@
ntnu.no
181
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
66
6
55
5
66
6
A[3] er sortert
mlh@
ntnu.no
182
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
66
6
55
5
Sortér først A[3] og så A[4]
mlh@
ntnu.no
183
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
66
6
55
5
55
5
A[4] er sortert
mlh@
ntnu.no
184
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
66
6
55
5
Flett sammen A[3] og A[4]
mlh@
ntnu.no
185
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
66
6
55
5
55
5
66
6
A[3 . . 4] er sortert
mlh@
ntnu.no
186
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
77
7 88
8
55
5
66
6
Flett sammen A[1 . . 2] og A[3 . . 4]
mlh@
ntnu.no
187
d&c › merge sort
88
8
77
7
66
6
55
5
44
4
33
3
22
2
11
1
55
5 66
6
77
7
88
8
A[1 . . 4] er sortert
mlh@
ntnu.no
188
d&c › merge sort
55
5
66
6
77
7
88
8
44
4
33
3
22
2
11
1
Sortér først A[1 . . 4] og så A[5 . . 8]
mlh@
ntnu.no
189
. . .
d&c › merge sort
55
5
66
6
77
7
88
8
11
1
22
2
33
3
44
4
Flett sammen A[1 . . 4] og A[5 . . 8]
mlh@
ntnu.no
190
d&c › merge sort
11
1
22
2
33
3
44
4
55
5
66
6
77
7
88
8
A[1 . . 8] er sortert
mlh@
ntnu.no
191
d&c › merge sort
11
1
11
1
11
1
11
1
11
1
11
1
11
1
11
1
11
1 11
1
11
1
11
1
11
1
11
1
11
1 11
1
11
1
11
1
11
1
11
1
11
1
11
1 11
1
11
1
11
1
11
1 11
1
11
1
11
1
11
1
11
1
11
1
1 n
1
lg n
mlh@
ntnu.no
192
d&c › merge sort
Merge-Sort(A, p, r)
Sortér A[p . . r] ved å sortere halvdelene først
mlh@
ntnu.no
193
d&c › merge sort
Merge-Sort(A, p, r)
Hvis A[p . . r] har lengde minst 2 . . .
1 if p < r
mlh@
ntnu.no
194
d&c › merge sort
Merge-Sort(A, p, r)1 if p < r
Del på midten
2 q = Â(p + r)/2Ê
mlh@
ntnu.no
195
d&c › merge sort
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê
Sortér A[p . . q] rekursivt
3 Merge-Sort(A, p, q)
mlh@
ntnu.no
196
d&c › merge sort
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)
Sortér A[q + 1 . . r] rekursivt
4 Merge-Sort(A, q + 1, r)
mlh@
ntnu.no
197
d&c › merge sort
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)
Flett sorterte segmenter A[p . . q] og A[q + 1 . . r]
5 Merge(A, p, q, r)
mlh@
ntnu.no
198
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8
d&c › merge sort
mlh@
ntnu.no
199
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8
d&c › merge sort
mlh@
ntnu.no
200
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
q
r
p, r = 1, 8
d&c › merge sort
mlh@
ntnu.no
201
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4
d&c › merge sort
mlh@
ntnu.no
202
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4
d&c › merge sort
mlh@
ntnu.no
203
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
q
r
p, r = 1, 8 › 1, 4
d&c › merge sort
mlh@
ntnu.no
204
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 1, 2
d&c › merge sort
mlh@
ntnu.no
205
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 1, 2
d&c › merge sort
mlh@
ntnu.no
206
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p, q
r
p, r = 1, 8 › 1, 4 › 1, 2
d&c › merge sort
mlh@
ntnu.no
207
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p, r
p, r = 1, 8 › 1, 4 › 1, 2 › 1, 1
d&c › merge sort
mlh@
ntnu.no
208
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 1, 2
d&c › merge sort
mlh@
ntnu.no
209
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p, r
p, r = 1, 8 › 1, 4 › 1, 2 › 2, 2
d&c › merge sort
mlh@
ntnu.no
210
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 1, 2
d&c › merge sort
mlh@
ntnu.no
211
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4
d&c › merge sort
mlh@
ntnu.no
212
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 3, 4
d&c › merge sort
mlh@
ntnu.no
213
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 3, 4
d&c › merge sort
mlh@
ntnu.no
214
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p, q
r
p, r = 1, 8 › 1, 4 › 3, 4
d&c › merge sort
mlh@
ntnu.no
215
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p, r
p, r = 1, 8 › 1, 4 › 3, 4 › 3, 3
d&c › merge sort
mlh@
ntnu.no
216
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 3, 4
d&c › merge sort
mlh@
ntnu.no
217
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p, r
p, r = 1, 8 › 1, 4 › 3, 4 › 4, 4
d&c › merge sort
mlh@
ntnu.no
218
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
6 3
5 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4 › 3, 4
d&c › merge sort
mlh@
ntnu.no
219
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
5 3
6 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 1, 4
d&c › merge sort
mlh@
ntnu.no
220
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
5 3
6 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8
d&c › merge sort
mlh@
ntnu.no
221
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
5 3
6 4
2 5
1 6
7 7
3 8
p
r
p, r = 1, 8 › 5, 8
d&c › merge sort
mlh@
ntnu.no
222
. . .
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
2 1
4 2
5 3
6 4
1 5
2 6
3 7
7 8
p
r
p, r = 1, 8
d&c › merge sort
mlh@
ntnu.no
223
Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)
1 1
2 2
2 3
3 4
4 5
5 6
6 7
7 8
mlh@
ntnu.no
224
d&c › merge sort
T(n) = 2T(n/2) + n
mlh@
ntnu.no
225
d&c › merge sort
T(n) = 2T(n/2) + n
To rekursive kall (størrelse n/2) pluss n operasjoner
mlh@
ntnu.no
226
d&c › merge sort › T(n) = 2T(n/2) + n
T(n/2)
mlh@
ntnu.no
227
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ 2T(n/2) (1)
228
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ 2T(n/2) (1)
229
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ 2 · n/2 (1)
+ 2 · 2T(n/2/2) (2)
230
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ 4T(n/4) (2)
231
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ 8T(n/8) (3)
232
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ 2? · T(n/2?) (?)
233
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ 2? · T(n/2?) (lg n)
234
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ 2lg n · T(n/2lg n) (lg n)
235
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ n · T(n/n) (lg n)
236
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ n · T(1) (lg n)
237
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ n (lg n)
238
mlh@
ntnu.no
d&c › merge sort › T(n) = n + 2T(n/2)
T(n) = n
+ n (1)
+ n (2)
+ n (3)
......
+ n (lg n)
T(n) = n lg n + n
239
240
VerifikasjonMed substitusjon/induksjon
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
241
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
242
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
243
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
= 2
3
n
2lg
n
2+
n
2
4
+ n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
244
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
= 2
3
n
2lg
n
2+
n
2
4
+ n
= n lgn
2+ n + n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
245
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
= 2
3
n
2lg
n
2+
n
2
4
+ n
= n lgn
2+ n + n
= n(lg n − lg 2) + 2n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
246
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
= 2
3
n
2lg
n
2+
n
2
4
+ n
= n lgn
2+ n + n
= n(lg n − lg 2) + 2n
= n lg n + n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
247
mlh@
ntnu.no
d&c › merge sort › T(n) = 2T(n/2) + n
T(n) = 2T(n/2) + n
= 2
3
n
2lg
n
2+
n
2
4
+ n
= n lgn
2+ n + n
= n(lg n − lg 2) + 2n
= n lg n + n
Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n
248
d&c › merge sort › T(n) = 2T(n/2) + n
T(n/2)
mlh@
ntnu.no
249
d&c › merge sort › T(n) = 2T(n/2) + n
T(n/2)
T(n) = n lg n + n
mlh@
ntnu.no
250
Det er lg(n) + 1 rader, og summen av arbeidet i hver rad er n.
Downloaded from
4:6
Quic
kso
rt
251
Fra
196
2
• Skill «små» og «store» tall
• Sortér små tall rekursivt
• Sortér store tall rekursivt
252
• Skill «små» og «store» tall
• Sortér små tall rekursivt
• Sortér store tall rekursivt
253
Partition(A, p, r)
Del to segmenter: Ett med små og ett med store verdier
A tabellp venstrer høyre
d&c › quicksort
mlh@
ntnu.no
254
Partition(A, p, r)
Splittelement (pivot): Vilkårlig grense for hva vi kaller smått
1 x = A[r]
A tabellp venstrer høyrex splitt
d&c › quicksort
mlh@
ntnu.no
255
Partition(A, p, r)1 x = A[r]
Siste indeks i segmentet med små verdier. Foreløpig tomt
2 i = p − 1
A tabellp venstrer høyrex splitti siste, små
d&c › quicksort
mlh@
ntnu.no
256
Partition(A, p, r)1 x = A[r]2 i = p − 1
Siste indeks i segmentet med store verdier
3 for j = p to r − 1
A tabellp venstrer høyrex splitti siste, småj siste, store
d&c › quicksort
mlh@
ntnu.no
257
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 1
A[j] er liten: Må flyttes til segmentet med små verdier
4 if A[j] ≤ x
A tabellp venstrer høyrex splitti siste, småj siste, store
d&c › quicksort
mlh@
ntnu.no
258
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x
Utvid segmentet med små verdier. A[i] foreløpig stor
5 i = i + 1
A tabellp venstrer høyrex splitti siste, småj siste, store
d&c › quicksort
mlh@
ntnu.no
259
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 1
Både A[i] og A[j] er i feil segment, så de bytter plass
6 exchange A[i] with A[j]
A tabellp venstrer høyrex splitti siste, småj siste, store
d&c › quicksort
mlh@
ntnu.no
260
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]
Splittelementet er nå på riktig (sortert) plass, mellom segmentene
7 exchange A[i + 1] with A[r]
A tabellp venstrer høyrex splitti siste, småj siste, store
d&c › quicksort
mlh@
ntnu.no
261
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]
Returnér hvor splitten havnet
8 return i + 1
A tabellp venstrer høyrex splitti siste, småj siste, store
d&c › quicksort
mlh@
ntnu.no
262
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
p
r
x, i = −, −
d&c › quicksort
mlh@
ntnu.no
263
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
p
r
x, i = 4, −
d&c › quicksort
mlh@
ntnu.no
264
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
p
r
x, i = 4, 0
d&c › quicksort
mlh@
ntnu.no
265
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
j, p
r
x, i = 4, 0
d&c › quicksort
mlh@
ntnu.no
266
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
j, p
r
x, i = 4, 0
d&c › quicksort
mlh@
ntnu.no
267
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, j, p
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
268
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, j, p
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
269
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, p
j
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
270
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, p
j
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
271
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, p
j
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
272
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, p
j
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
273
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, p
j
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
274
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
i, p
j
r
x, i = 4, 1
d&c › quicksort
mlh@
ntnu.no
275
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
8 2
7 3
1 4
3 5
5 6
6 7
4 8
p
i
j
r
x, i = 4, 2
d&c › quicksort
mlh@
ntnu.no
276
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
1 2
7 3
8 4
3 5
5 6
6 7
4 8
p
i
j
r
x, i = 4, 2
d&c › quicksort
mlh@
ntnu.no
277
. . .
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
1 2
3 3
8 4
7 5
5 6
6 7
4 8
p
i
j
r
x, i = 4, 3
d&c › quicksort
mlh@
ntnu.no
278
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
2 1
1 2
3 3
4 4
7 5
5 6
6 7
8 8
p
i
j
r
x, i = 4, 3
d&c › quicksort
mlh@
ntnu.no
279
Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1
! 4
2 1
1 2
3 3
4 4
7 5
5 6
6 7
8 8
p
i
j
r
x, i = 4, 3
d&c › quicksort
mlh@
ntnu.no
280
• Skill «små» og «store» tall
• Sortér små tall rekursivt
• Sortér store tall rekursivt
281
• Skill «små» og «store» tall
• Sortér små tall rekursivt
• Sortér store tall rekursivt
282
d&c › quicksort
Quicksort(A, p, r)
Sortér A[p . . r] ved å sortere små og store verdier hver for seg
mlh@
ntnu.no
283
d&c › quicksort
Quicksort(A, p, r)
Hvis A[p . . r] har lengde minst 2 . . .
1 if p < r
mlh@
ntnu.no
284
d&c › quicksort
Quicksort(A, p, r)1 if p < r
A[p . . q − 1] ≤ A[q] ≤ A[q + 1 . . r]. Merk at A[q] er på rett plass
2 q = Partition(A, p, r)
mlh@
ntnu.no
285
d&c › quicksort
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)
Sortér små verdier A[p . . q − 1] rekursivt
3 Quicksort(A, p, q − 1)
mlh@
ntnu.no
286
d&c › quicksort
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)
Sortér store verdier A[q + 1 . . r] rekursivt
4 Quicksort(A, q + 1, r)
mlh@
ntnu.no
287
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
5 1
2 2
4 3
7 4
1 5
3 6
2 7
6 8
p
r
p, q, r = 1, −, 8
d&c › quicksort
mlh@
ntnu.no
288
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
5 1
2 2
4 3
7 4
1 5
3 6
2 7
6 8
p
r
p, q, r = 1, −, 8
d&c › quicksort
mlh@
ntnu.no
289
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
5 1
2 2
4 3
1 4
3 5
2 6
6 7
7 8
p
q
r
p, q, r = 1, 7, 8
d&c › quicksort
mlh@
ntnu.no
290
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
5 1
2 2
4 3
1 4
3 5
2 6
6 7
7 8
p
r
p, q, r = 1, 7, 8 › 1, −, 6
d&c › quicksort
mlh@
ntnu.no
291
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
5 1
2 2
4 3
1 4
3 5
2 6
6 7
7 8
p
r
p, q, r = 1, 7, 8 › 1, −, 6
d&c › quicksort
mlh@
ntnu.no
292
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
2 1
1 2
2 3
5 4
3 5
4 6
6 7
7 8
p
q
r
p, q, r = 1, 7, 8 › 1, 3, 6
d&c › quicksort
mlh@
ntnu.no
293
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
2 1
1 2
2 3
5 4
3 5
4 6
6 7
7 8
p
r
p, q, r = 1, 7, 8 › 1, 3, 6 › 1, −, 2
d&c › quicksort
mlh@
ntnu.no
294
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
2 1
1 2
2 3
5 4
3 5
4 6
6 7
7 8
p
r
p, q, r = 1, 7, 8 › 1, 3, 6 › 1, −, 2
d&c › quicksort
mlh@
ntnu.no
295
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
1 1
2 2
2 3
5 4
3 5
4 6
6 7
7 8
p, q
r
p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2
d&c › quicksort
mlh@
ntnu.no
296
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
1 1
2 2
2 3
5 4
3 5
4 6
6 7
7 8
p
p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2 › 1, −, 0
d&c › quicksort
mlh@
ntnu.no
297
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
1 1
2 2
2 3
5 4
3 5
4 6
6 7
7 8
p
p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2 › 1, −, 0
d&c › quicksort
mlh@
ntnu.no
298
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
1 1
2 2
2 3
5 4
3 5
4 6
6 7
7 8
p, q
r
p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2
d&c › quicksort
mlh@
ntnu.no
299
Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)
1 1
2 2
2 3
5 4
3 5
4 6
6 7
7 8
p, r
p, q, r = 1, 7, 8 › 1,