Anbefalte forkunnskaper Studentene forutsettes å kunne programmere, for eksempel ved å ha tatt TDT4100 Objektorientert programmering. Studentene forutsettes også å ha kunnskaper om funksjoner, logaritmer, grensebetraktninger, mengder, relasjoner, induksjonsbevis, rekker og elementær sannsynlighetsregning.
Hei, jeg er @mlhetland
Evt. gå inn på it s:learning for å finne link til nettsider og foiler. http://www.idi.ntnu.no/~algdat algdat@idi.ntnu.no http://www.idi.ntnu.no/~mlh/algdat/footstool Nettsidene fortsatt under oppdatering Øvingsopplegg presenteres neste tirsdag
Senere i semesteret: Korteste vei i vilkårlige kart/nett verk. Nå forenkler vi veldig. Kun hexmaps (som i mange spill, f.eks.) og vi ser kun på *to* rader. Korteste vei blir da litt for enkelt, så vi teller *antallet mulige* veier/ stier i stedet.
Hvor mange stier fra venstre til høyre? (Start øverst til venstre.) 1 2 5 13 1 3 8 21
Disse tallene er Fibonaccitall! F1 F3 F5 F7 F2 F4 F6 F8
F0 F1 F3 F5 F7 F2 F4 F6 F8 f n = ( n if n<2; f n 1 + f n 2 otherwise.
f n = ( n if n<2; f n 1 + f n 2 otherwise.
Påstand: Etter hvert som datamaskiner blir mer effektive, og raskt kan behandle større datamengder, så blir algoritmekonstruksjon mindre viktig. Vi har effektiv hardware Mulig motargument: Vi vil utnytte hardwaren bedre. Dobbelt så effektiv: 8 ganger så varm. Men det er ikke hovedargumentet hva skal vi med effektive algoritmer?
Eksperimentserver for AK-gruppa Fra i fjor Intel i7 920 @ 2.67GHz (quadcore) 12GB RAM (8192KB cache) Kode skrevet i C
Dette eksperimentet gjorde vi live i første forelesning i fjor. (Kan evt. gjentas om det blir mye «popular demand» ;-) vs Eksperimentserver for AK-gruppa Fra i fjor Intel i7 920 @ 2.67GHz (quadcore) 12GB RAM (8192KB cache) Kode skrevet i C Min føste hjemmemaskin Fra 1983 Zilog Z80 A @ 4MHz 32KB RAM Kode skrevet i BASIC (tolket) Om man kun ser på klokkefrekvensen bør man få en speedup på 667.5. Flere faktorer tyde på en langt større speedup.
De to ulike implementasjonene (og algoritmene) f n = ( n if n<2; f n 1 + f n 2 otherwise.
f n = ( n if n<2; f n 1 + f n 2 otherwise. int f(int n) { if (n<2) return n; return f(n-1) + f(n-2); } Opplagt, «pen» rekursiv implementasjon i C.
int f(int n) { if (n<2) return n; return f(n-1) + f(n-2); } 5 LET N = 50 10 LET P = 0 20 LET F = 1 30 FOR I = 1 TO N-1 40 LET T = F + P 50 LET P = F 60 LET F = T 70 NEXT I 75 PRINT F BASIC har ikke like god støtte for rekursjon, så vi bruker en FORløkke i stedet. Ikke like «pent» men kanskje ikke så dumt likevel? (Hint: Dette er en forsmak på dynamisk programmering.)
(Memotech-en klarer ikke høye nok heltall til å regne ut dette, så svaret vi får er et unøyaktig flyttall. Det kunne vi ha unngått hvis vi skrev vår egen kode for å håndtere store tall.) f 50 Dette er det vi prøver å finne nå. Ikke urimelig med n=50 i et ordentlig spill, f.eks. (og husk at dette er et *enklere* problem enn det man
vs ~3m ~0s Eksperimentserver for AK-gruppa Fra i fjor Intel i7 920 @ 2.67GHz (quadcore) 12GB RAM (8192KB cache) Kode skrevet i C Min føste hjemmemaskin Fra 1983 Zilog Z80 A @ 4MHz 32KB RAM Kode skrevet i BASIC (tolket) Om man kun ser på klokkefrekvensen bør man få en speedup på 667.5. Flere faktorer tyde på en langt større speedup.
Sorter ti mill 20m 5.5h Freq Alg Impl 10 7 n lg n 50 Insertion sort er det vi ender opp med i dag. Merge sort lærer dere siden. 10 10 n 2 2 Frekvens: Instruksjoner per sekund. Algoritme: F.eks. merge sort kontra insertion sort. Implementasjon: F.eks. inkompetent, høynivåsimplementasjon kontra ninjalavnivås-implementasjon.
Sorter hundre mill 4h 23d Freq Alg Impl 10 7 n lg n 50 10 10 n 2 2
Å finne kortest mulig rute innom byene i Sverige er supervanskelig, mens det å finne korteste rute fra vest til høst i Kina er superlett. Hva betyr det, helt presist og hvordan kan det ha seg? Det er en to forskjellige konsepter her: (1) Det finnes gode og dårlige algoritmer, og det er stor forskjell mellom dem; (2) det finnes problemer der vi ikke kjenner (eller kan finne) gode algoritmer. Det siste (problemkompleksitet) kommer vi tilbake til mot slutten av semesteret (NP-kompletthet o.l.).
bogo sort: test tilfeldige permutasjoner Ideer til andre hacks som ikke er like brutale? (Demo først bogo sort med tallkort.) 5 3 6 0 1 2 4 0 4 3 2 1 6 5 1 2 5 4 6 0 3 2 3 5 1 4 6 0 Det første man ofte prøver seg på (som et hack ) er en brute force -løsning. Bare prøv alle mulige løsninger, f.eks. Som et alternativ til bogo sort kan vi systematisk generere alle permutasjoner (så vi ikke risikerer å sjekke noen av dem flere ganger), s.k. permutation sort. Noen ideer til forbedringer? 6 2 3 0 1 4 5 Hva med å ta vare på biter som er riktige? Og kanskje være litt mer systematisk med å sette på plass tall som er på feil plass?
Hvorfor har vi ikke løst problemet?
Hvorfor har vi ikke løst problemet? Fordi 100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Altså 93326215443944152681699238856266 70049071596826438162146859296389 52175999932299156089414639761565 18286253697920827223758251185210 916864000000000000000000000000 permutasjoner må sjekkes
cn 2 T (n) n 0
http://boingboing.net/2008/06/19 O-notasjonen representerer en øvre grense. Det er en grunn til det
Klasse Merk: Det spiller ingen rolle hvilken logaritme vi bruker. (Hvorfor?) O( ) konstant 1 logaritmisk lg n lineær n loglineær n lg n kvadratisk n 2 kubisk n 3 polynomisk n k eksponentiell k n Det finnes også problemer som ikke kan løses polynomisk, problemer vi tror ikke kan løses polynomisk, og problemer som ikke kan løses i det hele tatt. Dette er funksjonsklasser som vi beskriver kjøretider med. Kjøretider som oppstår i krysningen algoritme+problem (dvs. type instanser). Permutation sort er altså enda verre n!
n 10 100 1 000 Hvis vi kan håndtere større problemer blir effektive algoritmer *viktigere*. n 2 100 10 000 1 000 000 2 n 1024 >10 30 >10 300 Bogo sort (og brute force) er *mye* verre enn dette, faktisk, med forventet kjøretid proporsjonal med n! ( n fakultet ).
Vi har effektiv hardware hva skal vi med effektive algoritmer?
Litt kombinatorikk
To typer turnering: Round robin (alle-motalle) og knockout-turnering (hver taper går ut umiddelbart). Her representert ved superheltene Robin (for øyeblikket ikke så rund ) og Knockout. (Not so round ) Robin Knockout
n 1
h = lgn n = 2 h
IN DUKSJON RE KURSJON
A? A? B? B? B! B! A! A! A? A!
Assume Delegate 1 n 1 n n n 1 1 Deduce Extend
Problemløsning
Tenk på noe enklere!
Tenk på noe enklere! Forenklet versjon, en bit av problemet, et trinn i en løsning, kjent algoritme som nesten passer, beslektet problem, «la oss foreløpig anta» Det er egentlig dette induksjon, reduksjon og rekursjon handler om også. Induksjon: Se kun på ett trinn om gangen bygg større løsninger fra små. Rekursjon: Beskriv en løsning ut fra enklere (del)problemer. Reduksjon: Løs ved hjelp av et annet problem som det er enklere for deg å løse.
Sortering er et klassisk eksempel.
Litt tilfeldig valgte forenklinger (De fleste forenklinger vil kunne gi oss ideer.) Kan dere komme på andre forenklinger/ spesialtilfeller? Gir det dere noen ideer? Hva om sekvensen har lengde 2? Hva om alle utenom ett element er sortert? Hva om vi bare skal få på plass det minste? Hva om alle elementene er enten 0 eller 1?
Hva om sekvensen har lengde 2? 5 3 3 5 Hmm. Bytter plass på to elementer ved siden av hverandre samtidig med at vi sammeligner dem. Kanskje nyttig grunnoperasjon?
Hva om alle utenom ett element er sortert? 0 1 3 4 5 2 6 0 1 2 3 4 5 6 Hmm. Det må flyttes forbi elementer, som må forskyves, én og én. Kanskje vi bare kan dytte det gjennom med sammenligning/ombytting av naboer?
Hva om vi bare skal få på plass det minste? 6 2 3 0 1 4 5 0 6 2 3 1 4 5 Lignende situasjon, men må må vi *finne* den minste. Det hadde vært bra om vi kunne bake det inn i sammenligninger/ ombyttinger. (Dette kan vi også ta videre for å komme frem til selection sort og bubble sort.)
Hva om alle elementene er enten 0 eller 1? 0 0 0 1 0 1 0 0 0 0 0 1 1 0 Hmm. Nullene til venstre trenger vi ikke flytte på. Hvis vi finner en ny null så må den presses gjennom evt. enere, inn i null-gruppen, med sammenlign-og-bytt - taktikken.
Vær oppmerksom på at selv om tabeller i Cormen indekseres fra 1 til n så indekseres de i Java og Python fra 0 til n-1 x > x x i j i j x x > x Insertion-Sort(A) 1 for j = 2 to A.length 2 x = A[j] 3 // Sett x inn i A[1.. j 1]: 4 i = j 1 5 while i > 0 and A[i] > x 6 A[i + 1] = A[i] 7 i = i 1 8 A[i + 1] = x Hva har kjøretiden her med vår kvadratiske Robin å gjøre? Hva er forskjellen på maks flaks og maks uflaks her?
Så
Asymptotisk effektivitet kan være kritisk Robin + Knockout = en del kombinatorikk Kjerneverktøy: Induksjon/rekursjon Mer fokus på bruk av induksjon i algoritmedesign i «Python Algorithms», som igjen er inspirert av bl.a. «Using Induction to Design Algorithms» av Udi Manber.
Pensum Se nettsidene for detaljer.
Brukt i mange år. Innfører alternativ i år.
Frivillig Python Algorithms er en kort og lettlest bok, med forklaringer i retning av forelesningene, med Python-kode for alle algoritmene. Anbefalt støttelitteratur.
http://www.idi.ntnu.no/~algdat algdat@idi.ntnu.no http://www.idi.ntnu.no/~mlh/algdat/footstool Nettsidene fortsatt under oppdatering Øvingsopplegg presenteres neste tirsdag