page=482 En metode å designe Algoritme - Algorithms på som gjør de mye mer effektive, som vi kan benytte dersom vi har visse egenskaper ved problemet vårt:
Optimal Delstruktur
En optimal løsning på problemer består av å lage optimal løsninger av mindre delproblemer
Link to originalOverlappende Delinstanser
Støter på samme delproblemene gjentatte ganger, og at disse blir beregnet unødvendig mange ganger ved en Naiv Algoritme.
Link to original
Problemer
Cut-Rod
Problemstilling
Cut-Rod handler om at du har en stokk med lengde cm og en tabell med priser , hvor angir prisen til en stokk med lengde cm. Vi ønsker å kappe opp denne stokken slik at total pris maksimeres (vi kan kun kappe på hvert heltall antall cm). Det er totalt forskjellige måter å kutte opp en stokk på cm, da vi har indre punkter å kutte på (), og på hver av punktene er valget binært; kutt eller ikke kutt.
Eksempel: Vi er gitt tabellen under og . Da har vi mulige oppkuttinger. Vi må finne ut hvilken av disse 8 mulighetene som gir maksimal pris. Den naive løsningen (Naiv Algoritme) er å sjekke alle 8 kombinasjoner og sammenligne disse, men da må vi i så fall sjekke eksponentielt mange kombinasjoner - ikke bra! En naiv løsning er presentert i algoritmen Cut-Rod.
Naiv løsning
Gitt en liste som sier noe om hvor mye ulike lengder er verdt
Da har vi 5 måter å gjøre det første kuttet på
Etter vi har gjort det første kuttet får vi en resterende del, men vi antar at den allerede er kuttet opp på en optimal måte.
Da blir vi møtt med følgende alternativer for hva det meste vi kan tjene på stangen:
Vi må derimot faktisk løse delproblemene selv
Memoisering (top down) løsning
Den naive løsningen regner samme verdier flere ganger. I denne løsningen sjekker vi i hvert rekursjonskall om delinstansen har blitt regnet ut fra før av før man foretar beregningen.
Kjøretid:
Iterasjon (bottom up) løsning
Vi starter med minste delinstans, lagrer svaret og itererer videre over delinstansene
Kjøretid:
Fordeler/Ulemper bottom up/top down
Algoritme | Fordeler | Ulemper |
---|---|---|
Bottom up | Bedre konstanter i kjøretid | Avhenger av vi kjenner størrelsen på delproblemene |
Top down | Vi beregner en instans kun EN GANG | Vi bruker rekursjon → Mer overhead |
LCS - longest Common Subsequence
Problem
Gitt en sekvens , kan vi finne en Delsekvens (Subsequence).
LCS handler om å finne største delsekvens mellom to arrays
A &= [b,c,a,e,f] \\ B &= [a,b,c,f,e] \end{align}Da blir og delsekvenser av og , og er den lengste.
Alternativt
Og ser typisk slik ut på eksamen:
Kjøretid: