PG4200 Algoritmer og datastrukturer forelesning 3 Lars Sydnes 29. oktober 2014
Plan Måling av kjøretid (delvis repetisjon) Matematisk analyse av kjøretid Presentasjon av innlevering 1
I Innlevering 1
Innlevering 1 Innleveringen utgjør 25 % av vurderingsgrunnlaget i faget. Frist: 21.september klokken 23.55
Innlevering 1 Oppgave 1: Kjøretidsanalyse Analyse av kjøretid for søk i lister.
Innlevering 1 Oppgave 1: Kjøretidsanalyse Analyse av kjøretid for søk i lister. To ulike liste-implementasjoner: ArrayList LinkedList
Innlevering 1 Oppgave 1: Kjøretidsanalyse Analyse av kjøretid for søk i lister. To ulike liste-implementasjoner: ArrayList LinkedList Fire ulike søkemetoder: Sekvensielt søk basert på indeks. Sekvensielt søk med foreach-løkke Innebygd søk Binært søk.
Innlevering 1 Oppgave 1: Kjøretidsanalyse Analyse av kjøretid for søk i lister. To ulike liste-implementasjoner: ArrayList LinkedList Fire ulike søkemetoder: Sekvensielt søk basert på indeks. Sekvensielt søk med foreach-løkke Innebygd søk Binært søk. To ulike analyseprinsipper: Måling av kjøretid og grafisk fremstilling. Matematisk analyse
Innlevering 1 Oppgave 2: Søk i filsystemet. java.io.file-objekter ken representere kataloger vanlige filer
Innlevering 1 Oppgave 2: Søk i filsystemet. java.io.file-objekter ken representere kataloger vanlige filer Gitt et objektstring target og File file. Hvis file er en vanlig fil: Søk etter target i file Hvis file er en katalog: Søk etter target i alle filer i alle underkataloger.
Innlevering 1 Oppgave 2: Søk i filsystemet. java.io.file-objekter ken representere kataloger vanlige filer Gitt et objektstring target og File file. Hvis file er en vanlig fil: Søk etter target i file Hvis file er en katalog: Søk etter target i alle filer i alle underkataloger. Utvidelse: Søk etter String taget på worldwide web uten å google. Internett vs WorldWide Web. Hvordan få tak i lenkene? Hvordan unngå å besøke samme side mange ganger.
Innlevering 1 Materiale Alt materiale er samlet i innlevering1.zip.
Innlevering 1 Materiale Alt materiale er samlet i innlevering1.zip. Dette zip-arkivet inneholder: Oppgavetekst: innlevering1.pdf. Utgangspunkt for kjøretidsanalyse: innlevering1.pdf. Enkel mal for svar på spørsmål: innlevering1.doc. Enkel regnearkmal: innlevering1.xls.
Innlevering 1 Besvarelse Besvarelsen leveres på it s learning.
Innlevering 1 Besvarelse Besvarelsen leveres på it s learning. Pakk besvarelsen inn i en fil med navn innlevering1.zip
Innlevering 1 Besvarelse Besvarelsen leveres på it s learning. Pakk besvarelsen inn i en fil med navn innlevering1.zip Unngå pakker: All kode skal være kompilerbar og kjørbar fra roten i zip-arkivet.
Innlevering 1 avslutning Les gjennom oppgaveteksten og la studentene stille spørsmål.
II Kort om rekursive funksjoner
Rekursjon En metode som kaller seg selv kalles rekursiv:
Rekursjon En metode som kaller seg selv kalles rekursiv: Eksempel: Regn ut summen S n = 1 + 2 + + (n 1) + n
Rekursjon En metode som kaller seg selv kalles rekursiv: Eksempel: Regn ut summen S n = 1 + 2 + + (n 1) + n Observarsjoner: S 0 = 0, S n = S n 1 + n
Rekursjon En metode som kaller seg selv kalles rekursiv: Eksempel: Regn ut summen S n = 1 + 2 + + (n 1) + n Observarsjoner: S 0 = 0, S n = S n 1 + n Rekursiv funksjon: public static int sum(n){ if (n == 0) return 0; else return n + sum(n-1) }
Bestanddeler i rekursive funksjoner Rekursivt kall: Der hvor metoden kaller seg selv.
Bestanddeler i rekursive funksjoner Rekursivt kall: Der hvor metoden kaller seg selv. Stoppbetingelse.
Bestanddeler i rekursive funksjoner Rekursivt kall: Der hvor metoden kaller seg selv. Stoppbetingelse. public static int sum(n){ if (n == 0){ // Stoppbetingelse return 0; } else { return n + sum(n-1) // Rekursivt kall. } }
Bestanddeler i rekursive funksjoner Rekursivt kall: Der hvor metoden kaller seg selv. Stoppbetingelse. public static int sum(n){ if (n == 0){ // Stoppbetingelse return 0; } else { return n + sum(n-1) // Rekursivt kall. } } Rekursive funksjoner bør ha denne strukturen: if (stoppbetingelse){ kontrollert nedstengning } else {
Hva skjer når vi glemmer stoppbetingelsen? Se Rekursjon.java
Hva skjer når vi glemmer stoppbetingelsen? Se Rekursjon.java Stikkord: StackOverflow.
Eksempel: LinkedList.java Listen er definert på en selvrefererende måte. Rekursiv søkemetode.
III Måling av kjøretid
En enkelt måling public static double timetrial(int N){ preparetest(n); Stopwatch timer = new Stopwatch(); dotest(n); } return timer.elapsedtime(); Her er preparetest en metode som gjør forberedelser, mens dotest representerer det vi ønsker å måle tiden for.
Test med konstant økning av problemstørrelsen public static void test(){ for (int N = 100; N < 1000; N += 100){ double time = timetrial(n); StdOut.println("%7d%5.1f\n",N,time); } }
Test med konstant økning av problemstørrelsen public static void test(){ for (int N = 100; N < 1000; N += 100){ double time = timetrial(n); StdOut.println("%7d%5.1f\n",N,time); } } Doblingstest public static void test(){ for (int N = 100; N < 1000; N += N){ double time = timetrial(n); StdOut.println("%7d%5.1f\n",N,time); } }
Hva vi måler Kjøretid ved for ulike verdier av N. Hva N er varierer etter konteksten, for eksempel: antall objekter i en beholder antallet spillere i et online-spill antall flyplasser i et nettverk av flyruter
Hva vi måler Kjøretid ved for ulike verdier av N. Hva N er varierer etter konteksten, for eksempel: antall objekter i en beholder antallet spillere i et online-spill antall flyplasser i et nettverk av flyruter Vi kan også være interessert i å måle andre ting enn kjøretid: antallet addisjonsoperasjoner antallet array-oppslag bruk av minneressurser.
Karakterisering av input Kjøretiden for en søkealgoritme kan avhenge av mange faktorer: Antallet elementer det søkes blant Hvilket element det søkes etter Andre kvaliteter, som f.eks antall repetisjoner
Karakterisering av input Kjøretiden for en søkealgoritme kan avhenge av mange faktorer: Antallet elementer det søkes blant Hvilket element det søkes etter Andre kvaliteter, som f.eks antall repetisjoner Som regel fokuserer vi på én faktor. Påvirkningen fra de andre faktorene fremstår som støy.
Praktisk eksempel ThreeSum.java DoublingTest.java
IV Matematisk analysen av kjøretid
Donald Knuths Ideal Målsetning Skrive opp en formel for kjøretiden til et dataprogam: Kjøretid = f (input) Viktigste faktorer Hva er kjøretiden til hver instruksjon? Hvor mange ganger utføres hver enkelt instruksjon?
Problem I: Uforutsigbar kjøretid Kjøretiden til hver enkelt instruksjon: Varierer fra maskin til maskin Påvirkes av ytre faktorer
Problem I: Uforutsigbar kjøretid Kjøretiden til hver enkelt instruksjon: Varierer fra maskin til maskin Påvirkes av ytre faktorer Strategi Vi kan nøye oss med å telle hvor mange ganger instruksjonene utføres. Det resulterende tallet er antagelig tett knyttet til kjøretiden.
Eksempel: Enkel løkke sum = 0; for (int i = 1; i <= n; i++){ sum+=i; }
Eksempel: Enkel løkke sum = 0; for (int i = 1; i <= n; i++){ sum+=i; } Denne løkken har frekvens n. Instruksjonene inne i løkken gjentas n ganger. I koden kan vi skrive: sum = 0; for (int i = 1; i <= n; i++){ sum+=i; } // frekvens: n
Eksempel: Dobbel løkke for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ dosomething(); } } Ytre løkke: Frekvens = n.
Eksempel: Dobbel løkke for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ dosomething(); } } Ytre løkke: Frekvens = n. For hver verdi av i gjentas den indre løkken n ganger.
Eksempel: Dobbel løkke for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ dosomething(); } } Ytre løkke: Frekvens = n. For hver verdi av i gjentas den indre løkken n ganger. Indre løkke: Frekvens = n + n + cdots + n = n 2.
Eksempel: Dobbel løkke for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ dosomething(); } } Ytre løkke: Frekvens = n. For hver verdi av i gjentas den indre løkken n ganger. Indre løkke: Frekvens = n + n + cdots + n = n 2. Hvis dosomething() tar omtrent 400 millisekunder, så vil den totale kjøretiden bli omtrene 400 n 2 millisekunder. Hvis n = 10, er altså kjøretiden omtrent 40 sekunder.
Eksempel: ThreeSum.java public static int count(int[] a) { int N = a.length; int cnt = 0; for (int i = 0; i < N; i++) { for (int j = i+1; j < N; j++) { for (int k = j+1; k < N; k++) { if (a[i] + a[j] + a[k] == 0) { cnt++; } } } } return cnt; }
Konklusjon Vi konkluderer med at den indre loopen har frekvens f (N) = 1 N(N 1)(N 2) 6
Problem II: Vanskelig matematikk Vi har sett at regningen kan bli veldig vanskelig Strategi Tilde-notasjon Orden
Tilde-notasjon Vi infører følgende notasjon for positive funksjoner f (n), g(n):
Tilde-notasjon Vi infører følgende notasjon for positive funksjoner f (n), g(n): Definisjon Vi sier at dersom for store n. f (n) g(n) f (n) g(n) 1
Regneregler for tilde-notasjon Hvis f 1 (n) g 1 (n) og f 2 (n) g 2 (n), og a og b er konstanter, så er
Regneregler for tilde-notasjon Hvis f 1 (n) g 1 (n) og f 2 (n) g 2 (n), og a og b er konstanter, så er af 1 (n) + bf 2 (b) ag 1 (n) + bg 2 (n)
Regneregler for tilde-notasjon Hvis f 1 (n) g 1 (n) og f 2 (n) g 2 (n), og a og b er konstanter, så er af 1 (n) + bf 2 (b) ag 1 (n) + bg 2 (n) og f 1 (n)f 2 (n) g 1 (n)g 2 (n)
Polynomer Vi behøver kun å bry oss om det leddet som har høyest grad: an 2 + bn + c an 2
Polynomer Vi behøver kun å bry oss om det leddet som har høyest grad: an 2 + bn + c an 2 Bevis: an 2 + bn + c an 2 = 1 + b 1 a n + c 1 a n 2 De to siste leddene 0 for store n, så brøken 1.
3n 2 (4n + 5n 2 ) 15n 4 3n 2 (4n + 5n 2 ) = 12n 3 + 15n 4 15n 4 180000 160000 3*n**2*(4*n+5*n**2) 15*n**4 140000 120000 100000 80000 60000 40000 20000 0 1 2 3 4 5 6 7 8 9 10
3n 2 (4n + 5n 2 ) 15n 4 plott av y = 3n 2 (4n + 5n 2 ) og y = 15n 4 : 1.6e+09 1.4e+09 3*n**2*(4*n+5*n**2) 15*n**4 1.2e+09 1e+09 8e+08 6e+08 4e+08 2e+08 0 10 20 30 40 50 60 70 80 90 100
3n 2 (4n + 5n 2 ) 15n 4 plott av y = 3n 2 (4n + 5n 2 ) og y = 15n 4 med logaritmisk skala. 1e+14 1e+12 3*n**2*(4*n+5*n**2) 15*n**4 1e+10 1e+08 1e+06 10000 100 1 1 10 100 1000
3n 2 (4n + 5n 2 ) 15n 4 Plott av y = 3n2 (4n + 5n 2 ) 15n 4 2 (3*n**2*(4*n+5*n**2))/(15*n**4) 1 1.5 1 0.5 0 5 10 15 20 25 30 35 40 45 50
Eksempel Vi tar utgangspunkt i et kjent resultat: 1 + 2 2 + + n 2 = n(n + 1)(2n + 1) 6 Dette er et faktum som det dessverre ikke er enkelt å bevise.
Eksempel Vi tar utgangspunkt i et kjent resultat: 1 + 2 2 + + n 2 = n(n + 1)(2n + 1) 6 Dette er et faktum som det dessverre ikke er enkelt å bevise. Vil ha enklere formel på høyre side.
Utregning 1 + 2 2 + + n 2 = n(n + 1)(2n + 1) 6 = 1 6 (2n3 + 3n 2 + n) = 1 3 n3 + 1 2 n2 + 1 6 n 1 3 n3
Konklusjon 1 + 2 2 + + n 2 1 3 n3
Anvendelse på TreeSum.java Frekvensen til den indre loopen i TreeSum.java er 1 6 N(N 1)(N 2) 1 6 N3
Anvendelse på TreeSum.java Frekvensen til den indre loopen i TreeSum.java er Utifra dette skulle vi forvente for en eller annen konstant a. 1 6 N(N 1)(N 2) 1 6 N3 kjøretid an 3
Anvendelse på TreeSum.java Frekvensen til den indre loopen i TreeSum.java er Utifra dette skulle vi forvente for en eller annen konstant a. 1 6 N(N 1)(N 2) 1 6 N3 kjøretid an 3 Praktisk demonstrasjon. Se doublingtestoutput.xls
Anvendelse på TreeSum.java Frekvensen til den indre loopen i TreeSum.java er Utifra dette skulle vi forvente for en eller annen konstant a. 1 6 N(N 1)(N 2) 1 6 N3 kjøretid an 3 Praktisk demonstrasjon. Se doublingtestoutput.xls Disse målingene gir estimatet kjøretid 10 10 N 3 sekunder
Hva har vi gjort Observasjon av kjøretiden (Målinger) Matematisk analyse Hypotese: Basert på analysen Sammenligning av hypotensen med målingene. Oppstilling av et brukbart estimat.