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 original
  • Overlappende 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

AlgoritmeFordelerUlemper
Bottom upBedre konstanter i kjøretidAvhenger av vi kjenner størrelsen på delproblemene
Top downVi beregner en instans kun EN GANGVi 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: