Live life and be merry

Like dokumenter
Live life and be merry

Live life and be merry

Choices, choices. Tiende forelesning. Dynamisk programmering: En serie med valg der valgmulighetene er avhengige av hva vi har valgt før.

A new study has found that cockroaches are morons in the morning and geniuses in the evening in terms of their learning capacity.

Choices, choices. Tiende forelesning. Dynamisk programmering: En serie med valg der valgmulighetene er avhengige av hva vi har valgt før.

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Pensum: 3. utg av Cormen et al. Øvingstime: I morgen, 14:15

August

for bare trær Andre forelesning

Go with the. Niende forelesning. Mye matematikk i boka her ikke så komplisert, men mye å holde styr på.

Rundt og rundt og. Trettende forelesning

Alle mot alle. Åttende forelesning. (eller eller Bellman-Ford, eller BFS, alt ettersom) fra alle noder.

deeegimnoorrrsstt Sjette forelesning

ALGORITMER OG DATASTRUKTURER

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Algdat Eksamensforelesning. Nils Barlaug

INF Algoritmer og datastrukturer

ALGORITMER OG DATASTRUKTURER

ALGORITMER OG DATASTRUKTURER

INF Algoritmer og datastrukturer

Algdat-ninja på 60 minutter: Et galskapsprosjekt. Magnus Lie Hetland

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

Algdat - øvingsforelesning

ALGORITMER OG DATASTRUKTURER

O(V 2 ) bwfs(v, i=1) λ[v] = i for each neighbor u of v if 0 < λ[u] < i. bwfs(u, i+1) if λ[u] = 0

All good things. Fjortende forelesning

Longest increasing. subsequence Betingelser. Longest. common subsequence. Knapsack Grådig vs. DP Moro: 2D-Nim Spørsmål. Forside. Repetisjon.

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Kontinuasjonseksamen i fag SIF8010 Algoritmer og Datastrukturer Torsdag 9. August 2001, kl

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

Dagens stoff er hentet fra kapittel 9 i læreboka, samt kapittel 20.5 (som vi «hoppet over» sist)

Innhold. Innledning 1

Notater til INF2220 Eksamen

Dynamisk programmering Undervises av Stein Krogdahl

INF2220: Time 12 - Sortering

Dynamisk programmering

Eksamen i tdt4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Dynamisk programmering

Pensum: fra boken (H-03)+ forelesninger

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 18. Desember 2000, kl

Pensum: fra boken (H-03)+ forelesninger

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Longest. increasing. subsequence. Betingelser. Matrise- common. Grådig vs. DP. Forside. Intro. Fibonacci-tall. Memoisering DP

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Ekstra ark kan legges ved om nødvendig, men det er meningen at svarene skal få plass i rutene på oppgavearkene. Lange svar teller ikke positivt.

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

n/b log b n = (lg n) a log b n = n log b a

Agenda. 1 Sortering, heap og select. 2 Binære trær. 3 Grafer, BFS og DFS. 4 Spenntrær og Korteste vei. 5 Maks flyt. 6 Dynamisk programmering

Evt. forklar på tavla. Diskuter kjøretid (best-/ worst-case). Innsetting og søk. Rekursjon igjen. A C E G

Eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Algdat Oppsummering, eksamen-ting. Jim Frode Hoff

Løsningsforslag til eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

MAT1030 Forelesning 25

LØSNINGSFORSLAG, EKSAMEN I ALGORITMER OG DATASTRUKTURER (IT1105)

MAT1030 Diskret Matematikk

IN Algoritmer og datastrukturer

Forelesningsplan. Grådighet. LF Øving 9. Hva er grådighet? Aktivitetsvelger En grådig strategi Grådig eller dynamisk? Knapsack Huffmankoding

INF1020 Algoritmer og datastrukturer GRAFER

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Lineær sortering. Radix sort

deeegimnoorrrsstt Sjette forelesning

INF2220: Time 4 - Heap, Huffmann

INF Algoritmer og datastrukturer

Løsningsforslag for utvalgte oppgaver fra kapittel 9

Løsnings forslag i java In115, Våren 1996

45011 Algoritmer og datastrukturer Løsningsforslag eksamen 13. januar 1992

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Teoriøving 7 + litt om Ford-Fulkerson. Magnus Lie Hetland

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

Algoritmer og Datastrukturer IAI 21899

Eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 18. Desember 2000, kl

MAT1030 Diskret Matematikk

Øvingsforelesning Korteste vei: Alle til alle

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

All good things. Fjortende forelesning

Definisjon av binært søketre

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

Grunnleggende Grafteori

INF Algoritmer og datastrukturer

Løsnings forslag i java In115, Våren 1998

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Studentnummer: Side 1 av 1. Løsningsforslag, Eksamen i TDT4120 Algoritmer og datastrukturer August 2005

Fra A til B. Syvende forelesning

INF2220: Forelesning 2

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

O, what a tangled. Fjerde forelesning. Robot-eksemplet som ikke ble gjennomgått sist blir frivillig selvstudium (ut fra foilene :-)

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Transkript:

Om grådighet og først litt mer DP. Live life and be merry Ellevte forelesning for tomorrow you may catch some disgusting skin disease. [Edmund Blackadder]

D&C Bellman-Ford BFS/DFS Binære søketrær LP Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Gr. Heapsort Huffmankoding Insertion sort NPC Flyt+ Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Θ etc. Selection sort Sterke komponenter Topologisk sortering DP 2

Ek s l e p em Optimale søketrær 3

Optimaliseringskriteriet blir den vektede (med vekt p_i) summen av dybdene (+) til nøklene k_i. K = [k,, kn], k < k2 < < kn Vil bygge et binært søketre over K Sannsynlighet p i for søk etter ki Vil minimere forventet søkekostnad Antar at alle søk lykkes. 4

; E Forventet søketid: 2.5. ; 9 ; G ; F ; H 6 0,7#8 < (; 6 ) 0,7#8 < (; 6 ). 6 9 9 EH E I I F E 9 G 9 E H E J 99H 5

;! ; " ; # Forventet søketid: 2.0. (Optimalt.) ; $ Merk: Ikke sikkert vi vil ha minimal høyde. Heller ikke sikkert den høyeste sannsynligheten ender i rota. ; % 8 &'()* < (; 8 ) &'()* < (; 8 ) 2 8 " " +!#!,, % % +"# $! +$ # " +% "+", 6 Brute force: Bygg alle mulige binære søketrær (BST), og sett inn nøklene. Beregn forventet søkekostnad. Velg beste. Men det er Ω(4 n /n 3/2 ) BST-er med n noder.

Hvis T inneholder nøklene ki kj så må T være optimalt for disse nøklene vises lett ved selvmotsigelse.!!" 7

! " Hvis vi antar at rota inneholder kr (som en hypotese) så vil alle k<kr være til venstre (og tilsv. for høyre). Begge deltrær må (som nevnt i forrige foil) være optimale for de gitte nøklene. Hvis vi undersøker alle k = ki kj som mulige røtter, og har (og løser problemet rekursivt) så er vi garantert å finne den optimale løsningen for ki kj!! #! "!"! "#"! $ 8

%&'()*& +,(&-.,* /02(&*!"3 45678' 9*,:*7786:!"# w(8, ; ) = w(8, * $) + 2* + w(* + $, ; )% Hvis j = i er treet tomt. &'()(*+)(, &-8, ;. = &-8, * $. + &-* + $, ;. + w(8, ; )% e[i, j] er forventet kostnad for optimalt BST over ki kj. &'/0 ("2#/+3 200"4(0 #'2# 5( 26)(278 93+5 5'/:' 9(8 /0 <* % ;( 7+3<#% &)8 266 :237/72#(0, 237 =/:9 #'( >(0# +3(?! @ } + w(i, j) /* ; = 8 $, &-8, ;. = 4/3 {&-8, * $. + &-* + $, ;. + w(8, ; )} /* 8 ;. 8 * ; A+"67 5)/#( 2 )(:")0/B( 26C+)/#'4% % %!"#$%&'() *( "$&'#*+,"+%&'"( D0 E"0"26,F 5(<66 0#+)( #'( B26"(0 /3 2 #2>6(? Vi legger til w(i, j) (dvs. alle p-ene legges til én gang) fordi høyden til alle noder i deltrærne øker med én. w(i, j) er summen av pi pj &- "$.. #$ 6 + $%, @.. 6%. " #$ :23 0#+)( :23 0#+)( &-6 + $, 6. &-$, @. 9

