Øvingsforelesning 4 Martin asen
2 Først en kjapp recap av øving 2
verage-case vs. amortisert analyse verage-case mortisert analyse Forventet kjøretid over instanser Snitt over operasjoner 3
mortisert analyse mortisert analyse ser på gjennomsnitts «kostnaden» over n operasjoner ltså: regn ut «kostnaden» av å utføre n operasjoner, og del på n Gir et mer helhetlig bilde av hva du kan forvente når du gjør én ekstra operasjon. 4
5 Spørsmål 18 (øving 2)
Sletting i lenkede lister Enkel-lenket liste Dobbel-lenket liste 1 2 3 4 1 2 3 4 Delete(L,x) har worst-case Delete(L,x) har worst-case 6
Sletting i enkel lenket liste Delete(L, 3) 1 2 3 4 7
Sletting i enkel lenket liste Delete(L, 3) 3s peker til 4 må slettes Vi har tilgang til objekte 3, dermed tar dette O(1) 1 2 3 4 8
Sletting i enkel lenket liste Delete(L, 3) 3s peker til 4 må slettes Vi har tilgang til objektet 3, dermed tar dette 1 2 3 4 1 2 3 4 9
Sletting i enkel lenket liste Delete(L, 3) 3s peker til 4 må slettes Vi har tilgang til objektet 3, dermed tar dette Så må 2s peker til 3 endres til å peke til 4 1 2 3 4 1 2 3 4 10
Sletting i enkel lenket liste Delete(L, 3) 3s peker til 4 må slettes Vi har tilgang til objektet 3, dermed tar dette Så må 2s peker til 3 endres til å peke til 4 Vi må finne 2, dette tar i worst-case 4 kjenner vi fra 3 1 2 3 4 1 2 3 4 1 2 4 3 11
Sletting i enkel lenket liste Delete(L, 3) 3s peker til 4 må slettes Vi har tilgang til objekte 3, dermed tar dette Så må 2s peker til tre endres til å peke til 4 Vi må finne 2, dette tar i worst-case 4 kjenner vi fra 3 Totalt i worst-case 1 2 3 4 1 2 3 4 1 2 4 3 1 2 4 12
Sletting i dobbel lenket liste Delete(L, 3) 1 2 3 4 13
Sletting i dobbel lenket liste Delete(L, 3) 1 2 3 4 14
Sletting i dobbel lenket liste Delete(L, 3) Slette 3s pekere tar Delete tar inn objektet 3, ikke kun verdien til noden 1 2 3 4 1 2 3 4 15
Sletting i dobbel lenket liste Delete(L, 3) Slette 3s pekere tar Delete tar inn objektet 3, ikke kun verdien til noden Oppdatere 2 og 4s pekere kan gjøres i Vi kjenner nodene fra 3s pekere 1 2 3 4 1 2 3 4 1 2 4 3 16
Sletting i dobbel lenket liste Delete(L, 3) Slette 3s pekere tar Delete tar inn objektet 3, ikke kun verdien til noden Oppdatere 2 og 4s pekere kan gjøres i Vi kjenner nodene fra 3s pekere Totalt i worst-case 1 2 3 4 1 2 3 4 1 2 4 3 1 2 4 17
genda Tellesortering Radix sort øttesortering Streng sortering 18
Tellesortering Counting-Sort(,, k) la C[0.. k] være et nytt array for i = 0 til k C[ i ] = 0 For j = 1 til.length C[ [ j ] ] = C[ [ j ] ] + 1 // C[i] inneholder nå antall elementer lik i for i = 1 til k C[ i ] = C[ i ] + C[ i-1 ] // C[i] inneholder nå antall elementer mindre eller lik i for j =.length ned til 1 [ C[ [ j ] ] ] = [ j ] C[ [ j ] ] = C[ [ j ] ] 1 19
Tellesortering Counting-Sort(,, k) la C[0.. k] være et nytt array for i = 0 til k C[ i ] = 0 For j = 1 til.length C[ [ j ] ] = C[ [ j ] ] + 1 // C[i] inneholder nå antall elementer lik i for i = 1 til k C[ i ] = C[ i ] + C[ i-1 ] // C[i] inneholder nå antall elementer mindre eller lik i for j =.length ned til 1 [ C[ [ j ] ] ] = [ j ] C[ [ j ] ] = C[ [ j ] ] 1 20
Tellesortering Counting-Sort(,, k) la C[0.. k] være et nytt array for i = 0 til k C[ i ] = 0 For j = 1 til.length C[ [ j ] ] = C[ [ j ] ] + 1 // C[i] inneholder nå antall elementer lik i for i = 1 til k C[ i ] = C[ i ] + C[ i-1 ] // C[i] inneholder nå antall elementer mindre eller lik i for j =.length ned til 1 [ C[ [ j ] ] ] = [ j ] C[ [ j ] ] = C[ [ j ] ] 1 21
Tellesortering Counting-Sort(,, k) la C[0.. k] være et nytt array for i = 0 til k C[ i ] = 0 For j = 1 til.length C[ [ j ] ] = C[ [ j ] ] + 1 // C[i] inneholder nå antall elementer lik i for i = 1 til k C[ i ] = C[ i ] + C[ i-1 ] // C[i] inneholder nå antall elementer mindre eller lik i for j =.length ned til 1 [ C[ [ j ] ] ] = [ j ] C[ [ j ] ] = C[ [ j ] ] 1 22
Tellesortering Counting-Sort(,, k) la C[0.. k] være et nytt array for i = 0 til k C[ i ] = 0 For j = 1 til.length C[ [ j ] ] = C[ [ j ] ] + 1 // C[i] inneholder nå antall elementer lik i for i = 1 til k C[ i ] = C[ i ] + C[ i-1 ] // C[i] inneholder nå antall elementer mindre eller lik i for j =.length ned til 1 [ C[ [ j ] ] ] = [ j ] C[ [ j ] ] = C[ [ j ] ] 1 Totalt 23
Tellesortering med nøkkel! Counting-Sort(,, k) la C[0.. k] være et nytt array for i = 0 til k C[ i ] = 0 For j = 1 til.length C[ Key([ j ]) ] = C[ Key([ j ]) ] + 1 // C[i] inneholder nå antall elementer lik i for i = 1 til k C[ i ] = C[ i ] + C[ i-1 ] // C[i] inneholder nå antall elementer mindre eller lik i for j =.length ned til 1 [ C[ Key([ j ]) ] ] = [ j ] C[ Key([ j ]) ] = C[ Key([ j ]) ] 1 24
La oss sortere på siffer nr. 2 bakfra! 1234 4321 3213 9999 4332 7401 5441 25
26 Eksamensoppgave (H15)
genda Tellesortering Radix sort øttesortering Streng sortering 27
Radix sort Radix-Sort(, d) for i = 1 til d stabil sorter på d-te minst signifikante siffer Kjøretid med bruk av tellesortering d: ntallet siffer, k: antallet verdier et siffer kan ta n: ntallet tall/elementer i 28
La oss sortere! 1234 4 33 9999 433 7401 544 10 29
genda Tellesortering Radix sort øttesortering Streng sortering 30
øttesortering sortere på [0, 1) ucket-sort() La [ 0.. n 1] være et nytt array n =.length for i = 0 til n 1 gjør [ i ] til en tom liste for i = 1 til n legg [ i ] inn i liste [ floor( n [ i ] ) ] for i = 0 til n 1 sorter liste [ i ] med insertion sort konkatiner listene [ 0 ], [ 1 ],., [ n-1 ] i rekkefølge est case verage case Worst case 31
32 Eksamensoppgave (H16)
genda Tellesortering Radix sort ucket sort Streng sortering 33
Streng sortering Vi kan enten begynne forfra eller bakfra Som mennesker begynner vi intuitivt forfra Den «enkleste» radix sort varianten begynner bakfra 34
La oss sortere J D E K U N U S T L G D M I L S T K Y M S K I E R G N 35
Først dele i båser på lengde M J D E K U L G D S K I N U S T M I L E R G S T N K Y 36
Så begynne bakfra! M K U L G D S K I S T N J D E N U S T M I L E R G For korte strenger K Y 37
Sorter bakerste! M S K I L G D K U N T S J D E N U S T M I L E R G For korte strenger K Y 38
Gå til neste bokstav! M S K I N L G D T J K U N U S S Inkluder fortløpende strengene som blir lange nok D E T M I L For korte strenger E R G K Y 39
Gå til neste bokstav! Sorter Stabilt! M J L G D S K I N U S K U T N S D E T M I L E R G For korte strenger K Y 40
Gå til neste bokstav! L G D T M J S K I N U S N Legg merke til at vi nå har alfabetisk sortert på strengene i de to bakerste kolonene K U S D T E M I L E R G K Y For kort streng 41
Gå til neste bokstav! Sorter stabilt! D T L G D T E R G M S K I K U N S MSKIN kommer før KUS pga. stabil sortering. E M I L J N U S K Y For kort streng 42
Gå til neste bokstav! D M E J T L G D E R G S K I K U M I L N U S T N S K Y 43
Gå til neste bokstav! Sorter stabilt! K U S K Y E J M D L G D M I L N U S E R G S K I T T N 44
Gå til neste bokstav! K U S K Y E J M D L G D M I L N U S E R G S K I T T N 45
Gå til neste bokstav! Sorter stabilt! J M D E N U S S K I T K U E R G L G D M I L N S T K Y 46
Gå til neste bokstav! J M D E N U S S K I T K U E R G L G D M I L N S T K Y 47
Gå til neste bokstav! Sorter stabilt! D E J K U L G D E R G T M I L N U S S T K Y M S K I N 48
lfabetisk sortert! D E J K U L G D E R G T M I L N U S S T K Y M S K I N 49