250 likes | 397 Views
Øvingsforelesning 2003.09.18. Andreas Knudsen andreakn@idi.ntnu.no Nils Grimsmo nilsgri@idi.ntnu.no. Innhold. Presentasjon av praksisøving 5. Repetisjon: Kjøretidsanalyse Teoriøving 4 Praksisøving 4. Praksisøving 5 Aksjespekulanten.
E N D
Øvingsforelesning2003.09.18 Andreas Knudsen andreakn@idi.ntnu.no Nils Grimsmo nilsgri@idi.ntnu.no
Innhold • Presentasjon av praksisøving 5. • Repetisjon: Kjøretidsanalyse • Teoriøving 4 • Praksisøving 4
Praksisøving 5Aksjespekulanten • Problem: ”Gitt et sett med endringer i en aksjekurs, når lønner det seg å kjøpe og selge. Du har en sum penger, og kan kun kjøpe og selge en gang.” • Gitt flere løsninger som er like innbringende, velg den som har kortest tid mellom kjøp og salg
Repetisjon Kjøretidsanalyse Vi ser uformelt på kjøretidsanalyse av søk i forskjellige typer datastrukturer • Array – O(n) • Balansert binærtre – O(log2 n) • Ubalansert binærtre – O(n) • Graf – O(v + e)
RepetisjonKjøretidsanalyse – Søk i array • Har ingen informasjon om hvor i arrayet elementet vi leter etter ligger • Når vi ser på ett element får vi ikke vite mer enn om det er det vi søker etter eller ikke • Kjøretid: O(n)
34 17 68 13 31 50 75 99 2 14 19 32 35 53 71 RepetisjonSøk i balansert binærtre • Ved å se på ett element, kan vi halvere søkerommet. • Høyden på treet: floor(log2 n). Går ett hakk ned per sammenligning Kjøretid: O(log2 n) log2 n
RepetisjonSøk i ubalansert binærtre • Høyden på treet er i verste fall n • Må da gjøre Θ(n) operasjoner hvis elementet vi leter etter ligger nederst. • Kjøretiden blir da generelt sett O(n) O(n)
Jonas Håvard Marte Per Espen Guri Svein RepetisjonKøretidsanalyse - Søk i graf
RepetisjonKjøretidsanalyse - Søk i graf Kan søke i grafen dybde- eller bredde-først Gitt v noder og e kanter: • Må besøke O(v) noder, da den vi leter etter kan være den vi finner sist • Gitt ej kanter ut fra node j, må vi se på ej kanter nå vi undersøker j • e = e1 + e2 + … + ev • Vi må undersøke O(e) kanter til sammen • Kjøretid: O(v) + O(e) = O(v+e)
Praksisøving 4Spionproblemet • Variasjon over det mer kjente kjendisproblemet. • Def: ”Gitt en gruppe mennesker, finn en person som kjenner alle, men som ingen av de andre kjenner.” • Motivasjon: Øving på problemløsing. Mange andre problemer har løsninger som minner om denne.
Jonas Håvard Marte Per Espen Guri Svein SpionproblemetGrafrepresentasjon
SpionproblemetNaiv løsning for hver person: sjekk om denne kjenner alle de andre sjekk om ingen av de andre kjenner denne
SpionproblemetNaiv løsning - Pseudokode for hver person A: for alle andre personer B: hvis A ikke kjenner B: <ikke spion> for alle andre personer C: hvis C kjenner A: <ikke spion> <spion>
SpionproblemetNaiv løsning - Kjøretid • Sjekker n personer: Θ(n) • For hver person, se om hun kjenner alle de n-1 andre, samt om ingen andre kjenner henne. Θ(n) + Θ(n) = Θ(n). • Samlet kompleksitet: Θ(n) * Θ(n) = Θ(n²) • Ser fra pseudokode: To nivåer med løkker uten hopp → kjøretiden må være Θ(n²)
SpionproblemetNaiv løsning - Optimering • Slutt å undersøke personer etter at du har funnet ut at de ikke kan være spion • Det kan bare være en mulig spion, slutt å søke når du har funnet denne • Trenger bare en indre løkke
SpionproblemetNaiv løsning - Pseudokode for hver person A: for alle andre personer B: hvis A ikke kjenner B: continue(2) hvis B kjenner A: continue(2) spion = A break Kjøretiden er nå O(n2) i stedet for Θ(n²)
SpionproblemetLineær løsning • Motivasjon: • Hvis A kjenner B, betyr dette at B ikke kan være spion (Det sier ingenting om A) • Hvis A ikke kjenner B, betyr dette at A ikke kan være spion (Det sier ingenting om B) • Vi kan eliminere en mistenkt per sammenligning! • Bare en person kan være spion Reductio ad absurdum (Motsigelesesbevis)
SpionproblemetLineær løsning – Pseudokode 1 så lenge det er minst 2 kandidater igjen: velg to mistenkte A og B hvis A kjenner B: kan B ikke være spion hvis ikke: kan A ikke være spion det er nå 1 mulig spion igjen sjekk denne på gamlemåten
SpionproblemetLineær løsning – Pseudokode 2 liste = alle personer så lenge lengde(liste) > 1: A = liste[0] B = liste[1] hvis A kjenner B: slett(liste[1]) hvis ikke: slett(liste[0]) sjekk om liste[0] er spion
SpionproblemetLineær løsning – Java-kode nm er nabomatrise, k er kandidat, i er den vi sammenligner med public static int traverser(int[][] nm, int antNoder) { int k = 0; for (int i = 1; i < antNoder; i++) { if (nm[k][i] != 1) { k = i; } } for (int i = 0; i < antNoder; i++) { if ((k != i) && ((nm[k][i] != 1) || (nm[i][k] == 1))) { return -1; } } return k; }
SpionproblemetLineær løsning - Kjøretid • Kan med 1 sjekk eliminere 1 person. Θ(1) • Gitt n mistenkte, vil vi kunne eliminere n-1 personer på n-1 runder. Θ(n-1) = Θ(n) • Kan sjekke siste kandidat på n+n operasjoner (”Kjenner noen denne personen? Kjenner denne alle andre?”). Θ(n+n) = Θ(n) • Samlet kjøretid: Θ(1) * Θ(n) + Θ(n) = Θ(n) • Ser fra kode: To separate løkker uten hopp
SpionproblemetLineær løsning - Oppsummering • Vi utnytter det faktum at bare en person kan være spion. Gitt to personer, kan vi eliminere en av dem. • Lærdom: • Analyser problemet godt • Skriv ned alt du vet • Utnytt egenskapene til problemet til din fordel