[trekk pusten dypt] 0

!"#$%&'()*#(!, ", #)!"# $ + $" # + + %" %,$, $ +-. w,$, $ +-.!"# & + $" # %"!"# $ + $" # & + + %" ' $ + & + %,$, '- w,$, '- w,$, ' +- +! '!"# ( $ $" ' Kubisk kjøretid. /02/3 % 435 (**) l (liten L) i hovedløkken er størrelsen på deltrærne vi beregner. i er start og j er slutt for nøklene i det aktuelle deltreet. %" ) %,$, ( +- + %,( + +, '- + w,$, '- &! ) < %,$, '- $'() %,$, '- ) (**),$, '- (

!"#$%&'!%(")%*+,-(.$%(!""#)!!""#/0, $ 23456 7%8! 749 6:; 3<<68!"#$%&'!%(")%($'.%&==(0,! 0,!, 7>;?68,!""#)!"#$%&'!%(")%($'.%&==(! + 0, $,!, 734@:68,!""#)!"#$%&'!%(")%($'.%&==(&, ',!, (&!,!""#)!" & ' #$%& #!""#/&, ' 23456 7%8 # 7498 (&! 7A:4>B <? %8!!"#$%&'!%(")%($'.%&==(&, # 0, #, 7>;?68,!""#)!"#$%&'!%(")%($'.%&==(# + 0, ', #, 734@:68,!""#) 2

Eksempel Longest Common Subsequence. Finner en felles subsekvens hos to sekvenser. Lengden kan brukes som et likhetsmål. Denne type algoritmer er vanlig i bioinformatikk og informasjonsg jenfinning. LCS 3

Noen eksempler. En Brute Forceløsning vil ha en kjøretid på (n2^m) ser du hvorfor? s p r i n g t i m e h o r s e b a c k p i o n e e r s n o w f l a k e m a e l s t r o m h e r o i c a l l y b e c a l m Merk: John Stewarteksemplet ser bare på snittet av bokstavmengdene et mye enklere problem (som lett kan løses i lineær tid vha. f.eks. hashing). 4 s c h o l a r l y

X i = [x,, xi], Yi = [y,, yi] X = X m, Y = Yn Z = [z,, zk] er en LCS av X og Y 5

Hvis de ikke deler siste element kan LCS-en utvides en selvmotsigelse. Hvis x m = yn: z k = xm = yn og Z k er en LCS av Xm og Yn Det samme gjelder her hvis Xm- og Yn- har en lenger felles subsekvens så kan vi finne en lenger total felles subsekvens enn Z igjen en selvmotsigelse. 6

Hvis xm yn og zk xm: I begge tilfeller må Z være en felles subsekvens. Hvis det eksisterte en som var lenger vil den også være lenger totalt en selvmotsigelse. Z er en LCS av X m og Y Hvis xm yn og zk yn: Z er en LCS av X og Y n 7

!" #$%%&'()* '+," -'.&+ 0.&(&+(&2 34 56# + '7+ 8&9:&4*&8 *+4'3)48 38 3 ;(&!< 34 56# + ;(&!<&8 8&9:&4*&8" c[i,j] er lengden på en LCS av Xi og Yj.!"#$%&'(" )*%+$,-.'*/ =&!4& #>6, ;? = @&4A'. + 56# + <6 34B = ; " C& 734' #>5, 4?" ) 6 = D +( ; = D, D ) 6, ; > D 34B >6 = 3 ;, #>6, ;? = #>6 E, ; E? + E %3<(#>6 E, ;?, #>6, ; E?) ) 6, ; > D 34B >6 " = 3 ;. FA3)42 7& *+:@B 7()'& 3 (&*:(8)G& 3@A+()'.% H38&B +4 '.)8 +(%:@3')+4" 0($ 7)'. H+I+2 H3'" J2!!2! 8 Enten er xi og yj like eller ikke. Hvis de er det skal xi=yj=zk være med. Ellers vil Z være en LCS enten av Xi- og Y eller av X og Yj-. Vi vet ikke hvilken, men prøver begge og velger den største.!2!

Rekursjon? Enten vi gjør det rekursivt eller iterativt: Legg svarene i en tabell. J2!!2!!2!,2!!2,!2, J2E E2!,2,,2,!2E,2,!2E!2E J2D D2! E2, E2,,2E E2,,2E,2E!2D 9

!"#$!%&'()(!, ", #, $)!"# % * $" # %" &+%,,-,!"# ', $" $ %" &+,, '-,!"# % * $" # %"!"# ' * $" $ %" &! ( % = ) ' $'() &+%, '- &+% *, ' *- + * *+%, '-. / (*+( &! &+% *, '- &+%, ' *- $'() &+%, '- &+% *, '- *+%, '-. / (*+( &+%, '- &+%, ' *- *+%, '-. / #($,#) & 02 * I b-tabellen lagrer vi en referanse til hvor vi «kom fra». 20

K L L M M * K L L M M * L L L M M * L M M M M * L M M M M * M M M M M * * * * * * * * * * * * * * * * * * * * * * * * * * + &!, & -. * & /! # - # (. 0 - &! -. 2

X nedover til venstre, Y bortover på toppen. Nedoverpil: Dropp en bokstav fra X vekt 0. Bortoverpil: Dropp en bokstav fra Y vekt 0. Skråpil: Ta med bokstav fra X/Y: Vekt. Finn lengste vei fra øverst t.v. til nederst t.h. Dette er rett og slett DAG Shortest Path (eller Longest Path, da som jo blir like lett for DAG-er). 22

!"#$%&'()(!, ", #, $)!" # = * +, $ = * #$%& '%#('&!"!-#, $. = / 0 #$%&!"#$%&'()(!, ", #, $ ) 2,345 % # %)*%!"!-#, $. = / 0 #$%&!"#$%&'()(!, ", #, $) %)*%!"#$%&'()(!, ", #, $ ) 23

Egenskaper bak DP Optimal substruktur: En optimal løsning bygger på optimale løsninger på delproblemer Overlappende delproblemer: Fordi flere problemer deler delproblemer lønner det seg å lagre dem 24 Korteste vei? Har begge deler. Lengste vei (uten sykler)? Har ikke optimal substruktur Hvis vi ikke har overlappende delproblemer *kan* vi bruke DP, men det er egentlig ingen vits det blir bare splitt-og-hersk med unødvendig lagring av delproblemer.

! 25

2 C 2 D ) @ < 2 Korteste vei oppdeling i delproblemer som må optimaliseres. Korteste veier består av korteste del-veier. 26

A * Lengste vei. Betrakt q-r-t, en maksimal sti fra q til t. Består den av lengste vei fra q til r og fra r til t? *Nei*! Vi kan ikke bruke DP (og har ingen annen god løsning heller). - ( 27

Og så var det denne, da 5 4 7 0 9 2 28

for i = n for j = i if A[i] > A[j] L[i] max(l[i], L[j]+) A L 5 4 7 0 9 2 2 3 3 4 4 For hvert element, let bakover etter lovlige forgjengere. (Å lete bakover er nyttig hvis vi vil begrense spranglengden.) Delproblemene er lengste subsekvens som slutter på en gitt posisjon, og det er disse vi bruker når vi leter bakover. (Vi kan også lagre hva vi valgte dvs. hva som er forgjengeren, altså pilene i figuren.) 29

Kan du finne en subkvadratisk løsning? Hint: Binærsøk 30

Kort om Matrisekjedemultiplikasjon 3

Vi vil løse ABC (AB)C kan ha en annen kostnad enn A(BC) Hvordan finner vi optimal parentes-setting? For hver splitt må hver halvdel løses optimalt Parametrisering: Start- og slutt-indeks 32

For hver start-indeks og hver slutt-indeks, prøv alle splitt-indekser og velg den som gir lavest kostnad. Vi bevarer beregningene for alle delproblemer, som før. Dette forklares ganske omstendelig i boka, men både problemet og løsningen er egentlig svært enkle. 33

D&C Bellman-Ford BFS/DFS Binære søketrær LP Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Gr. Heapsort Huffmankoding Insertion sort NPC Flyt+ Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Θ etc. Selection sort Sterke komponenter Topologisk sortering DP 34

D&C Bellman-Ford BFS/DFS Binære søketrær LP Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Gr. Heapsort Huffmankoding Insertion sort NPC Flyt+ Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Θ etc. Selection sort Sterke komponenter Topologisk sortering DP 35

Bellman-Ford BFS/DFS Binære søketrær Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Heapsort Huffmankoding Insertion sort Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Selection sort Sterke komponenter Topologisk sortering 36

Bellman-Ford BFS/DFS Binære søketrær Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Heapsort Huffmankoding Insertion sort Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Selection sort Sterke komponenter Topologisk sortering 37

38

g i t k i s K ort Grådighet All form for optimalisering kan jo ses som «grådig», men med grådighet mener vi hær en nærsynt, kortsiktig, «hedonistisk» form for grådighet. Vi velger det som virker bra her og nå, uten å tenke på fremtiden. Noen kjente algoritmer som er grådige? (Spenntrær, Dijkstras algoritme og løsningen på fractional knapsack, f.eks.) Det er en veldig enkel strategi, så det som er interessant er: Når kan dette *også* være optimalt globalt/på lang sikt? 39

Minner om dynamisk programmering Brukes til optimalisering Når vi kan velge, velg det som er best lokalt Vis at løsningen også blir globalt optimal 40

I DAG-SP må vi prøve alle mulige veier tilbake fra slutt-noden til start-noden for å finne den beste. Dette vil fort ta eksponensiell tid. Heldigvis består hver optimale løsning av optimale del-løsninger og disse overlapper. Ved å gjenbruke dem (mellomlagring) får vi polynomisk (lineær) kjøretid. 3 4 2 2 3 3 Men hva om vi vet noe mer enn at vi har en DAG? Hva om vi kunne «nøste oss bakover» og velge riktig hele veien? For eksempel ved å velge den korteste kanten i hvert trinn 2 4

Her ble det jammen riktig! Dette er et eksempel på en grådig strategi og et tilfelle der den fungerte. Den fungerer naturligvis ikke for DAG-SP generelt men det viser at grådighet er beslektet med DP på et eller annet vis. 3 4 2 2 3 3 2 42

splitt-og-hersk dyn. prog. Del i uavhengige delproblemer og løs alle. Del i (potensielt overlappende) delproblemer og løs alle. grådighet Velg «nærsynt» hvilke delproblemer vi bryr oss om. Også her må vi ha optimal substruktur! 43 Dette er ingen «hardand-fast» taksonomi. Hva med binærsøk, f.eks.? Eller Dijkstras algoritme?

Grei metafor: Fyller ut puslespill rad for rad, med brikker av ulik pris. En grådig algoritme vil starte med den dyreste brikken, og alltid kaste dem som ikke passer. Spenntrær godt eksempel. $20 $0 $5 44

Eksempel Aktivitetsplukking 45

Vi har et sett med intervaller f.eks. tidsintervaller for aktiviteter som trenger en ekslusiv ressurs (f.eks. møter/ møterom).! &! %! #! (! *! "! $! '! )! " # $ % & ' ( ) * "! "" "# "$ "% "& "' Vi vil velge et størst mulig subsett der ingen overlapper. 46

Optimal substruktur Aktiviteter i Sij er kompatible med alle hendelser som er avsluttet innen fi og alle som starter etter sj. Vi legger på a_0 = [-inf, 0) og a_n+ = [inf, inf+ ) Vi har da: S = S_0,n+ Anta aktiviteter sortert etter slutt-tid. Hvis i j så S_ij = {} < := = { > < <. : - > <. > - = } = = =I=I=. : - >. > - = : > = =I=I= Trenger bare bry oss om S_ij der 0 i < j n+. Hvis S_ij inneholder a_k har vi to delproblemer: S_ik og S_kj 47 La A_ij være optimal løsning for S_ij. Vi har da: A_ij = A_ik + {a_k} + A_kj hvis vi antar at S_ij ikke er tom og at vi kjenner a_k.

Med andre ord: For et mulig subsett kan vi «splitte» på ulike objekter. Rekursiv definisjon av optimal løsning: Dette *kunne* vi ha løst med dynamisk programmering, *men* vi kan *forenkle* $% $" # =, #!!", # " = &'( {!!", %" +!!%, # " + )} $% $" # # =. "<%< # &% $" # Vi må altså velge en k og vi må «kvitte» oss med ett delproblem. Finnes det et gyldig «nærsynt» valg? 48

Det at den første «halvdelen» forsvinner er ganske opplagt; ellers måtte et element der ha startet *før* elementet (for å være til venstre) og sluttet *etter* (for ikke å bli valgt) og vi ville da ha overlapp. Elementet som slutter først kan tas med «Halvdelen» før dette forsvinner Vi sitter altså igjen med ett delproblem men hvordan kan vi være sikker på at det elementet som slutter først er trygt å ta med? 49

La de grå være et optimalt ut valg. Det vil alltid være trygt å bytte den første av dem med det objektet som slutter først, siden det ikke kan «overlappe lenger» enn det grå objektet som slutter først. 50

5

;DE2!E@7F7@G2HDIDE@J;(), *, 8, =) 9 8 + =!"#$% 9 = &- ) 9 < * 8 K)-!,"( &'()*)(. ) > 8,=+= 5 &' 9 9 + = #( 9 = )"%* +%),+* {- 9 } ;DE2!E@7F7@G2HDIDE@J;(), *, 9, =) %$-% +%),+* 23).)"+ '"++ ;DE2!E@7F7@G2HDIDE@J;(), *, L, =)5 While-løkken leter etter det første lovlige elementet. Altså det elementet som starter etter f og som har tidligst slutt-tid. (Antar sortering etter slutt-tid her.) Denne er jo rekursiv, da Vi kan godt gjøre den iterativ. 52

O;DDUG2!E@7F7@G2HDIDE@J;(), *, =) 5 {- = } 8 = ('+ 9 M )' = &' #( ) 9 * 8 )"%* 5 5 {- 9 } 8 9-8 )" $/"(,%'%( &--)()/ (/ 5 +%),+* 5 Vi har altså bevist at det er trygt å alltid velge det første (etter slutt-tid) lovlige elementet og det er jo det vi gjør her. 53

Eksempel! &! %! #! (! *! "! $! '! )! " # $ % & ' ( ) * "! "" "# "$ "% "& "' 54

Grådige strategier 55

. Finn optimal substruktur Vi lager gjerne substrukturen med tanke nettopp på å kunne velge grådig og på å eliminere delproblemer. 2. Lag en rekursiv løsning 3. Vis at grådig valg er trygt 4. Vis vi sitter igjen med bare ett delproblem 5. Lag rekursiv grådig løsning 6. Konverter den til en iterativ løsning 56

Strømlinjeformet Såkalte «set systems» er en veldig generell problemstruktur for denne typen ting (se kapitlet om matroider i boka; ikke pensum).. Formuler som problem der vi kan velge grådig og sitte igjen med ett delproblem 2. Vis at det alltid er trygt å velge grådig 3. Vis at grådig valg + optimal del-løsning gir optimal løsning De siste to punktene gjelder for generelle strukturer som matroider og greedoider. En helt eksakt karakterisering av slike strukturer er gitt ved såkalte matroid embeddings. (Ikke pensum! :-)) 57

Vi har altså to hovedingredienser: Greedy-choice-egenskapen Optimal substruktur (Det finnes andre måter å bevise korrekthet for grådighet på, altså ) Det står om matroider i boka. Dere kan jo evt. også google greedoids eller hvis dere er eventyrlystne, matroid embeddings. 58

Eksempel Huffmankoder 59

e = a = q = Morsekode. Vi er ute etter noe litt lignende. En effektiv, variabel kode. z = 60

Prefikskoder (eller prefiksfrie koder): Koder der ingen koder er prefiks av andre koder. Mao. er det aldri tvil om dekodingen. Ulike tegn får koder med ulik lengde Vi kan bruke prefiks-koder Total tekst-lengde skal minimeres Vi har kun informasjon om tegnfrekvenser 6

Kodene blir prefiksfrie fordi vi ikke har tegn i de interne nodene. Venstre = 0, høyre =. a = 0 0 c b = 0 a b c = Vi ønsker å minimere tegnfrekvens * tegndybde (implisitt også tekstlengde). Minner om de optimale søketrærne våre, men vi har ikke noe krav om rekkefølge. 62

Huffmans algoritme: Lag et tre for hvert tegn med frekvens-vekt Gjenta: Slå sammen de to letteste trærne 63

Prøv å tegne opp hvordan dette treet bygges helst trinn for trinn A : 8 B : 3 C : D : E : F : G : H : 64

A : 8 B : 3 C : D : E : F : 2 G : H : 65

A : 8 B : 3 C : D : 2 2 E : F : G : H : 66

A : 8 B : 3 2 2 2 C : D : E : F : G : H : 67

A : 8 B : 3 2 4 C : D : 2 2 E : F : G : H : 68

A : 8 5 4 B : 3 2 2 2 C : D : E : F : G : H : 69

A : 8 9 5 4 B : 3 2 2 2 C : D : E : F : G : H : 70

Merk: Dette minimerer forventet sti-lengde hvis vi «søker» etter en bokstav. Med andre ord er dette en mer effektiv variant av de optimale søketrærne fra forrige gang bortsett fra at søketre-egenskapen ikke er oppfylt. A : 8 7 Hvis man kan konstruere «ja/nei»- spørsmålene selv (som f.eks. ved en prosedyre for medisinsk diagnose), i stedet for å bruke søkenøkler, så kan Huffmans algoritme også brukes til denslags. 5 4 B : 3 2 2 2 9 Dette er jo klart en grådig fremgangsmåte men hvorfor blir det optimalt? C : D : E : F : G : H : 7

Bevis-skisse: Hvis treet ikke er fullt kan vi kollapse stier der noder bare har ett (internt) barn. Bortkastet å ikke ha et fullt tre Det er OK for de to billigste å være søsken, nederst i treet Hvis de to billigste behandles som ett symbol må det resterende treet være optimalt Hvis vi bytter ut ett av dem med et dyrere vil det dyrere ikke komme lenger opp og det billige vil ikke komme lenger ned så det vil ikke bli billigere totalt. 72

Min. forv. koding Kombiner minste O(n lg n) Huffmans algoritme 73

74

Bellman-Ford BFS/DFS Binære søketrær Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Heapsort Huffmankoding Insertion sort Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Selection sort Sterke komponenter Topologisk sortering 75

Bellman-Ford BFS/DFS Binære søketrær Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Heapsort Huffmankoding Insertion sort Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Selection sort Sterke komponenter Topologisk sortering 76

D&C Bellman-Ford BFS/DFS Binære søketrær LP Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp Floyd- Warshall Hashing Gr. Heapsort Huffmankoding Insertion sort NPC Flyt+ Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Θ etc. Selection sort Sterke komponenter Topologisk sortering DP 77

D&C Bellman-Ford BFS/DFS Binære søketrær LP Binærsøk Bubblesort Bucket sort Counting sort Dijkstra DAGshortest-path Edmonds- Karp (Par.) Floyd- Warshall Hashing Gr. Heapsort Huffmankoding Insertion sort NPC Flyt+ Kruskal Merge sort Prim Quicksort Radix sort Randomized Select Select Θ etc. Selection sort Sterke komponenter Topologisk sortering DP 78