forelesning 3 læringsmål - algoritmer og datastrukturerforelesning splitt & hersk 3 11 12 1....
TRANSCRIPT
-
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,