Lectures1st half
Upcoming SlideShare
Loading in...5
×
 

Lectures1st half

on

  • 450 views

 

Statistics

Views

Total Views
450
Slideshare-icon Views on SlideShare
450
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Lectures1st half Lectures1st half Presentation Transcript

    • Velkommen • Inge Li Gørtz. Adjunkt, forsker i algoritmer og datastrukturer. • Kontortid: mandag kl. 12.30-13. Bygning 322, kontor 124. Algoritmik og datastrukturer I • Læringsmål: Læs dem. Det er dem I bliver checket i til eksamen! • Medbring papir og blyant. 02105/02326 • Lav øvelserne - kom til grupperegningerne. • Slides. • Feedbackpersoner. torsdag den 4. februar 2010 1 torsdag den 4. februar 2010 2 Velkommen • Forelæsninger. kl. 10.15-12.00. • Grupperegning: kl. 8.15-10.00. • Afleveringsopgaver: 5 stk. Obligatoriske. • Samarbejdspolitik omkring afleveringsopgaverne. Algoritmer • Tilladt at snakke sammen, brainstorme, diskutere. • Skal skrive individuelt - ikke tilladt at vise besvarelser til hinanden. • Skriv på besvarelsen hvem I har arbejdet sammen med. torsdag den 4. februar 2010 3 torsdag den 4. februar 2010 4
    • Hvad er en algoritme? Algoritme • En algoritme er en beskrivelse af, skridt for skridt, hvordan noget gøres • Beskrives i klart sprog: præcist, kortfattet, entydigt. (beregnes). Alle skridt skal beskrives entydigt og det skal være klart hvordan ethvert skridt udføres. • Dårlige beskrivelser af franskbrødsalgoritmen. • Eksempel. Franskbrødsalgoritme: 1. Bland gær og lidt vand. 1. Åbn køleskabet og tag pakken i 2. Bland mel og mere vand, lidt øverste venstre hjørneoaf lågen. g 1. Bland 30 g gær med 1 dl lunkent vand. r sukker og salt i dejen. 2. Tag den midterste lje tapose i 3. skuffe 2. Bland yderligere 500 g mel og 2 del vand i dejen og ælt i 10 minutter. Lad ist 3. Bland mel i til det har en passende fra højre. de ion ge tut hæve til dobbelt størrelse. konsistens. 4. Lad brødet hæve. præc an t in i øverste skuffe. 3. Find decilitermål r m lid Fo fo vand fra vandhanen og 4. Afmål 2 dl r 3. Slå dejen ned, form brødet og lad hæve i 20 min. u 4. Bag i ovnen i 40 minutter ved 200 C. F or 5. Slå dejen ned, form brødet og lad det hæve igen. 5 dl fra den hentede pose. 5. Bland med indholdet af den 6. Bag i ovnen til det er færdigt. hentede pakke fra køleskabet. Input: 500g mel, 3 dl vand, 30 g gær, 5 g sukker, 5 g salt. Input: mel, vand, gær, sukker og salt i 6. .... Output: Et franskbrød. passende mængder. Output: Et franskbrød torsdag den 4. februar 2010 5 torsdag den 4. februar 2010 6 Algoritmisk problem Algoritme: Et andet eksempel • Algoritmisk problem. • Input: En følge [a1,....,an] af heltal. • Output: Det mindste tal m fra inputfølgen. • Input. • Følgende algoritme løser problemet: • Output: beskrevet som funktion af input. 1. Sæt m = a1. 2. Sæt i = 2. 3. Hvis ai < m så sæt m = ai. • Eksempel: FindMin 4. Læg 1 til i. 5. Hvis i ≤ n så gå til linie 3. • Input: En følge [a1,....,an] af heltal. 6. Returnér m. • Output: Det mindste tal m fra inputfølgen [a1,....,an]. • Algoritmen er korrekt: Hver gang linie 3 er udført er m lig det mindste af tallene [a1,....,ai]. Når i til sidst sættes til n+1 er m altså det mindste af tallene [a1,....,an]. torsdag den 4. februar 2010 7 torsdag den 4. februar 2010 8
    • Algoritme: Pseudokode Mere om algoritmer • Input: En følge [a1,....,an] af heltal. • Hvad er forskellen på et program og en algoritme for et givet problem? • Output: Det mindste tal m fra inputfølgen. • Følgende algoritme løser problemet: Algoritmer er uafhængige af specifikke programmeringssprog. En algoritme beskriver en løsning til et problem. Et program udtrykker en Min( a1,....,an]){ algoritme i et programmeringssprog så computeren kan udføre det. m = a1 for i = 2 to n do if (ai < m) • Se mere på then m = ai return m http://cimel3.cse.lehigh.edu/movies/Algorithm/facts/Algorithm_sec2.htm } • = kan erstattes af <- eller :=. Det vigtige er at I gør det samme i hele beskrivelsen. Husk at algoritmer og pseudokode er uafhængige af konkrete programmeringssprog. torsdag den 4. februar 2010 9 torsdag den 4. februar 2010 10 Hvad er algoritmik? Hvorfor algoritmik? • Læren om diskrete beregningsprocesser. • Internet. Web søgning, rutning af pakker, streaming, distribueret fildeling. • Biologi. Human genome project, protein foldning. • Design og analyse af algoritmer og datastrukturer. • Computers. Circuit layout, filsystem, compilere. • Computer spil. Computergrafik, virtual reality. • Effektive: hurtige, bruger mindst mulig plads i hukommelsen. • Transport. Skedulering af flypersonale, rutefindere. • Analyse: • Korrekthed: Algoritmen/datastrukturen virker som ønsket. • Effektivitet: • Hvor mange skridt bruger algoritmen/datastrukturen på en beregning på et input af en vis størrelse. • Hvor meget plads bruger algoritmen/datastrukturen i hukommelsen. torsdag den 4. februar 2010 11 torsdag den 4. februar 2010 12
    • Læringsmål og pensum for dagens forelæsning • Efter denne forelæsning vil du være i stand til at: ! Forklare begrebet algoritme. ! Definere stabil matching problemet. ! Beskrive Gale-Shapley (GS) algoritmen på en klar måde. Stabil Matching ! Anvende GS-algoritmen. ! Argumentere for at GS-algoritmen terminerer i endelige tid. Et eksempel ! Argumentere for at GS-algoritmen finder en korrekt løsning. • Pensum: KT (Kleinberg og Tardos: Algorithm Design) side 1-22. torsdag den 4. februar 2010 13 torsdag den 4. februar 2010 14 Matching af lægestuderende til hospitaler Matching af lægestuderende til hospitaler • Mål: Givet præferencer fra hospitaler og lægestuderende skal der designes en • Mål: Givet præferencer fra hospitaler og lægestuderende skal der designes en selvjusterende tildelingsproces. selvjusterende tildelingsproces. • Tildeling: Alle studerende skal tildeles et hospital og hvert hospital skal • Tildeling: Alle studerende skal tildeles et hospital og hvert hospital skal tildeles et bestemt antal studerende. tildeles et bestemt antal studerende. • Mulige problemer: De studerende og hospitalerne laver aftaler bag om ryggen • Ustabilt par: Studerende x og hospital y er ustabile hvis: på systemet og nogle studerende ender uden et hospital og omvendt. • x foretrækker y frem for sit tildelte hospital. • y foretrækker x fremfor en af sine tildelte studerende. Selvjusterende: Algoritmen skal designes så ingen hospitaler og studerende laver private aftaler. • Stabil tildeling: En tildeling uden ustabile par. Individuel interesse vil forhindre private aftaler i at blive lavet mellem studerende og hospitaler. torsdag den 4. februar 2010 15 torsdag den 4. februar 2010 16
    • Stabil matching problemet Stabil matching problemet • Mål: Givet n mænd og n kvinder find en “tilfredstillende” matching. • Perfekt matching: Deltagerne prioriterer deltagere af modsatte køn. • Enhver mand får præcis én kvinde. • Enhver mand laver en liste med kvinder i sin foretrukne rækkefølge (fra • Enhver kvinde får præcis én mand. bedst til værst). • Enhver kvinde laver en liste med mænd i sin foretrukne rækkefølge (fra • Ustabilt par: En mand Søren og en kvinde Trine er ustabile hvis de bedst til værst). foretrækker hinanden frem for deres nuværede partner: Thomas Schröder Søren Brun Søren Brun Thomas Søren Brun Franklin Franklin • Søren foretrækker Trine frem for sin nuværende partner. Franklin Franklin Thomas Schröder Thomas Schröder Schröder Søren Brun • Trine foretrækker Søren frem for sin nuværende partner. • Et ustabilt par kan forbedre deres situation ved at stikke af sammen. Trine Rikke Rask Lotte Nina • Stabil matching: Perfekt matching uden nogen ustabile par. Søren Brun Thomas Schröder Franklin • Stabil matching problemet: Givet præferencelister fra n mænd og n kvinder find en stabil matching, hvis en sådan eksisterer. Trine Lotte Lotte Rikke Rask Rikke Rask Nina Trine Nina Lotte Trine Rikke Rask Lotte Nina Rikke Rask Nina Trine torsdag den 4. februar 2010 17 torsdag den 4. februar 2010 18 Eksempel Find en stabil matching Schröder Søren Brun Søren Brun Thomas Schröder Søren Brun Søren Brun Thomas Søren Brun Thomas Franklin Franklin Søren Brun Thomas Franklin Franklin Franklin Franklin Thomas Schröder Franklin Franklin Thomas Schröder Thomas Schröder Schröder Søren Brun Thomas Schröder Schröder Søren Brun Trine Rikke Rask Lotte Nina Trine Rikke Rask Lotte Nina Søren Brun Thomas Schröder Franklin Søren Brun Thomas Schröder Franklin Trine Lotte Lotte Rikke Rask Trine Lotte Lotte Rikke Rask Rikke Rask Nina Trine Nina Rikke Rask Nina Trine Nina Lotte Trine Rikke Rask Lotte Lotte Trine Rikke Rask Lotte Nina Rikke Rask Nina Trine Nina Rikke Rask Nina Trine 19 20 torsdag den 4. februar 2010 19 torsdag den 4. februar 2010 20
    • En stabil matching Schröder Søren Brun Søren Brun Thomas Søren Brun Franklin Thomas Franklin Fri-og-afvis algoritmen Franklin Franklin Thomas Schröder Thomas Schröder Schröder Søren Brun • Fri-og-afvis algoritmen. [Gale & Shapley 1962] Intuitiv måde der garanteret altid finder en stabil matching. • Til at starte med er alle ledige. Trine Rikke Rask Lotte Nina • Så længe der findes en ledig mand der endnu ikke har friet til alle kvinder gør følgende: ! Vælg en sådan mand m. ! Manden m frier til den kvinde øverst på hans liste som han ikke allerede Søren Brun Thomas Schröder Franklin har friet til: ! Hvis hun er ledig, siger hun ja, og de bliver forlovet. ! Hvis hun foretrækker ham frem for sin nuværende forlovede, siger hun ja, de bliver forlovet, og samtidig ophæver hun sin tidligere forlovelse. Trine Lotte Lotte Rikke Rask ! Hvis hun foretrækker sin nuværende forlovede, afviser hun manden m. Rikke Rask Nina Trine Nina Lotte Trine Rikke Rask Lotte Nina Rikke Rask Nina Trine 21 torsdag den 4. februar 2010 21 torsdag den 4. februar 2010 22 Fri-og-afvis algoritmen Fri-og-afvis algoritmen Schröder Søren Brun Søren Brun Thomas Søren Brun Franklin Thomas Franklin Franklin Franklin Thomas Schröder Thomas Schröder Schröder Søren Brun • Fri-og-afvis algoritmen. [Gale & Shapley 1962] Intuitiv måde der garanteret altid finder en stabil matching. Initialiser alle personer til at være frie. while (der findes en mand er fri som ikke har friet til alle kvinder) { Trine Rikke Rask Lotte Nina Vælg sådan en mand m k = øverste kvinde på m’s liste som m ikke allerede har friet til if (k er fri) Søren Brun Thomas Schröder Franklin then sæt m og k til at være forlovede else if (k foretrækker m frem for sin forlovede z) then sæt m og k til at være forlovede, og z til at være fri. else k afviser m. Trine Lotte Lotte Rikke Rask } Rikke Rask Nina Trine Nina Lotte Trine Rikke Rask Lotte Nina Rikke Rask Nina Trine 24 torsdag den 4. februar 2010 23 torsdag den 4. februar 2010 24
    • Bevis for korrekthed: Terminering Bevis for korrekthed: Terminering • Spørgsmål: Hvorfor stopper fri-og-afvis algoritmen altid på et eller andet • Observation 1. Mænd frier til kvinder i faldende orden i forhold til præferencer tidspunkt? (bedste først). • Hint 1. I hvilken rækkefølge frier en mand til kvinderne på sin liste? • Observation 2. Når en kvinde er blevet forlovet bliver hun aldrig ledig igen, I faldende orden fra bedst til værst. men hun kan skifte til noget bedre. • Hint 2. Hvis en kvinde er ledig kan vi så sige noget om hvor mange der har friet til hende? • Påstand: Algoritmen terminerer efter højst n2 iterationer af while-løkken Ingen! (= højst n2 frierier). • Hint 3. Hvor mange gange kan en mand fri til den samme kvinde? 1 gang. • Bevis. Hver gang while-løkken gennemløbes frier en mand til en kvinde han ikke har friet til før. Der er kun n2 forskellige frierier. ∎ • Hint 4. Hvor mange frierier kan vi have i alt (der er n mænd og n kvinder)? n2 torsdag den 4. februar 2010 25 torsdag den 4. februar 2010 26 Bevis for korrekthed: Perfektion Bevis for korrekthed: Perfektion • Påstand. Alle mænd og kvinder får en partner. • Påstand. Alle mænd og kvinder får en partner. • Hint 1. Brug modbevis (antag der findes en ledig kvinde). • Bevis. (modsætningsbevis) ! Antag der findes en ledig kvinde, Hanne. • Hint 2. Hvad kan man sige om en kvinde der er ledig når algoritmen ! I følge Observation 2, er der ikke nogen der har friet til Hanne. terminerer? ! Ingen har friet til hende. Når Hanne er ledig må der også være en ledig mand, f.eks. Per, da der er lige mange mænd og kvinder. • Hint 3. Hvis der er en ledig kvinde så er der også en .....? ! Men Per frier til alle, siden han ender med at være ledig. ∎ ledig mand • Hint 4. Hvor mange kvinder har en ledig mand friet til når algoritmen terminerer? Alle torsdag den 4. februar 2010 27 torsdag den 4. februar 2010 28
    • Bevis for korrekthed: Stabilitet Opsummering: Stabil matching • Påstand. Der er ingen ustabile par. • Stabil matching problemet. Givet n mænd og n kvinder, og deres præferencer, find en stabil matching. • Bevis. (ved modsætning) • Eksempel: Tildeling af lægestuderende til hospitaler. ! Antag at Per og Hanne er et ustabilt par: de foretrækker hinanden frem for • Gale-Shapley algoritmen. Fri-og-afvis. deres nuværende partner. Mænd frier i faldende orden ! Tilfælde 1: Per har ikke friet til Hanne. af deres præferencer. • GS-algoritmen terminerer. Hver gang en mand frier, så frier han til en ny kvinde. ¬ Per foretækker sin nuværende partner frem for Hanne. ¬ Per og Hanne er ikke et ustabilt par. • GS-algoritmen finder altid en perfekt matching. Kvinder bytter kun opad. ! Tilfælde 2: Per har friet til Hanne. ¬ Hanne afviste Per (med det samme eller senere). ¬ Hanne foretrækker sin nuværende partner frem for Per. ¬ Per og Hanne er ikke et ustabilt par. ∎ torsdag den 4. februar 2010 29 torsdag den 4. februar 2010 30 Stabil matching • GS-algoritmen kan modificeres til at håndtere mange varianter af problemet: ! Polygami (hospitaler-lægestuderende) ! Forbudte partnere. ! Kun præferencer for nogle - resten lige meget. 5 repræsentative problemer ! Kun to præferencer: god eller dårlig. Flere eksempler • Effektiv implementation? ! Ser vi på om 2 uger i forbindelse med datastrukturer. • Hvis der er flere stabile matching’er hvilken en finder GS så? torsdag den 4. februar 2010 31 torsdag den 4. februar 2010 32
    • Interval skedulering Vægtet interval skedulering • Input. Mængde af opgaver med start- og sluttider. • Input. Mængde af opgaver med start- og sluttider og vægte. • Mål. Find den største delmængde af kompatible opgaver. • Mål. Find den delmængde af kompatible opgaver der har størst vægt. Opgaverne overlapper ikke tidsmæssigt. a 23 b 12 c 20 d 26 e 13 f 20 g 11 h 16 Tid Tid 0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 8 9 10 11 torsdag den 4. februar 2010 33 torsdag den 4. februar 2010 34 2-delt matching Uafhængig mængde • Input. 2-delt graf. • Input. Graf. • Mål. Find den største matching. • Mål. Find den største mængde uafhængige knuder. Mængde af knuder hvor der ikke er nogen kanter imellem. A 1 B 2 1 2 C 3 4 5 3 D 4 6 7 E 5 torsdag den 4. februar 2010 35 torsdag den 4. februar 2010 36
    • Kompetitiv facilitetsplacering Læringsmål og pensum for dagens forelæsning • Input. Graf med vægte på knuderne. • Efter denne forelæsning vil du være i stand til at: ! Forklare begrebet algoritme. • Spil. 2 konkurrerende spiller skiftes til at vælge en knude. Det er ikke tilladt at vælge en knude hvis en af dens naboer er valgt. ! Definere stabil matching problemet. • Mål. Find ud af om der findes en strategi for spiller 2 der giver værdi B. ! Beskrive Gale-Shapley (GS) algoritmen på en klar måde. ! Anvende GS-algoritmen. ! Argumentere for at GS-algoritmen terminerer i endelige tid. ! Argumentere for at GS-algoritmen finder en korrekt løsning. 10 1 5 15 5 1 5 1 15 10 • Pensum: KT side 1-22. 2nd spiller kan garantere 20, men ikke 25. torsdag den 4. februar 2010 37 torsdag den 4. februar 2010 38 Læringsmål og pensum • Læringsmål: Efter denne forelæsning vil du kunne ! Forklare hvad køretid af en algoritme betyder og hvordan det beregnes. Analyse af algoritmer ! Forklare hvad worst-case køretid er. ! Lave simple beregninger i O-notation. ! Analysere algoritmers køretid vha. asymptotisk notation. ! Forklare hvad en polynomiel tids algoritme er. • Pensum: KT side 29-42 (afsnit 2.0-2.2) og side 65 midt-66 (“Solved Exercises”). torsdag den 11. februar 2010 1 torsdag den 11. februar 2010 2
    • Analyse af algoritmer Køretid og beregningskridt • Analyse af algoritmer. • Køretid. Antal beregningsskridt en algoritme bruger på et givet input. • Afgøre algoritmens forbrug af ressourcer • Beregningsskridt. Abstraherer væk fra detaljer og forskelle i hardware ved at • tid, måle køretid i beregningskridt. Følgende operationer tæller som ét beregningskridt (RAM modellen): • hukommelse, ! Simple tildelinger: x = y, • cache-forbrug, ... ! Simple aritmetiske operationer (+, *, -, /, floor, ceiling, %, m.fl.). ! Simple sammenligninger: a < b, a = b, a > b. Eks. i > 0 and j>i; • Dette kursus: Mest om tid og en lille smule om hukommelse. ! Andre “trivielle” operationer som er uafhængige af inputstørrelsen • Argumentere for korrekthed. (conditional and unconditional branching, and, or,...). • Køretid angives som en funktion af inputstørrelsen: T(n). torsdag den 11. februar 2010 3 torsdag den 11. februar 2010 4 Beregningskridt: Eksempler Opgaver • Konstant antal beregningsskridt: • For hvilke af følgende operationer er T(n) konstant: for i = 1 to n { if (i > 0) then { j = 1 } else { j = j+2 } j = i·i + 3 } ÷ • Operationer som ikke tæller som et konstant antal beregningskridt er ✓ for i = 1 to 27 { eksempelvis j = i·i + 3 } ! Tildelingen x = Min(A) if (i < 14) ! T(n) afhænger af køretiden af algoritmen Min. for-løkken: then { x = i % 2} else { x = i / 2} ✓ for i = 1 to n { j = i + 1 } T(n) afhænger af n: T(n)~n. torsdag den 11. februar 2010 5 torsdag den 11. februar 2010 6
    • Worst-case analyse (værste tilfælde-analyse) • Worst-case analyse. Find en grænse for den størst mulige køretid af en algoritme på input af en given størrelse n. • Average case analyse. Find en grænse for køretid af en algoritme på tilfældigt Asymptotisk analyse input af størrelse n. O-notation • Køretid = worst-case køretid i resten af dette kursus med mindre andet bliver sagt eksplicit. torsdag den 11. februar 2010 7 torsdag den 11. februar 2010 8 Størrelsesorden af køretidsfunktioner T(n)=7n2+3n+42 • Ønsker at sige noget om køretiden af en algoritme på input af størrelse n. 7n^2 3n 42 7n^2 3n 42 T(n) = 7n2 + 3n + 42. 3000 800 • For store n er led af lavere orden ubetydelige: T(n) ~ 7n2 2250 600 • Kan desuden ignorere konstante faktorer (ser kun på væksthastigheden): 1500 400 T(n) ~ n2 200 750 0 0 0 1 2 3 4 5 6 7 8 9 10 0 5 10 15 20 torsdag den 11. februar 2010 9 torsdag den 11. februar 2010 10
    • Asymptotisk størrelseorden Notation • Øvre grænse. T(n) er O(f(n)) hvis der eksisterer konstanter c>0 og n0 ≥ 0 • Lettere misbrug af notation. T(n) = O(f(n)). således at for alle n ≥ n0 gælder T(n) ≤ c · f(n). • Vær opmærksom på: • Eksempler: T(n)= 7n2 + 3n + 42. ! O(f(n)) er en mængde af funktioner. ! 7n2 + 3n + 42 ≤ 7n2 + 3n2 + 42n2 ≤ (7+3+42)n2 for alle n ≥ 1 ! Kan ikke skrive O(n3) = f(n). T(n) er O(n2). ! f(n)=O(n3) og g(n)=O(n3) medfører ikke f(n) = g(n). Eks. f(n) = 5n3, g(n) = 3n2, ! men f(n) ≠ g(n). T(n) er også O(n3)! ! T(n) er ikke O(n). • Tænk på det som ∈ eller ⊆: T(n) ∈ O(f(n)) eller O(n2) ⊆ O(n3) torsdag den 11. februar 2010 11 torsdag den 11. februar 2010 12 Opgaver Asymptotisk størrelseorden • f(n) = 3n + 2n3 - n2 • Øvre grænse. T(n) er O(f(n)) hvis der eksisterer konstanter c > 0 og n0 ≥ 0 således at for alle n ≥ n0 gælder T(n) ≤ c · f(n). • f(n) = O(n)? ÷ • f(n) = O(n3)? ✓ • Nedre grænse. T(n) er Ω(f(n)) hvis der eksisterer konstanter c>0 og n0 ≥ 0 • f(n) = O(n4)? ✓ således at for alle n ≥ n0 gælder T(n) ≥ c · f(n). • g(n) = 4n2 + log n • Tæt grænse. T(n) er Θ(f(n)) hvis T(n) er både O(f(n)) og Ω(f(n)). • g(n)=O(n2 log n)? ✓ • g(n) = O(n2)? ✓ • Eksempel: T(n) = 7n2 + 3n + 42. • g(n) = O(f(n))? ✓ ! T(n) er O(n2), O(n3), Ω(n2), Ω(n) og Θ(n2). ! T(n) er ikke O(n), Ω(n3), Θ(n) eller Θ(n3). • f(n) = O(g(n))? ÷ • Obs: O-notation (O, Ω og Θ) bruges kun på ikke-negative funktioner. torsdag den 11. februar 2010 13 torsdag den 11. februar 2010 14
    • Egenskaber Egenskaber • Transitivitet. • Symmetri ! f=O(g) og g=O(h) f=O(h). ! f = Θ(g) hvis og kun hvis g = Θ(f) ! f=Ω(g) og g=Ω(h) f=Ω(h) • Transponeret symmetri. ! f=Θ(g) og g=Θ(h) f=Θ(h). ! f=O(g) hvis og kun hvis g=Ω(f) • Additivitet. ! f=O(h) og g = O(h) f+g =O(h). • Addition og maximum. ! f=Ω(h) og g=Ω(h) f+g=Ω(h) ! max{f,g} = Θ(f+g) ! f=Θ(h) og g=Θ(h) f+g=Θ(h). torsdag den 11. februar 2010 15 torsdag den 11. februar 2010 16 Asymptotiske grænser for nogle almindelige funktioner Eksempler • Polynomier. a0 + a1 n + ....+ ad nd = Θ(nd) for ad > 0 • Find mindste tal: Min( a1,....,an]){ m = a1 konstant tid • Logaritmer. O(loga n) = O(logb n) for alle konstanter a, b > 0. gentages n-1 gange for i = 2 to n { kan undgå at specificere basen if (ai < m) then {m = ai} } • Logaritmer. log n = O(nx) for alle x > 0. return m log vokser langsommere end ethvert polynomie } • Lineær køretid: T(n)=O(n) og T(n)=Ω(n) dvs. T(n) = Θ(n) • Eksponenter. nd = O(rn) for alle r > 1 og d > 0. Enhver exponentiel funktion vokser hurtigere end ethvert polynomie torsdag den 11. februar 2010 17 torsdag den 11. februar 2010 18
    • Eksempler m. 2 for-løkker Eksempler • Kvadratisk køretid: Loop1(n){ gentages n gange • Bubble-sort: Sorterer et array A af længde n indeholdende tal. x = 1 • T(n) = O(n2), for i = 1 to n { for j = 1 to n { • Eks. Input A=<3,67,34,2,25>. Output: A=<2,3,25,34,67> • T(n) = Ω(n2), x = x + 1 O(n) tid • T(n) = Θ(n2) } Bubblesort(A){ } return x for i = 2 to length[A]{ } for j = length[A] downto i { if (A[j] < A[j-1]) Loop2(n){ then { exchange A[j] A[j-1] } • Lineær køretid: x = 1 } gentages n gange • T(n) = O(n), for i = 1 to n { x = x + 1 } • T(n) = Ω(n), } } gentages n gange • T(n) = Θ(n) for j = 1 to n { x = x + 1 } • Kvadratisk køretid: T(n)=O(n2), T(n)=Ω(n2), dvs. T(n) = Θ(n2), hvor n er return m længden af A. } torsdag den 11. februar 2010 19 torsdag den 11. februar 2010 20 Eksempler Eksempel Loop4(n){ • Mere om løkker: x = 1 for i = 1 to n { for i = 2 to n { j = 1 x = Alg(i) while (j ≤ n) { } x = x + 1 j = 2·j } } • Hvor køretiden for Alg(i) = O(i)? O(n2) return x } • Hvor køretiden for Alg(i) = O(1)? O(n) • Linearitmisk (linearitmic) køretid: T(n)=O(n log n) og T(n)=Ω(n log n) dvs. T(n) = Θ(n log n). • Hvor køretiden for Alg(i) = O(log i)? O(n log n) • For hver iteration af for-løkken kører while-løkken log n gange: 1. gang er j =1, 2. gang er j=2, osv. Efter k iterationer er j= 2k. Løkken stopper når j = 2k > n, dvs. når k > log n. torsdag den 11. februar 2010 21 torsdag den 11. februar 2010 22
    • Effektiv algoritme • Forslag til definition af effektiv algoritme (1): En algoritme er effektiv hvis den kører hurtigt på alle input. Effektive algoritmer • Brute force. For mange ikke-trivielle problemer er der en naturlig brute-force søgealgoritme der checker alle mulige løsninger. ! Typisk 2n tid/skridt eller værre for input af størrelse n. ! Uacceptabelt i praksis. n! for stabil matching med n mænd og n kvinder • Forslag til definition af effektiv algoritme (2): En algoritme er effektiv hvis den har bedre (worst-case) køretid end brute-force søgning. torsdag den 11. februar 2010 23 torsdag den 11. februar 2010 24 Polynomiel tid Worst-case polynomiel tid • Ønskelig skaleringsegenskab. Når input-størrelsen fordobles bliver algoritmen • Definition. En algoritme er effektiv hvis dens (worst-case) køretid er kun en konstant faktor langsommere. polynomiel. • Begrundelse. Det virker rent faktisk i praksis! Der findes en konstant d>0 således at T(n) =O(nd). ! Selv om 6.02 x 1023 x n20 teknisk set er polynomiel-tid, ville den være ubrugelig i praksis. ! I praksis, har polynomiel-tids algoritmer som bliver udviklet næsten altid • Definition. En algoritme kaldes for en polynomiel-tids algoritme hvis små konstanter og små eksponenter. ovenstående skaleringsegenskab holder. Vi siger også at algoritmen har ! At bryde igennem den eksponentielle barriere af brute force afdækker polynomiel køretid. typisk nogle grundlæggende strukturer ved problemet. • Undtagelser. ! Nogle polynomiel-tids algoritmer har høje konstanter og/eller høje eksponenter og er ubrugelige i praksis. ! Nogle eksponentiel-tids (eller værre) algoritmer er meget brugte da worst- case tilfældene ser ud til at være sjældne. torsdag den 11. februar 2010 25 torsdag den 11. februar 2010 26
    • Hvorfor det er vigtigt Faldgruber • Pas på med ikke at forveksle Ω, Θ og O med worst-case, average-case og best-case analyse: • Worst-case analyse: ! Vi kigger på hvad T(n) er i værste tilfælde for input af størrelse n. • Ω, Θ og O: ! Siger noget om hvor tætte grænser vi har på funktionen T(n). ! T(n) = O(n) bruges når vi kender en øvre grænse for T(n). ! T(n) = Ω(f) bruges når vi har en nedre grænse for T(n). ! T(n) = Θ(n). Angiver at analysen af algoritmen er “tæt”. torsdag den 11. februar 2010 27 torsdag den 11. februar 2010 28 Eksempel Læringsmål og pensum • T(n) = antal iterationer i GS-algoritmen: Viste T(n)=O(n2) sidste gang. Er den • Læringsmål: Efter denne forelæsning vil du kunne også Ω(n2)? ! Forklare hvad køretid af en algoritme betyder og hvordan det beregnes. • Husk vi taler om worst-case! ! Forklare hvad worst-case køretid er. ! Lave simple beregninger i O-notation. • Sidst: for ethvert input er der højst n2 iterationer, dvs. T(n)=O(n2). ! Analysere algoritmers køretid vha. asymptotisk notation. • Vis at der findes input så der udføres n(n+1)/2 iterationer. Dvs. T(n)=Ω(n2). ! Forklare hvad en polynomiel tids algoritme er. • Pensum: KT side 29-42 (afsnit 2.0-2.2) og side 65 midt-66 (“Solved Exercises”). torsdag den 11. februar 2010 29 torsdag den 11. februar 2010 30
    • Læringsmål og pensum • Læringsmål: Efter denne forelæsning vil du kunne ! Forklare hvad en hægtet liste er. ! Indsætte og slette elementer, samt søge i en hægtet liste. Introduktion til datastrukturer ! Argumentere for køretiderne af ovenstående operationer på en hægtet liste og angive dem i O-notation. Hægtede lister og tabeller ! Anvende binær søgning på en tabel (array). ! Angive køretiden for binær søgning i O-notation samt argumentere for den. ! Vurdere om tabeller eller hægtede lister passer bedst til en given implementation. ! Vælge datastrukturer til implementation af GS-algoritmen, samt analysere køretiden af implementationen. • Pensum: KT afsnit 2.3 + side 56. fredag den 19. februar 2010 1 fredag den 19. februar 2010 2 Datastruktur Implementation af stabil matching • Datastruktur: Måde til at organisere data så der effektivit kan søges og • Ønsker at implementere af GS-algoritmen modificeres i det. Initialiser alle personer til at være frie. while (en mand er fri som ikke har friet til alle kvinder) { Vælg sådan en mand m k = øverste kvinde på m’s liste som m ikke allerede har friet til if (k er fri) sæt m og k til at være forlovede else if (k foretrækker m frem for sin forlovede z) sæt m og k til at være forlovede, og z til at være fri. else k afviser m. } • Hvordan holder vi styr på • Hvilke mænd der er ledige. • Hvilken kvinde m skal fri til i denne runde. • Om kvinde k er ledig. • Om kvinde k foretrækker mand m frem for sin forlovede z. fredag den 19. februar 2010 3 fredag den 19. februar 2010 4
    • Tabeller (arrays) • Egenskaber ved en tabel: • Kan tilgå det i’te element i O(1) tid: A[i] • Eksempel Tabeller • Hvem er forlovet med hvem • Tabel ikke egnet til dynamisk mængde: f.eks. ledige mænd. • besværligt at tilføje/fjerne elementer. fredag den 19. februar 2010 5 fredag den 19. februar 2010 6 Hægtede lister (linked lists) • Implementation af dynamisk mængde: (mængde der kan ændre størrelse). • Operationer: • Insert • Delete Hægtede lister (linked lists) • Search • Hægtet liste ~ kæde: Liste over de enkelte led i kæden, hvor det for hvert led er angivet hvilket led der er det efterfølgende. • Dobbelthægtet liste: Hvert led angiver hvilket led der er det foregående og hvilket der er det efterfølgende. fredag den 19. februar 2010 7 fredag den 19. februar 2010 8
    • Hægtede lister Hægtede lister • Hægtet liste: Mængde af knuder, hvor hver knude har en værdi/et navn og • Demo indeholder en reference/peger til næste knude. • Hægtede lister i Java: • Nemt at definere som Java klasse. • En reference til en String eller Int. • En reference til en anden knude. • Brug speciel værdi null til at slutte listen. public class Node { private String name; private Node next; } fredag den 19. februar 2010 9 fredag den 19. februar 2010 10 Hægtede lister Hægtede lister • Dobbelthægtet liste: Mængde af knuder, hvor hver knude har en værdi/et • Eksempler: Liste L navn og indeholder referencer/pegere til en næste og foregående knude. • first.val = 9 • first.next.val = 4 eller (first.next).val = 4 • Hvert element e har: • first.next.next.val = 13 ((first.next).next).val = 13 • En værdi: e.val • x = first.next: x.prev.val = 9 • En pointer/reference til næste element: e.next • En pointer/reference til forrige element: e.prev 9 4 13 27 5 First prev next prev next prev next prev next prev next 9 4 13 27 5 first(L) prev next prev next prev next prev next prev next • Pointer first: peger på første element. • first.prev = null, last.next = null. • Pointer last: peger på sidste element (kan undværes). fredag den 19. februar 2010 11 fredag den 19. februar 2010 12
    • Søgning i hægtede lister Indsættelse i hægtede lister • Søg efter værdien k i listen L. • Indsæt element e i forrest listen Search(L,k){ InsertFirst(L,e){ x = first(L) e.next = first(L) while x ≠ Null and x.val ≠ k do { if (first(L) ≠ Null) x = x.next then {first(L).prev = e} } first(L) = e return x e.prev = Null } } • Eksempel: Search(L,13) e 9 4 13 27 5 5 9 4 13 27 First(L) prev next prev next prev next prev next prev next first(L) prev next prev next prev next prev next prev next • Køretid: Θ(n) • InsertFirst tager en pointer/reference til elementet som input. fredag den 19. februar 2010 13 fredag den 19. februar 2010 14 Indsættelse i hægtede lister Indsættelse i hægtede lister • Indsæt element e i forrest listen • Indsæt element e mellem element d og f i listen L InsertFirst(L,e){ Insert(L,e,d,f){ e.next = first(L) e.next = f if (first(L) ≠ Null) e.prev = d then {first(L).prev = e} d.next = e first(L) = e f.prev = e e.prev = Null } } e • Insert tager en pointer/reference til elementet som input. 5 9 4 13 27 first(L) prev next prev next prev next prev next prev next • Køretid: O(1) • InsertFirst tager en pointer/reference til elementet som input. • Køretid: O(1) fredag den 19. februar 2010 15 fredag den 19. februar 2010 16
    • Sletning i hægtede lister Sletning i hægtede lister • Slet element e fra listen L. • Slet element e fra listen L. Delete(L,e){ Delete(L,e){ if (e.prev = Null) if (e.prev = Null) then {first(L) = e.next} then {first(L) = e.next} else {(e.prev).next = e.next} else {(e.prev).next = e.next} if (e.next ≠ Null) if (e.next ≠ Null) then {e.next.prev = e.prev} then {e.next.prev = e.prev} } } e 9 4 13 27 5 9 13 27 5 First(L) prev next prev next prev next prev next prev next First(L) prev next prev next prev next prev next • Delete tager en pointer/reference til elementet som input. • Delete tager en pointer/reference til elementet som input. • Slet element med en given værdi v: Kald først Search(L,v) • Køretid: O(1) fredag den 19. februar 2010 17 fredag den 19. februar 2010 18 Hægtede lister opsummering • Følgende operationer: • Search(L,k): Θ(n) • InsertFirst(L,e): O(1) • Insert(L,e,d,f): O(1) • Delete(L,e): O(1) Mere om tabeller: binær søgning • Hvordan ville køretiderne blive påvirket hvis vi implementerede operationerne i en simpel tabel? • Dårligere køretider. • Search: Θ(N), hvor N størrelsen af tabellen (N ≥ n). • Enten Insert eller Delete får køretid Θ(n). fredag den 19. februar 2010 19 fredag den 19. februar 2010 20
    • Binær søgning i tabeller (arrays) Binær søgning: Analyse • Givet sorteret tabel (array) A med n tal findes tallet x i A? • Hvor mange indgange kigger vi højst på? • Lineær søgning: Check alle indgange i tabellen fra 1....n. • En iteration: Tabellen vi kigger på bliver halvt så stor. Efter • 1. omgang: n/2 • Binær søgning: • 2. omgang: n/4 • Find værdien v af midterste indgang i A. • ...... • v = x: færdige • k’te omgang: n/2k • v < x: Gentag proceduren rekursivt på øverste halvdel af A • v > x: Gentag proceduren rekursivt på nederste halvdel af A • k skal være så stor at n/2k ≤ 1 k ≥ log2 n. • Køretid: Θ(log n). fredag den 19. februar 2010 21 fredag den 19. februar 2010 22 Binær søgning opgave Binær søgning pseudokode • Brug binær søgning til at lede efter tallene 7 og 42 i denne tabel. • Iterativ implementation BinarySearch(A,x){ lo = 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 hi = length[A] 2 5 7 11 12 14 16 25 32 33 42 45 64 67 78 83 92 while (lo ≤ hi) { mid = lo + (hi - lo)/2 if (x < A[mid]) then • 7: A[9]=32, A[4]=11, A[2]=5, A[3]=7 { hi = mid-1 } else if (x > A[mid]) then • 42: A[9]=32, A[13]=64, A[11]=42 { lo = mid+1 } else // x = A[mid] • Giv et generelt eksempel hvor binær søgning bruger log n skridt (vis at T(n)= { return mid // Found } Ω(log n)). } Tallet der søges efter er ikke i tabellen. return -1 // Not found • Hvorfor kan man ikke lave binær søgning i en sorteret hægtet liste i O(log n) } Kan ikke tilgå en bestemt position i listen i konstant tid. fredag den 19. februar 2010 23 fredag den 19. februar 2010 24
    • Binær søgning pseudokode Sammenligning: tabeller og hægtede lister • Rekursiv implementation: • Tabel: • Find i’te element: O(1) BinarySearch(A,lo,hi,x){ • Søgning if (hi < lo) then {return -1} // Not found • usorteret: Θ(n) mid = lo + (hi - lo)/2 • sorteret: Θ(log n) if (x < A[mid]) then { • Indsæt og slet: Kan ikke gøres i konstant tid hvis tabellen skal have BinarySearch(A,lo,mid-1,x) størrelse Θ(n). else if (x > A[mid]) then { BinarySearch(A,mid+1,hi,x) else { return mid } // Found } • Hægtet liste: • Find i’te element: Θ(i) (O(n)) • Søgning (både sorteret/usorteret): Θ(n) fredag den 19. februar 2010 25 fredag den 19. februar 2010 26 Valg af datastruktur • Hvordan vælger man hvilken datastruktur man vil bruge til implementation af f.eks. en (dynamisk) mængde? • Kig på køretiderne for de forskellige operationer og overvej hvilke operationer du har brug for i det konkrete tilfælde. Implementation af GS-algoritmen • Eksempel: GS-algoritmen Initialiser alle personer til at være frie. Valg af datastrukturer while (en mand er fri som ikke har friet til alle kvinder) { Vælg sådan en mand m k = øverste kvinde på m’s liste som m ikke allerede har friet til if (k er fri) sæt m og k til at være forlovede else if (k foretrækker m frem for sin forlovede z) sæt m og k til at være forlovede, og z til at være fri. else k afviser m. } fredag den 19. februar 2010 27 fredag den 19. februar 2010 28
    • Implementation af GS-algoritmen Implementation af GS-algoritmen • Mænd og kvinder identificeres ved et nummer. • Kvindernes præferenceliste: 1. forsøg • Mænds præferenceliste: For hver mand m • Ordnet tabel Bk: Bk[i] = mand nummer i på kvinde k’s præferenceliste. • Hægtet liste Pm i ordnet rækkefølge, slet kvinde fra listen når m har friet til // Initialiser alle personer til at være frie. hende. for (i=1 to m) do { • Ledige mænd: Hægtet liste L. F[i] = -1 Køretid? InsertFirst(L,i) // Indsæt mand i i listen af ledige mænd. • Forlovede: tabel F. F[i] = j hvis kvinde i er forlovet med mand j, -1 hvis hun er fri. } O(n3) while (L non-empty) { • Kvinders præferenceliste: ??? Initialiser alle personer til at være frie. m = RemoveFirst(L) // m første ledige mand while (en mand er fri som ikke har friet til alle kvinder) { k = RemoveFirst(Pm) // k første kvinde på m’s liste Vælg sådan en mand m z = F[k] k = øverste kvinde på m’s liste som m ikke allerede har friet til if (z = -1) { F[k] = m } // k ledig if (k er fri) else if (k foretrækker m frem for z) { // k foretrækker m sæt m og k til at være forlovede F[k] = m else if (k foretrækker m frem for sin forlovede z) InsertFirst(L,z) sæt m og k til at være forlovede, og z til at være fri. } else else {InsertFirst(L,m)} // k foretrækker z k afviser m. } } } fredag den 19. februar 2010 29 fredag den 19. februar 2010 30 Implementation af GS-algoritmen Implementation af GS-algoritmen • Kvindernes præferenceliste: 2. forsøg • Kvindernes præferenceliste: 2. forsøg • Tabel: Bk[i]= rangen af mand i på k’s præferenceliste. • Tabel: Bk[i]= rangen af mand i på k’s præferenceliste. // Initialiser alle personer til at være frie. • Foretrækker k mand m frem for z for (i=1 to m) do { • Check om Bk[m] < Bk[z]: O(1) F[i] = -1 Køretid? InsertFirst(L,i) // Indsæt mand i i listen af ledige mænd. • Konstruktion af Bk for en kvinde: Θ(n) } O(n2) while (L non-empty) { • Konstruktion af Bk for alle k: Θ(n2) m = RemoveFirst(L) // m første ledige mand k = RemoveFirst(Pm) // k første kvinde på m’s liste z = F[k] if (z = -1) { F[k] = m } // k ledig else if (m kommer før z i Bk) { // k foretrækker m F[k] = m InsertFirst(L,z) } else {InsertFirst(L,m)} // k foretrækker z } } fredag den 19. februar 2010 31 fredag den 19. februar 2010 32
    • Implementation af GS-algoritmen Implementation af GS-algoritmen Initialiser alle personer til at være frie. • Mænd og kvinder while (en mand er fri som ikke har friet til alle kvinder) { • Identificeres ved et nummer. Vælg sådan en mand m k = øverste kvinde på m’s liste som m ikke allerede har friet til • Mænds præferenceliste: For hver mand M if (k er fri) sæt m og k til at være forlovede • Hægtet liste i ordnet rækkefølge, slet kvinde fra listen når M har friet til else if (k foretrækker m frem for sin forlovede z) hende. sæt m og k til at være forlovede, og z til at være fri. • Ledige mænd: else k afviser m. • Hægtet liste. } • Forlovede: tabel F. • Analyse: • F[i] = j hvis kvinde i er forlovet med mand j og -1 hvis hun er fri. • Initialisering: Θ(n2) • Kvinders præferenceliste: • En iteration af while-løkken: O(1) • Tabel: Bk[i]= rangen af mand i på kvinde k’s præferenceliste. • Antal iterationer: Θ(n2) • Køretid: T(n) = Θ(n2) fredag den 19. februar 2010 33 fredag den 19. februar 2010 34 Implementation af GS-algoritmen Hvorfor det er vigtigt • Alternativer: • Har set to implementationer af GS-algoritmen: Θ(n2) og Θ(n3). • Mænds præferenceliste: For hver mand • Gør det nogen forskel hvilken én vi vælger? • Tabel (array): Am[i] = i’te kvinde på m’s præferenceliste. • Tæller holder styr på hvor langt ned i rækken han er nået. • Forlovede: • Objektorienteret. Objekt for hver mand og kvinde. Kvindeobjekterne indholder felt der angiver hvem de er forlovet med. Mande/kvinde- objekter indholder tabellerne der angiver deres præferenceliste. fredag den 19. februar 2010 35 fredag den 19. februar 2010 36
    • Opsummering Hjemmeopgave 1 • Hægtede lister (linked lists) • Afleveres 8.15 d. 25/2 • Search: Θ(n) • Insert, InsertFirst, Delete: O(1) • Binær søgning i tabeller (arrays) • Θ(log n) • Implementation af GS-algoritmen med hægtede lister og tabeller. • Køretidsanalyse af GS-algoritmen: Θ(n2) fredag den 19. februar 2010 37 fredag den 19. februar 2010 38 Dagens læringsmål • Efter dagens forelæsning vil du være i stand til at • Forklare hvad en rekursiv algoritme er • Forklare forskellen mellem rekursion og iteration Rekursion og eksperimental analyse • Konstruere rekursive algoritmer • Analysere køretiden og argumentere for korrektheden af en rekursiv algoritme • Anvende mergesort, analysere dens køretid, samt argumentere for dens korrekthed. • Bruge den videnskabelige metode til at lave eksperimentel analyse af algoritmer. • Pensum: • Reges og Stepp udleverede kopier (om rekursion) • KT 5.1 + s. 48-50 (om merge, mergesort og analysen af dem). • Sedgewick og Wayne udleverede kopier. Tuesday, February 23, 2010 1 Tuesday, February 23, 2010 2
    • Rekursion • Iteration • Aktioner der skal gentages beskrives ved hjælp af en løkke. Rekursion • Rekursion • Aktioner der skal gentages beskrives ved hjælp af en metode/algoritme der kalder sig selv. Tuesday, February 23, 2010 3 Tuesday, February 23, 2010 4 Input: er line: er public static void reverse(Scanner input){ dette environment if (input.hasNextLine()) { Rekursion: Skriv ord ud i omvendt rækkefølge ikke String line = input.nextLine(); reverse(input); sjovt System.out.println(line); } • Input: • Output: } er sjovt dette ikke ikke dette sjovt er public static void reverse(Scanner input){ if (input.hasNextLine()) { String line = input.nextLine(); reverse(input); System.out.println(line); } } Tuesday, February 23, 2010 5 Tuesday, February 23, 2010 6
    • Input: Input: er line: er public static void reverse(Scanner input){ er line: er public static void reverse(Scanner input){ dette environment if (input.hasNextLine()) { dette environment if (input.hasNextLine()) { String line = input.nextLine(); String line = input.nextLine(); ikke ikke reverse(input); reverse(input); sjovt sjovt line: dette System.out.println(line); public static void reverse(Scanner input){ System.out.println(line); } if (input.hasNextLine()) { } environment } } String line = input.nextLine(); reverse(input); line: ikke System.out.println(line); public static void reverse(Scanner input){ } if (input.hasNextLine()) { environment } String line = input.nextLine(); reverse(input); line: sjovt System.out.println(line); public static void reverse(Scanner input){ } if (input.hasNextLine()) { environment } String line = input.nextLine(); reverse(input); System.out.println(line); public static void reverse(Scanner input){ } if (input.hasNextLine()) { } String line = input.nextLine(); reverse(input); System.out.println(line); } } Output: sjovt ikke dette er Tuesday, February 23, 2010 10 Tuesday, February 23, 2010 14 Rekursion Eksempel • Basis-tilfælde. Simpelt/simple tilfælde der løses uden rekursivt kald public static void reverse(Scanner input){ if (input.hasNextLine()) { • Rekursions-tilfælde/skridt. Reducerer til simplere problem der kan løses ved String line = input.nextLine(); et (eller flere) rekursive kald. reverse(input); System.out.println(line); } } • Basis-tilfælde. Gør ingenting. • Rekursions-tilfælde. reverse(input) Tuesday, February 23, 2010 15 Tuesday, February 23, 2010 16
    • Rekursion og induktion Eksempel • Rekursion public static void reverse(Scanner input){ if (input.hasNextLine()) { • Basis-tilfælde. Simpelt/simple tilfælde der løses uden rekursivt kald String line = input.nextLine(); reverse(input); • Rekursions-tilfælde/skridt. Reducerer til simplere problem der kan løses System.out.println(line); ved et (eller flere) rekursive kald. } } • Korrekthed • Induktion (over n) • Basis-tilfælde. Simpelt/simple tilfælde der bevises for specifikke værdier af • Tom linie: Gør ingenting. ✓ n. • n linier: Antag reverse(input) udskriver de sidste n-1 linier i omvendt rækkefølge. Så udskrives de n-1 sidste linier i omvendt rækkefølge først og • Induktionsskridt. Antag at udsagnet gælder for alle heltal mindre end n, og bagefter udskrives den første linie. brug dettte til at vise det er sandt for n. ✓ Tuesday, February 23, 2010 17 Tuesday, February 23, 2010 18 Eksempel Største fælles divisor (gcd) public static void reverse(Scanner input){ • gcd(p,q). Find største heltal der går op i begge tal. if (input.hasNextLine()) { String line = input.nextLine(); • Eksempel. gcd(4032,1272) = 24. reverse(input); System.out.println(line); 4032 = 26 × 32 × 71 } 1272 = 23 × 31 × 531 } gcd = 23 × 31 = 24 • Køretid T(n) • Anvendelser Hvert rekursivt kald tager worst-case O(1) tid T(n) = O(n). • Simple brøker = 1272/4032 = 53/168 • RSA kryptografisystem Tuesday, February 23, 2010 19 Tuesday, February 23, 2010 20
    • Største fælles divisor Største fælles divisor • gcd(p,q). Find største heltal der går op i både p og q. • gcd(p,q). Find største heltal der går op i både p og q. • Euclids algoritme. • Euclids algoritme. p if q = 0 ← Basistilfælde p if q = 0 ← Basistilfælde gcd(p, q) = gcd(p, q) = gcd(q, p % q) otherwise ← Rekursionsskridt gcd(q, p % q) otherwise ← Rekursionsskridt Konvergerer mod basistilfældet. Konvergerer mod basistilfældet. gcd(4032, 1272) = gcd(1272, 216) 4032 = 3 × 1272 + 216 p = gcd(216, 192) q q p%q % = gcd(192, 24) = gcd(24, 0) x x x x x x x x = 24. gcd(p,q) = x, p = 8x, q = 3x Tuesday, February 23, 2010 21 Tuesday, February 23, 2010 22 Største fælles divisor Towers of Hanoi • gcd(p,q). Find største heltal der går op i både p og q. • Ryk alle plader fra den venstre pind til den højre pind. • Kun tilladt at rykke én plade ad gangen. p if q = 0 ← Basistilfælde gcd(p, q) = gcd(q, p % q) otherwise ← Rekursionsskridt • En plade kan enten placeres på en tom pind eller ovenpå en større plade. • Pseudokode gcd(p,q) { start slut if (q = 0) return p; ← Basistilfælde else return gcd(q,p % q); ← Rekursionsskridt • Legende: Verdens ende når en gruppe af munke er færdige med at flytte pladerne i et tempel med 64 guldplader på 3 diamantnåle. } • http://mazeworks.com/hanoi/index.htm Tuesday, February 23, 2010 23 Tuesday, February 23, 2010 24
    • Towers of Hanoi: Rekursiv løsning Towers of Hanoi: Rekursiv løsning • TowersOfHanoi(n, left) udskriver de flytninger der skal til for at rykke n plader til venstre (hvis left = true) eller til højre (hvis left = false). TowersOfHanoi(n, left){ if (n=0) return; // Basistilfælde TowersOfHanoi(n-1, !left) Ryk n-1 øverste til modsat side if (left) print(n + “ left”) Ryk største til else print(n + “ right”) ønskede sted. TowersOfHanoi(n-1, !left) Ryk n-1 ovenpå den største } Tuesday, February 23, 2010 25 Tuesday, February 23, 2010 26 Towers of Hanoi: Rekursiv løsning Towers of Hanoi: Rekursiv løsning • TowersOfHanoi(n, left) udskriver de flytninger der skal til for at rykke n plader • Antal flytninger: T(n) = 2·T(n-1) + 1 til venstre (hvis left = true) eller til højre (hvis left = false). • T(1) = 1, T(2) = 3, T(3) = 7, T(4) = 15 TowersOfHanoi(n, left){ • T(n) = 2n - 1 if (n=0) return; // Basistilfælde TowersOfHanoi(n-1, !left) Ryk n-1 øverste til modsat side • Bevis: if (left) print(n + “ left”) Ryk største til ønskede sted. • Hjælpefunktion U(n): U(n) = T(n) + 1 else print(n + “ right”) TowersOfHanoi(n-1, !left) Ryk n-1 ovenpå den • U(0) = T(0) +1 = 1 største } • U(n) = T(n) + 1 = (2·T(n-1) + 1) + 1 = 2·T(n-1) + 2 = 2·U(n-1) • U(n) = 2n • T(n) = U(n) -1 = 2n - 1 • Antal flytninger. T(n) = 2·T(n-1) + 1 Tuesday, February 23, 2010 27 Tuesday, February 23, 2010 28
    • Towers of Hanoi: Rekursiv løsning Towers of Hanoi: Rekursiv løsning • Antal flytninger: T(n) = 2·T(n-1) + 1 = 2n - 1 • Antal flytninger: T(n) = 2n - 1 • For n = 64 tager det 585 milliarder år (hvis der rykkes en plade i sekundet). • Induktionsbevis: • Enhver løsning bruger mindst så mange skridt. • Basis tilfælde: T(0) = 20 - 1 = 0. • Køretiden af TowersOfHanoi: T(n) = 2·T(n-1) + O(1) = Θ(2n) • Induktionsskridt: • Pas på programmer der tager eksponentiel tid!!! • Antag T(n-1) = 2n-1 - 1. • T(n) = 2 · (2n-1 - 1) + 1 = 2n - 2 + 1 = 2n - 1. Tuesday, February 23, 2010 29 Tuesday, February 23, 2010 30 Sortering • Sortering. Givet n elementer, omarranger dem i ikke-faldende orden. • Oplagte anvendelser • Sorter en liste af navne, organiser et MP3 bibliotek, vis Google PageRank resultater, skriv RSS nyheder op i omvendt kronologisk orden. Mergesort • Nemme problemer for sorterede elementer • Find medianen, find nærmeste par, binær søgning i database, identificer statistiske “outliers”, find duplikater i mailingliste. • Ikke oplagte anvendelser • Datakompression, computergrafik, computational biology, anbefaling af bøger på Amazon. Tuesday, February 23, 2010 31 Tuesday, February 23, 2010 32
    • Mergesort Fletning • Mergesort • Mål. Kombiner to sorterede lister til én sorteret liste i lineær tid • Del tabellen i 2 halvdele. • Idé. • Sorter rekursivt hver del • Hold styr på mindste element i hver sorteret halvdel. • Flet de to halvdele sammen til én sorteret liste. Jon von Neumann (1945) • Indsæt mindste af de to elementer i en ekstra tabel. A L G O R I T H M S • Gentag indtil færdig. A L G O R I T H M S Del A G L O R H I M S T Sorter rekursivt A G H I L M O R S T Flet Tuesday, February 23, 2010 33 Tuesday, February 23, 2010 34 Fletning Fletning • Flet. • Flet. • Hold styr på mindste element i hver sorteret halvdel. • Hold styr på mindste element i hver sorteret halvdel. • Indsæt mindste af de to elementer i en ekstra tabel. • Indsæt mindste af de to elementer i en ekstra tabel. • Gentag indtil færdig. • Gentag indtil færdig. første halvdel anden halvdel mindste mindste udtømt udtømt A G L O R H I M S T A G L O R H I M S T A ekstra tabel A G H I L M O R S T ekstra tabel Tuesday, February 23, 2010 35 Tuesday, February 23, 2010 45
    • Mergesort Mergesort: Eksempel • A = < 5, 2, 4, 7, 1, 3, 2, 6 > Mergesort(A, low, hi){ 1 2 2 3 4 5 6 7 if (low < hi) then { flet mid = (hi + low)/2 2 4 5 7 1 2 3 6 L = Mergesort(A, low, mid) R = Mergesort(A, mid+1, hi) flet flet return Merge(L,R) 2 5 4 7 1 3 2 6 } } flet flet flet flet 5 2 4 7 1 3 2 6 Tuesday, February 23, 2010 46 Tuesday, February 23, 2010 47 Mergesort: Korrekthed Mergesort: Køretid • Påstand. Mergesort sorterer korrekt enhver tabel. • Analyse • Hvis n = 0, 1 eller 2: bruger vi konstant tid • Bevis: (induktion over n) • Hvis n > 2 bruger vi tid på • Basistilfælde. n=1. Allerede sorteret. • indeling af tabellen i 2 halvdele • Induktionsskridt. Antag at påstanden er sand for alle tabeller af størrelse mindre end n. • rekursivt kald på venstre og højre halvdel • fletning af de sorterede tabeller • Venstre og højre halvdel har begge størrelse mindre end n. • Rekursionsligning • det rekursive kald sorterer dem korrekt • T(n) ≤ 2T(n/2) + cn, for n > 2 og en konstant c. • Merge fletter de to sorterede tabeller korrekt. • T(2) ≤ c. Tuesday, February 23, 2010 48 Tuesday, February 23, 2010 49
    • Mergesort: rekursionsligningen Bevis: Rekursionstræ • Rekursionsligning • T(n) ≤ 2T(n/2) + cn, for n > 2 og en konstant c, og T(2) ≤ c. • T(n) ≤ 2T(n/2) + cn, for n > 2 og en konstant c. • Påstand. T(n) = O(n log n) T(n) cn • T(2) ≤ c. • Løsning T(n/2) T(n/2) 2(cn/2) • T(n) = O(n log n) T(n/4) T(n/4) T(n/4) T(n/4) 4(cn/4) • Forskellige beviser log2n ... • Rekursionstræ T(n / 2 )k 2k (cn / 2k) • Substitution/induktion ... T(2) T(2) T(2) T(2) T(2) T(2) T(2) T(2) cn/2 (2) cn log2n Tuesday, February 23, 2010 50 Tuesday, February 23, 2010 51 Bevis: Substitution Bevis: Substitution • Substitutionsmetoden. • T(n) ≤ 2T(n/2) + cn, for n > 2 og en konstant c, og T(2) ≤ c. • Påstand. T(n) = O(n log n) 1. Gæt på løsningen. 2. Brug matematisk induktion til at finde konstanterne og vise at løsningen • Bevis: (induktion over n). virker. • Basistilfælde: n = 2, cn log n = 2c ≥ T(2). • Induktionshypotese: T(m) ≤ cm log m for alle m < n. T(n) ≤ 2T(n/2) + cn ≤ 2c(n/2) log(n/2) + cn = cn(log n -1) + cn = cn log n - cn + cn = cn log n. Tuesday, February 23, 2010 52 Tuesday, February 23, 2010 53
    • Rekursion: faldgruber Rekursion: Q&A • Manglende basistilfælde • Er der situationer hvor iteration er den eneste mulige måde at angribe problemet på? • Ingen konvergens mod basistilfældet • Nej. Enhver løkke kan erstattes af en rekursiv funktion. • Overdrevent pladsforbrug • Er der situationer hvor rekursion er den eneste mulige måde at angribe problemet på? • Overdreven genberegning • Nej. Enhver rekursion kan erstattes af en tilsvarende iterativ metode. • Hvad bør jeg foretrække? • Det der giver den simpleste, nemmest forståelige og mest effektive algoritme (afhængigt af det konkrete problem). Tuesday, February 23, 2010 54 Tuesday, February 23, 2010 55 Opsummering • Rekursive algoritmer • Basistilfælde, rekursionsskridt Eksperimentiel Analyse af Programmer • Tæt knyttet til matematisk induktion. Philip Bille • Køretid: Rekursionstræ, substitutionsmetoden. • Del-og-hersk. Elegant løsning til mange vigtige problemer. • Mergesort: O(n log n) Tuesday, February 23, 2010 56 Tuesday, February 23, 2010 1
    • Plan Teoretisk vs. Eksperimentiel Analyse • Teoretisk vs. eksperimentiel analyse • Teoretisk analyse: • Den videnskabelige metode • Analysere algoritmer for at estimere antal operationer som funktion af input størrelse. • Bubblesort som eksempel • Forsimplet model af virkelighed • Kan kræve avanceret matematik • Eksperimentiel analyse: • Udføre eksperimenter for at måle køretid • Foregår i virkeligheden :-) • Nemt at gøre. Brug videnskabelig metode. Tuesday, February 23, 2010 2 Tuesday, February 23, 2010 3 Den Videnskabelige Metode Udfør og observer Indtil hypoteser og observation eksperimenter stemmer overens Den Videnskabelige Metode Verificer forudsigelse med nye Opstil hypoteser der passer eksperimenter med observationer Forudsig udfald af nye eksperimenter vha. af hypotese Tuesday, February 23, 2010 4 Tuesday, February 23, 2010 5
    • BubbleSort public static void bubbleSort(int[] A) { int tmp; for(int i = 1; i < A.length; i++) { for (int j = A.length - 1; j >= i; j--) { if(A[j] < A[j-1]) { Eksempel: BubbleSort tmp = A[j]; A[j] = A[j-1]; A[j-1] = tmp; } } } } Tuesday, February 23, 2010 6 Tuesday, February 23, 2010 7 BubbleSort Observer • Hvad ved vi om effektivitet af bubbleSort? n tid • Teori: Køretid for bubbleSort er cn2 (Θ(n2)) for konstant c > 0 10000 0.27 • Praksis: Hvordan passer den teoretiske køretid med praksis? 20000 1.40 • Er køretiden faktisk Θ(n2) for standard input (f. eks. tilfældige tal)? 40000 3.23 • Hvad er konstanten c? 80000 12.87 • Er der andre faktorer der har væsentlig betydning for praktisk køretid? 160000 51.38 320000 205.49 Tuesday, February 23, 2010 8 Tuesday, February 23, 2010 9
    • 300 Fordoblingshypotese 250 • Lad T(n) være tid for bubbleSort på tabel af størrelse n. 200 • Kig på forholdet mellem T(2n) og T(n). 150 • Hvis T(n) = cn2 har vi: T (2n) c(2n)2 c4n2 100 = 2 = =4 T (n) cn cn2 50 • Hypotese 1 (fordoblingshypothese): T(2n)/T(n) ≈ 4 -80 0 80 160 240 320 400 480 • Kunne ligne cn2 Tuesday, February 23, 2010 10 Tuesday, February 23, 2010 11 Fordoblingshypotese Forudsigelse og Verifikation n tid T(2n)/T(n) n tid T(2n)/T(n) 10000 0.27 10000 0.27 20000 1.40 5.18 20000 1.40 5.18 40000 3.23 2.31 40000 3.23 2.31 80000 12.87 3.98 80000 12.87 3.98 160000 51.38 3.99 160000 51.38 3.99 320000 205.49 4.00 320000 205.49 4.00 • Forudsigelse: T(640000) = 205.49 ⋅ 4 = 821.96 Ser ud til at konvergere mod 4 • Observation: T(640000) = 822.01 ! • Yderligere observationer verificerer fordoblingshypotese. • Overensstemmelse med hypotese og observationer :-) Tuesday, February 23, 2010 12 Tuesday, February 23, 2010 13
    • Målinger passer med 1/5 ⋅ n2 Hvad Med c? • Hvad nu hvis vi gerne vil finde konstanten c i køretid for cn2 for bubbleSort? 1000 • Metode: • Plot eksperimentielle målinger og tilpas c for kurve f(n) = cn2. 100 • Nemmest på dobbeltlogaritmisk skala da cnd bliver ret linie. 10 1 10 100 1000 10000 100000 1000000 10000000 Tuesday, February 23, 2010 14 Tuesday, February 23, 2010 15 Hypotese Klassifikation af Køretider • Hypotese 2: Køretid for bubbleSort er 1/5⋅n2 . • Kan ligeledes bruges til forudsigelse af køretider. Tuesday, February 23, 2010 16 Tuesday, February 23, 2010 17
    • Teoretisk vs. Eksperimentiel Analyse Resume • Eksperimentiel analyse: • Teoretisk vs. eksperimentiel analyse • Mål køretider, opstil hypoteser • Den videnskabelige metode • Nemt at udføre eksperimenter • Bubblesort som eksempel • Brugbar til at forudsige opførsel af programmer men ikke forklare • Fordoblingshypoteser • Bestemmelse af konstanter vha. dobbeltlogaritmisk plot • Teoretisk Analyse: • Analysere algoritmer for at estimere antal operationer som funktion af input størrelse. • Kan kræve avanceret matematik • Brugbar til at forudsige og forklare Tuesday, February 23, 2010 18 Tuesday, February 23, 2010 19
    • Uorienterede grafer • Uorienteret graf. G = (V, E) • V = knuder (eng. vertex eller node). • E = kanter mellem par af knuder (eng. edge). Basale definitioner og anvendelser V = { 1, 2, 3, 4, 5, 6, 7, 8 } E = { (1,2), (1,3), (2,3), (2,4), (2,5), (3,5), (3,7), (3,8), (4,5), (5,6), (7,8)} kant Thursday, March 4, 2010 3 Thursday, March 4, 2010 4 Uorienterede grafer Orienterede grafer • Uorienteret graf. G = (V, E) • Orienteret graf. G = (V, E) • V = knuder (eng. vertex eller node). • V = knuder. • E = kanter mellem par af knuder (eng. edge). • E = orienterede kanter mellem par af knuder. • Parametre for grafens størrelse: n = |V|, m= |E|. • Parametre for grafens størrelse: n = |V|, m= |E|. • Grad af knude v = #naboer til v = #kanter incidente til v: deg(v). • Udgrad af knude v = antal kanter fra v: deg+(v). knude med grad 2 • Indgrad af knude v: antal kanter til v: deg-(v). naboer 1 7 V = { 1, 2, 3, 4, 5, 6, 7, 8 } V = { 1, 2, 3, 4, 5, 6, 7, 8 } E = { (1,2), (1,3), (2,3), (2,4), (2,5), (3,5), (3,7), (3,8), (4,5), E = { (1,2), (2,3), (3,1), (4,2), (2,5), (5,3), (3,7), (8,3), (4,5), 2 3 (5,6), (7,8)} (6,5), (7,8)} n= 8 n=8 4 5 8 m = 11 m = 11 kant knude med grad 1 6 Thursday, March 4, 2010 5 Thursday, March 4, 2010 6
    • Eksempler på anvendelse af grafer Transport københavn - Google Maps 3/1/10 10:41 PM Adresse København • Transportnetværk/vejkort Graf Knuder Kanter • Knude: vejkryds transport vejkryds veje • Kant: veje transport flyruter lufthavne kommunikation computere optiske fiberkabler Internettet hjemmesider links sociale netværk mennesker forhold forsyningsnetværk elværk/huse ledninger madnetværk dyrearter rovdyr-byttedyr skedulering jobs afhængigheder kursusemner emner afhængigheder Thursday, March 4, 2010 7 Thursday, March 4, 2010 8 TouchGraph Google Browser 3/1/10 10 Internet Relaterede hjemmesider Edit Zoom: View Tools Display Spacing: • Webgrafen • Netværk: sammenhænge mellem hjemmesider • Knude: hjemmeside rapporteret af Googles • Kant: hyperlink database for relaterede cnn.com hjemmesider. • Knude: hjemmeside netscape.com novell.com cnnsi.com timewarner.com • Kant: sammenhæng hbo.com sorpranos.com Thursday, March 4, 2010 9 Thursday, March 4, 2010 10
    • Sociale netværk Fylogenetiske træer • Sociale netværk • Fylogenetiske træer. Beskriver evolution af arter Graph Connections 3/1/10 10:34 PM • Knuder: personer Graph Connections • Kanter: forhold i mellem personer The graph shows you your friends, the networks they belong to, and the social cliques they are part of. See who is central to a particular group and which friends are connectors between two groups. Reference: touchgraph.com Thursday, March 4, 2010 11 Thursday, March 4, 2010 12 2105 emner tabeller hægtede lister grafer implementation af GS-algoritmen stakke BFS/DFS orienterede grafer Repræsentation af grafer implementation af BFS topologisk sortering hashing træer køer Uorienterede grafer implementation af DFS binære søgetræer binær søgning Dijkstra korteste vej algoritme implementation af Dijkstra prioritetskø hob Thursday, March 4, 2010 13 Thursday, March 4, 2010 14
    • Repræsentation af grafer Repræsentation af grafer • Incidensmatrix (adjancency matrix). n × n matrice med A[u,v] = 1 hvis (u,v) er • Incidensliste (adjancency list). Knudeindekseret tabel af lister. en kant. • Hver kant repræsenteret 2 gange. • Hver kant repræsenteret 2 gange. • Pladsforbrug: Θ(n + m) • Pladsforbrug: Θ(n2) • Θ(deg(u)) tid for at checke om (u,v) er en kant. • Θ(1) tid for at checke om (u,v) er en kant. • Θ(m+n) tid for at identificere alle kanter. • Θ(n2) tid for at identificere alle kanter. 1 2 3 4 5 6 7 8 1 2 3 1 0 1 1 0 0 0 0 0 2 1 3 4 5 2 1 0 1 1 1 0 0 0 3 1 1 0 0 1 0 1 1 3 1 2 5 7 8 4 0 1 0 0 1 0 0 0 4 2 5 5 0 1 1 1 0 1 0 0 6 0 0 0 0 1 0 0 0 5 2 3 4 6 7 0 0 1 0 0 0 0 1 6 5 8 0 0 1 0 0 0 1 0 7 3 8 8 3 7 Thursday, March 4, 2010 15 Thursday, March 4, 2010 16 Stier og sammenhæng Stier og sammenhæng • Sti. Sekvens P af knuder v1, v2,..., vk-1, vk således at (vi, vi+1) ∈ E for alle • Sti. Sekvens P af knuder v1, v2,..., vk-1, vk således at (vi, vi+1) ∈ E for alle i=1,...,k-1. i=1,...,k-1. • Simpel sti. Sti hvor hver knude højst forekommer én gang. Sti: 1,2,4,5,2 Sti: 1,2,4,5,2 Simpel sti: 1,3,7,8 Thursday, March 4, 2010 17 Thursday, March 4, 2010 18
    • Stier og sammenhæng Kredse/cykler • Sti. Sekvens P af knuder v1, v2,..., vk-1, vk således at (vi, vi+1) ∈ E for alle • Kreds (cykel). Sti v1, v2,..., vk-1, vk, hvor v1 = vk og de første k-1 knuder er i=1,...,k-1. forskellige. • Simpel sti. Sti hvor hver knude højst forekommer én gang. • Længde af en sti. Antal kanter på stien. (længde af P= v1, v2,..., vk-1, vk er k-1). • Sammenhængende. En uorienteret graf er sammenhængende hvis der for alle par af knuder u og v findes en sti imellem u og v. Sti: 1,2,4,5,2 Simpel sti: 1,3,7,8 kreds C = 1-2-4-5-3-1 Thursday, March 4, 2010 19 Thursday, March 4, 2010 20 Egenskab Træer • For enhver graf G=(V, E) gælder • Træ. En uorienteret sammenhængende graf der ikke indeholder nogle kredse. deg(v) = 2m • Sætning. I et træ er ethvert par af knuder forbundet via én unik simpel sti. v∈V • Bevis. Hvor mange gange tælles hver kant (u, v) i summen: • 2 gange. 1 gang for deg(u) og en gang for deg(v). Thursday, March 4, 2010 21 Thursday, March 4, 2010 22
    • Træer Træer • Træ. En uorienteret sammenhængende graf der ikke indeholder nogle kredse. • Træ. En uorienteret sammenhængende graf der ikke indeholder nogle kredse. • Sætning. I et træ er ethvert par af knuder forbundet via én unik simpel sti. • Sætning. Et træ har n-1 kanter. • Bevis. Modbevis. • Antag der er 2 forskellige stier mellem u og v. • x sidste knude to stier har tilfælles inden de bliver forskellige. • y første knude de to stier har tilfælles efter de har været forskellige. • Lad P1 og P2 være de to forskellige stier fra x til y. • P1 og P2 udgør en kreds. P1 v x y u P2 Thursday, March 4, 2010 23 Thursday, March 4, 2010 24 Træer Træer • Sætning. Et træ har n-1 kanter. • Sætning. Et træ har n-1 kanter. • Bevis. Induktion. • Bevis. Induktion. • n = 1: • n = 1: Ingen kanter. • n > 1: Antag det gælder for n’ < n. • n > 1: Antag det gælder for n’ < n. • Fjern en kant (u,v) ? • Fjern en kant (u,v) grafen deles i 2 (ødelagt unik sti ml. u og v). • Brug induktionshypotesen • Brug induktionshypotesen på de to dele: • m = m1 + m2 + 1 = (n1 -1)+ (n2 -1) +1 = n1 + n2 - 1 Thursday, March 4, 2010 25 Thursday, March 4, 2010 26
    • Træer Rodfæstede træer • Træ. En uorienteret sammenhængende graf der ikke indeholder nogle kredse. • Rodfæstet træ. Træ T med en rodknude r, hvor alle kanter er orienteret væk fra roden. • Egenskaber. • Vigtighed. Modellerer hierakisk struktur. • m = n-1 • Unik simpel sti mellem ethvert par af knuder. • mindst 2 knuder har grad 1. • Hvis der tilføjes en kant laves en kreds. • Hvis der fjernes en kant bliver grafen usammenhængende. et træ samme træ rodfæstet i knude 1 Thursday, March 4, 2010 27 Thursday, March 4, 2010 28 Rodfæstede træer Skov • rod r. Alle kanter orienteret væk fra r. • Skov. Graf hvor alle sammenhængskomponenter er træer. • For enhver knude v: • forælder til v. Knude umiddelbart før v på stien fra r til v. 1 11 16 • barn af v. Knude w er barn af v, hvis v er forælder til w. 2 6 12 • forfader til v. Knude før v på stien fra r til v. 17 • efterkommer af v. w er efterkommer af v, hvis v er forfader til w. 3 7 8 10 13 15 • blad. v er et blad hvis v ikke har nogle efterkommere. 1 4 5 9 14 2 6 3 7 8 10 4 5 9 Thursday, March 4, 2010 29 Thursday, March 4, 2010 30
    • Komplet graf Opgave • Komplet graf. Graf G=(V, E), hvor der er en kant mellem ethvert par af knuder. • Modeller følgende problem som en graf. • Kn. Den komplette graf med n knuder. Du er konsulent for langtursbusfirmaet "Blåhundebusserne" der ønsker at lave en hjemmeside hvor folk kan finde og bestille deres rejse. Man skal 1 kunne søge på den rejse med færrest antal omstigninger (busskift) mellem to valgfrie destinationer. Der er S forskellige stoppesteder/ stationer og B forskellige busruter. For hver busrute kender du startsted 2 5 og destination. En bus stopper ikke undervejs, men kører direkte fra startsted til destination. Du skal ikke tage hensyn til tidspunkt for afgang og ankomst i denne opgave. 3 4 K5 Thursday, March 4, 2010 31 Thursday, March 4, 2010 32 Sammenhængskomponenter • Sammenhængskomponenter. Find alle knuder der kan nås fra s. Sammenhængskomponenter • Sammenhængskomponent indeholdende knude 1 = {1, 2, 3, 4, 5, 6, 7, 8}. Thursday, March 4, 2010 33 Thursday, March 4, 2010 34
    • Sammenhængskomponenter Udfyldning (Flood fill) • Sætning. For ethvert par af knuder u og v i en graf er deres • Farveudfyldning. Skift farve til blå på hele det sammenhængende område sammenhængskomponenter enten ens eller disjunkte. med lysegrønne pixels i et billede. • Knude: pixel • Bevis. • Kant: nabo pixels med samme farve (her lysegrøn) • Sti mellem u og v samme sammenhængskomponent: • Sammenhængende område: sammenhængskomponent af grønne pixels. • sti u → w sti v → u→ w Skift farve til blå • Ingen sti mellem u og v ingen knude kan være i begge sammenhængskomponenter. • sti u → w og sti v → w sti u → w → v. Thursday, March 4, 2010 35 Thursday, March 4, 2010 36 Udfyldning (Flood fill) Sammenhængskomponenter • Farveudfyldning. Skift farve til blå på hele det sammenhængende område • Sammenhængskomponenter. Find alle knuder der kan nås fra s. med lysegrønne pixels i et billede. • Generel algoritme. • Knude: pixel R ConnectedComponent(s) s • Kant: nabo pixels med samme farve (her lysegrøn) R = {S} • Sammenhængende område: sammenhængskomponent af grønne pixels. while der er en kant (u,v) hvor u ∈ R og v ∉ R u v R = R ∪ {v} Skift farve til blå • Korrekthed. Ved terminering er mængden R er lig sammenhængs- komponenten der indeholder s. • BFS(s) og DFS(s) • Finder sammenhængskomponenten indeholdende s. • Besøger/ordner knuderne i R på forskellige måder. Thursday, March 4, 2010 37 Thursday, March 4, 2010 38
    • Dybde Først Søgning (DFS) DFS eksempel • Intuition. Udforsk ud fra s i én retning. Fortsæt indtil du når til en “blindgyde”. • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS Gå tilbage til sidste knude hvor der var flere uudforskede kanter og fortsæt på træet kanten (u,v). samme måde. • Eksempel. DFS(1) DFS(u) 1 7 Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E if Udforsket[v] = false DFS(u) 2 3 then DFS(v) Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E if Udforsket[v] = false 4 5 8 • DFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS then DFS(v) træet kanten (u,v). 6 Thursday, March 4, 2010 39 Thursday, March 4, 2010 40 DFS træer • Egenskaber ved DFS træer. Lad T være et DFS træ for en graf G. 1. For et givet rekursivt kald DFS(v): alle knuder markeret som udforsket mellem starten og slutningen af dette kald er efterkommere af v i T. 2. Hvis (u,v) ∈ E(G) og (u,v) ∉ E(T): Enten u eller v er en efterkommer af den anden. Sammenhængende delgraf og korteste vej • Bevis for at 1 2. • Antag u opdaget før v. • Når u opdages kaldes DFS(u) • v ikke er opdaget Udforsket[v]=false ved starten af kaldet. • Udforsket[v] = true i løbet af kaldet da der er en kant (u,v). Thursday, March 4, 2010 41 Thursday, March 4, 2010 42
    • Sammenhæng og korteste vej Korteste vej • s-t sammenhængsproblemet. Givet to knuder s og t, er der en sti fra s til t? • Eksempel. Find korteste vej fra s til alle andre knuder i nedenstående graf. • s-t korteste vej problemet. Givet 2 knuder s og t, hvad er længden af den S 10 korteste sti fra s til t? • Anvendelser 1 2 7 • LinkedIn • færrest antal stop på busrejse. 5 3 • færrest antal hop i kommunikationsnetværk. 4 8 9 6 Thursday, March 4, 2010 43 Thursday, March 4, 2010 44 Korteste vej Korteste vej • Eksempel. Find korteste vej fra s til alle andre knuder i nedenstående graf. • Eksempel. Find korteste vej fra s til alle andre knuder i nedenstående graf. S 10 1 S 10 1 1 1 2 1 7 2 1 1 2 1 7 2 2 2 5 5 1 3 1 3 4 4 8 2 8 2 2 2 9 3 9 3 2 6 2 6 Thursday, March 4, 2010 45 Thursday, March 4, 2010 46
    • Bredde Først Søgning (BFS) BFS • Intuition. Udforsk ud fra s i alle mulige retninger, ét lag knuder ad gangen. • Sætning. For ethvert i består Li af alle knuder der har afstand i fra s. Der er en sti fra s til t hvis der findes et i så t ∈ Li. • BFS algoritme. • Bevis. Induktion. • L0 = {s}. s L1 L2 L n-1 • i = 0. L0 = {s}. ✓ • L1 = alle naboer til L0. • i > 0. Induktionsypotese: gælder for Li-1. • L2 = alle naboer til knuder i L1 der ikke er i L0 eller L1. • Li består af knuder der har en nabo i Li-1 og ikke tilhører Li, j < i. • Li+1 = alle naboer til knuder i Li der ikke er i Lj, for j ≤ i. • For v ∈ Li: Sti fra s til u ∈ Li-1 og kant (u,v) v har afstand i til s. • Sætning. For ethvert i består Li af alle knuder der har afstand i fra s. Der er en sti fra s til t hvis der findes et i så t ∈ Li. Thursday, March 4, 2010 47 Thursday, March 4, 2010 48 BFS træ BFS-træ og DFS-træ • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af • Eksempel. Tegn BFS-træet og DFS-træet når startknuden er S. I DFS algoritmen via en kant fra knude u. besøges knuderne i stigende orden. 10 • Eksempel. BFS(1) S 1 7 1 2 7 2 3 5 3 4 4 5 8 8 6 9 6 Thursday, March 4, 2010 49 Thursday, March 4, 2010 50
    • BFS-træ og DFS-træ BFS-træ og DFS-træ • Eksempel. Tegn BFS-træet og DFS-træet når startknuden er S. Naboer til en • Eksempel. Tegn BFS-træet og DFS-træet når startknuden er S. Naboer til en knude besøges i stigende orden. knude besøges i stigende orden. S 10 S 10 1 2 7 1 2 7 5 5 4 3 4 3 8 8 9 9 6 6 Thursday, March 4, 2010 51 Thursday, March 4, 2010 52 BFS Sammenhængskomponenter • Egenskab. Lad T være et BFS træ for en graf G og lad (x,y) være en kant i G, • Find alle sammenhængskomponenter. således at x ∈ Li og y ∈ Lj. Så er forskellen på i og j højst 1. • Start med en knude v og brug BFS eller DFS til at finde dens sammenhængskomponent. • Bevis. • Find en knude der ikke er besøgt endnu og find dennes • Antag i ≤ j. sammenhængskomponent vha. BFS eller DFS. • Lk = {alle knuder i afstand k fra s} • Fortsæt indtil alle knuder er besøgt. • Korteste vej fra s til x = i korteste vej fra s til y ≤ i+1 y ∈ Li+1 x y s Thursday, March 4, 2010 53 Thursday, March 4, 2010 54
    • Todelte grafer (bipartite graphs) • Todelt graf: en uorienteret graf er todelt <=> knuderne kan farves røde eller blå således at alle kanter har et rødt endepunkt og et blåt endepunkt. • Anvendelser. Check om en graf er todelt (bipartite) • stabil matching: mænd = røde, kvinder = blå. Anvendelse af BFS • skedulering: maskiner = røde, jobs = blå. Thursday, March 4, 2010 55 Thursday, March 4, 2010 56 Test af todelthed (bipartiteness) Obstruktion af todelthed • Test af todelthed. Er en givet graf G todelt? • Lemma. Graf G er todelt <=> G indeholder ingen kreds af ulige længde • Mange grafproblemer bliver • Bevis. Ikke muligt at 2-farve den ulige kreds. • nemmere hvis den underliggende graf er todelt • mulige at løse effektivt v2 v3 v2 v1 Er G todelt? v4 v6 v5 v4 v3 v5 todelt ikke todelt v7 v1 v6 (kan 2-farves) (kan ikke 2-farves) v7 G Thursday, March 4, 2010 57 Thursday, March 4, 2010 58
    • Test af todelthed vha BFS Test af todelthed vha BFS • Lemma. Lad G være en sammenhængende graf, og lad L0, L1,......, Lk være • Lemma. Lad G være en sammenhængende graf, og lad L0, L1,......, Lk være lagene produceret af BFS startende i knude s. Præcis én af følgende holder: lagene produceret af BFS startende i knude s. Præcis én af følgende holder: 1. Ingen kant fra G forbinder 2 knuder i samme lag => G er todelt. 1. Ingen kant fra G forbinder 2 knuder i samme lag => G er todelt. 2.En kant forbinder 2 knuder i samme lag => G indeholder en ulige kreds => 2.En kant forbinder 2 knuder i samme lag => G indeholder en ulige kreds => G ikke todelt. G ikke todelt. L1 L2 L3 L1 L2 L3 tilfælde 1 tilfælde 1 Thursday, March 4, 2010 59 Thursday, March 4, 2010 60 Test af todelthed vha BFS Test af todelthed vha BFS • Lemma. Lad G være en sammenhængende graf, og lad L0, L1,......, Lk være • Lemma. Lad G være en sammenhængende graf, og lad L0, L1,......, Lk være lagene produceret af BFS startende i knude s. Præcis én af følgende holder: lagene produceret af BFS startende i knude s. Præcis én af følgende holder: 1. Ingen kant fra G forbinder 2 knuder i samme lag => G er todelt. 1. Ingen kant fra G forbinder 2 knuder i samme lag => G er todelt. 2.En kant forbinder 2 knuder i samme lag => G indeholder en ulige kreds => 2.En kant forbinder 2 knuder i samme lag => G indeholder en ulige kreds => G ikke todelt. G ikke todelt. L1 L2 L3 L1 L2 L3 L1 L2 L3 L1 L2 L3 tilfælde 1 tilfælde 2 tilfælde 1 tilfælde 2 Thursday, March 4, 2010 61 Thursday, March 4, 2010 62
    • Opsummering Hjemmeopgave 2 • Grafer. Definition, repræsentation af grafer (incidensliste/matrix), eksempler på • Test. anvendelser. • Gentag testene flere gange for samme størrelse input og brug gennemsnittet. • Træer. Definition, egenskaber. • Lav dem på store input (hvis det kun tager 10 ms er usikkerheden for stor). • BFS/DFS. Algoritmer til gennemløb af grafer. BFS(s) finder korteste sti fra s. • Regler. • Sammenhængskomponenter. Definition, findes vha. BFS/DFS. • Læs samarbejdspolitikken! • Kopiering fra internettet ikke tilladt! • Todelte grafer. Kan checke om en graf er todelt cha BFS. Thursday, March 4, 2010 63 Thursday, March 4, 2010 64 BFS træ BFS træ • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af algoritmen via en kant fra knude u. algoritmen via en kant fra knude u. • Eksempel. BFS(1) 1 7 1 7 2 3 2 3 4 5 8 4 5 8 6 6
    • BFS træ BFS træ • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af algoritmen via en kant fra knude u. algoritmen via en kant fra knude u. • Eksempel. BFS(1) • Eksempel. BFS(1) 1 7 1 7 2 3 2 3 4 5 8 4 5 8 6 6 BFS træ BFS træ • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af algoritmen via en kant fra knude u. algoritmen via en kant fra knude u. • Eksempel. BFS(1) • Eksempel. BFS(1) 1 7 1 7 2 3 2 3 4 5 8 4 5 8 6 6
    • BFS træ BFS træ • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af algoritmen via en kant fra knude u. algoritmen via en kant fra knude u. • Eksempel. BFS(1) • Eksempel. BFS(1) 1 7 1 7 2 3 2 3 4 5 8 4 5 8 6 6 BFS træ BFS træ • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af • BFS træ. Kanten (u,v) er en del af BFS træet hvis knude v “opdages” af algoritmen via en kant fra knude u. algoritmen via en kant fra knude u. • Eksempel. BFS(1) • Eksempel. BFS(1) 1 7 1 7 2 3 2 3 4 5 8 4 5 8 6 6
    • DFS eksempel DFS eksempel • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS træet kanten (u,v). træet kanten (u,v). • Eksempel. DFS(1) • Eksempel. DFS(1) 1 7 1 7 DFS(u) 2 3 DFS(u) 2 3 Sæt Udforsket[u] = true Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E for alle kanter (u,v) ∈ E if Udforsket[v] = false if Udforsket[v] = false 4 5 8 4 5 8 then DFS(v) then DFS(v) 6 6 DFS eksempel DFS eksempel • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS træet kanten (u,v). træet kanten (u,v). • Eksempel. DFS(1) • Eksempel. DFS(1) 1 7 1 7 DFS(u) 2 3 DFS(u) 2 3 Sæt Udforsket[u] = true Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E for alle kanter (u,v) ∈ E if Udforsket[v] = false if Udforsket[v] = false 4 5 8 4 5 8 then DFS(v) then DFS(v) 6 6
    • DFS eksempel DFS eksempel • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS træet kanten (u,v). træet kanten (u,v). • Eksempel. DFS(1) • Eksempel. DFS(1) 1 7 1 7 DFS(u) 2 3 DFS(u) 2 3 Sæt Udforsket[u] = true Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E for alle kanter (u,v) ∈ E if Udforsket[v] = false if Udforsket[v] = false 4 5 8 4 5 8 then DFS(v) then DFS(v) 6 6 DFS eksempel DFS eksempel • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS træet kanten (u,v). træet kanten (u,v). • Eksempel. DFS(1) • Eksempel. DFS(1) 1 7 1 7 DFS(u) 2 3 DFS(u) 2 3 Sæt Udforsket[u] = true Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E for alle kanter (u,v) ∈ E if Udforsket[v] = false if Udforsket[v] = false 4 5 8 4 5 8 then DFS(v) then DFS(v) 6 6
    • DFS eksempel • BFS træ. Hvis DFS(v) kaldes i løbet af kaldet til DFS(u) så indeholder DFS træet kanten (u,v). • Eksempel. DFS(1) 1 7 Stakke og køer Implementation af BFS og DFS DFS(u) 2 3 Sæt Udforsket[u] = true for alle kanter (u,v) ∈ E if Udforsket[v] = false 4 5 8 then DFS(v) 6 Thursday, March 11, 2010 1 Dagens læringsmål • Efter denne forelæsning vil du være i stand til at • Forklare datastrukturerne stak og kø og kunne forklare forskellen. • Anvende en hægtet liste til at implementere køer og stakke, samt analysere asymptotisk pladsforbrug og køretid af denne implementation. • Anvende en tabel til at implementere køer og stakke, samt analysere asymptotisk pladsforbrug og køretid af denne implementation. Implementation af BFS og DFS • Sammenligne og analysere forskellige implementationer af køer og stakke. • Kunne anvende stakke og køer. • Anvende en passende datastruktur til effektiv implementation af BFS/DFS, same analysere køretiden. • Pensum. KT side 89-94. Thursday, March 11, 2010 2 Thursday, March 11, 2010 3
    • Bredde Først Søgning (BFS) Dybde Først Søgning (DFS) • Intuition. Udforsk ud fra s i alle mulige retninger, ét lag knuder ad gangen. • Intuition. Udforsk ud fra s i én retning. Fortsæt indtil du når til en “blindgyde”. Gå tilbage til sidste knude hvor der var flere uudforskede kanter og fortsæt på samme måde. • BFS algoritme. DFS(s) • L0 = {s}. s L1 L2 L n-1 Sæt Udforsket[s] = true for alle kanter (s,v) ∈ E • L1 = alle naboer til L0. if Udforsket[v] = false • L2 = alle naboer til knuder i L1 der ikke er i L0 eller L1. then DFS(v) • Li+1 = alle naboer til knuder i Li der ikke er i Lj, for j ≤ i. • Implementation. • Implementation. • Rekursivt. • Konstruer alle lister. • Iterativt: Én liste af knuder. Behandle sidst mødte knude først. • Én liste: Behandle knuderne i den rækkefølge vi møder dem. Thursday, March 11, 2010 4 Thursday, March 11, 2010 5 Implementation af BFS og DFS Stakke og køer • BFS • Fundamentale datastrukturer • Konstruere alle listerne Li • Værdier: mængde af objecter. • Behandle knuderne i samme rækkefølge som vi møder dem • Operationer: indsæt, slet, check om tom. • DFS • Stak. Fjern det element der er tilføjet sidst. LIFO= “last in first out” • rekursivt • Analogi. Bakker i en kantine. push • Behandle den knude vi sidst har mødt, men ikke behandlet endnu pop • Hvilke datastrukturer skal vi bruge til at holde styr på knuderne? • Kø. Fjern det element der blev tilføjet først. FIFO= “first in first out” • Analogi. Kø ved kassen i en butik. enqueue dequeue Thursday, March 11, 2010 6 Thursday, March 11, 2010 7
    • Stakke • push(S,x). Indsæt et nyt element x i S. • pop(S). Fjern og returner det sidst tilføjede element i S. Stakke • isEmpty(). Returner true hvis S er tom. Thursday, March 11, 2010 8 Thursday, March 11, 2010 9 Stak: Implementation med hægtet liste Stak: Implementation med hægtet lister • Enkelthægtet liste S. • Køretid. push, pop og is Empty tager konstant tid. • S har pointer “S.first” til første element. • Pladsforbrug. Proportional til antal elementer på stakken: Θ(n). • Hvert element e har en pointer “e.next” til næste element. push(S, x) { pop(S) { isEmpty(S) { push(S, x) { pop(S) { isEmpty(S) { oldfirst = S.first x = S.first if S.first = null oldfirst = S.first x = S.first if S.first = null S.first = x if (S.first != null) return true S.first = x if (S.first != null) return true S.first.next = oldfirst S.first = S.first.next else S.first.next = oldfirst S.first = S.first.next else } return x return false } return x return false } } } } Thursday, March 11, 2010 10 Thursday, March 11, 2010 11
    • Stak: Implementation med tabel Stak: Implementation med tabel • Implementation af stak S med tabel. • Køretid. push, pop og isEmpty tager konstant tid. • Tabel S af længde N. • Pladsforbrug. Proportionel til længden af tabellen: Θ(N). • Parameter top(S) der angiver indeks for sidste indsatte element. • Implementerer stak med højst N elementer. • Minus. Skal kende den maximale størrelse fra start. 14 2 3 push(S,5) 14 2 3 5 pop(S) 14 2 3 14 2 3 push(S,5) 14 2 3 5 pop(S) 14 2 3 top[S]=3 top[S]=4 top[S]=3 top[S]=3 top[S]=4 top[S]=3 push(S, x) { pop(S) { isEmpty(S) { push(S, x) { pop(S) { isEmpty(S) { if (top(S) = length[S]) if (isEmpty(S)) if top[S] = 0 if (top(S) = length[S]) if (isEmpty(S)) if top[S] = 0 then error “overflow” then error “underflow” return true then error “overflow” then error “underflow” return true else else else else else else top(S) = top(S)+1 top[S] = top[S]-1 return false top(S) = top(S)+1 top[S] = top[S]-1 return false S[top(S)] = x; return S[top(S)+1] } S[top(S)] = x; return S[top(S)+1] } } } } } Thursday, March 11, 2010 12 Thursday, March 11, 2010 13 DFS implementation med stak DFS eksempel • DFS(1) incidensliste i stigende orden incidensliste i faldende orden DFS(s) Sæt Udforsket[v] = false for alle v. Initialiser S til at være en tom stak. 1 7 1 7 push(S,s) while !isEmpty(S) u = pop(S) 2 3 2 3 if Udforsket[u] = false then Udforsket[u] = true for alle kanter (u,v) incidente til u 4 5 8 4 5 8 push(S,v) 6 6 Thursday, March 11, 2010 14 Thursday, March 11, 2010 15
    • DFS implementation med stak: Analyse • Køretid. O(n+m) • pop(S), push(S,v), isEmpty(S), Udforsket[v] =?: O(1) • Hvor mange gange kan en knude u puttes på stakken? én gang for hver incidente kant: deg(u). • Tid for at gennemløbe alle incidente kanter til en knude u: Køer O(deg(u)) tid hvis vi bruger incidenslister • Samlet tid: ∑u deg(u) = 2m. DFS(s) Sæt Udforsket[v] = false for alle v Initialiser S til at være en tom stak. push(S,s) while !isEmpty(S) u = pop(S) if Udforsket[u] = false then Udforsket[u] = true for alle kanter (u,v) incidente til u push(S,v) Thursday, March 11, 2010 16 Thursday, March 11, 2010 17 Køer Kø: Implementation med hægtet lister • enqueue(K,x). Indsæt et nyt element x i K. • Enkelthægtet liste K. • K har pointere “K.first” og “K.last” til første og sidste element. • dequeue(K). Fjern og returner det tidligst tilføjede af elementerne i K. • Hvert element e har en pointer “e.next” til næste element. • isEmpty(K). Returner true hvis K er tom. enqueue(K, x) { dequeue(K) { isEmpty(K) { oldlast = K.last x = K.first if K.first = null K.last = x if (K.first != null) return true K.last.next = null K.first = K.first.next else if (K.first = null) else return false K.first = K.last K.last = null; } else return x oldlast.next = K.last } } Thursday, March 11, 2010 18 Thursday, March 11, 2010 19
    • Kø: Implementation med hægtet lister Kø: Implementation med tabel • Køretid. enqueue, dequeue og isEmpty tager konstant tid. • Implementation af kø K med tabel. • Tabel K af længde N. • Pladsforbrug. Proportional til antal elementer i køen: Θ(n) • Parametre head(K) og tail(K) der angiver indeks for tidligst indsatte og senest indsatte element i K. • Parameter count(K) der angiver antal elementer i K. enqueue(K, x) { dequeue(K) { isEmpty(K) { oldlast = K.last x = K.first if K.first = null count(K)=4 count(K)=3 count(K)=2 K.last = x if (K.first != null) return true 14 2 3 7 dequeue(K) 14 2 3 7 dequeue(K) 14 2 3 7 K.last.next = null K.first = K.first.next else if (K.first = null) else return false tail(K) head(K) tail(K) head(K) tail(K) head(K) K.first = K.last K.last = null; } else return x oldlast.next = K.last } count(K)=3 count(K)=4 count(K)=3 } enqueue(K,4) 14 2 3 7 4 enqueue(K,9) 9 2 3 7 4 dequeue(K) 9 2 3 7 4 head(K) tail(K) tail(K) head(K) tail(K) head(K) Thursday, March 11, 2010 20 Thursday, March 11, 2010 21 Kø: Implementation med tabel Kø: Implementation med tabel • Implementation af kø K med tabel. • Køretid. enqueue, dequeue og isEmpty tager konstant tid. • Tabel K af længde N. • Parametre head(K) og tail(K) der angiver indeks for tidligst indsatte og • Pladsforbrug. Proportionel til længden af tabellen: Θ(N). senest indsatte element i S. • Parameter count(K) der angiver antal elementer i K. • Minus. Skal kende den maximale størrelse fra start. • Implementerer kø med højst N elementer. enqueue(K, x) { dequeue(K) { isEmpty(S) { enqueue(K, x) { dequeue(K) { isEmpty(S) { if count > length[K] if (isEmpty(K)) if count(S) = 0 if count > length[K] if (isEmpty(K)) if count(S) = 0 then error “overflow” then error “underflow” return true then error “overflow” then error “underflow” return true if tail(K)= length[K] x = K[head(K)] else if tail(K)= length[K] x = K[head(K)] else then tail(K) = 1 count(S) = count(S)-1 return false then tail(K) = 1 count(S) = count(S)-1 return false else tail(K) = tail(K) +1 if head(K) = length[K] } else tail(K) = tail(K) +1 if head(K) = length[K] } S[tail(K)] = x then head(K) = 1 S[tail(K)] = x then head(K) = 1 count(S) = count(S)+1 else head(K) = head(K)+1 count(S) = count(S)+1 else head(K) = head(K)+1 } return x } return x } } Thursday, March 11, 2010 22 Thursday, March 11, 2010 23
    • BFS implementation BFS implementation: Analyse • Køretid. O(n+m) • dequeue(K), enqueue(K,v), isEmpty(K), Opdaget[v] =?: O(1) BFS(s) • Hvor mange gange kan en knude u lægges i køen? Sæt Opdaget[s] = true og Opdaget[v] = false for alle v ≠ s Initialiser en tom kø K én gang enqueue(K,s) • Tid for at gennemløbe alle incidente kanter til en knude u: while !isEmpty(K) u = dequeue(K) O(deg(u)) tid hvis vi bruger incidenslister for alle kanter (u,v) incidente til u • Samlet tid: BFS(s) if Opdaget[v] = false ∑u deg(u) = 2m. Sæt Opdaget[s] = true og Opdaget[v] = false for alle v ≠ s then Initialiser en tom kø K Opdaget[v] = true enqueue(K,s) enqueue(K,v) while !isEmpty(K) u = dequeue(K) for alle kanter (u,v) incidente til u if Opdaget[v] = false then Opdaget[v] = true enqueue(K,v) Thursday, March 11, 2010 24 Thursday, March 11, 2010 75 Implementation af stakke • Hægtet liste. • push/pop/isEmpty: O(1) • pladsforbrug: Θ(n) Implementation af stakke • Tabel. Sammenligning af implementation med tabel og hægtet liste • push/pop/isEmpty: O(1) • pladsforbrug: Θ(N) hvor n er antal elementer i stakken og N er størrelsen af tabellen (n ≤ N). Thursday, March 11, 2010 76 Thursday, March 11, 2010 77
    • Implementation af stakke Stak: dynamisk tabel implementation • Hægtet liste. • Problem. Skal angive størrelse af tabellen fra start. • push/pop/isEmpty tager konstant tid. • Spørgsmål. Hvordan kan vi lade tabellen vokse og skrumpe? • bruger ekstra plads og tid til referencer/pointere. • Første forsøg. • push(S,x): Øg størrelsen af s[] med én. • Tabel. • pop(S): Mindsk størrelsen af s[] med én. • push/pop/isEmpty tager konstant tid. • maximale kapacitet skal sættes fra start af • For dyrt. • Implementation med tabel af varierende størrelse??? • Skal kopiere alle elementer over i en ny tabel hver gang. • Indsættelse af N elementer tager tid proportionelt med: 1 + 2 + ······ + n = Θ(n2). • Mål. Sikre at ændring af tabelstørrelsen ikke sker for tit. Thursday, March 11, 2010 78 Thursday, March 11, 2010 79 Stak: dynamisk tabel implementation Stak: dynamisk tabel implementation • Fordobling. Hvis tabellen er fuld kopieres elementerne over i en ny tabel af • Halvering. Hvis tabellen er kvart fuld kopieres elementerne over i en ny tabel dobbelt størrelse. af halv størrelse. • Konsekvens. Tabellen er altid mellem 25% og 100% fuld. • Konsekvens. Indsættelse af n elementer tager O(n) tid i alt: 1 + 2 + 4 + 8 + ···· + n/2 + n ~ 2n Thursday, March 11, 2010 80 Thursday, March 11, 2010 81
    • Stak: dynamisk tabel implementation Stak: Implementation med hægtet lister i Java public class StackofStrings { • Effektiv løsning. private Node first = null; • push: fordobl størrelsen når tabellen er fuld private class Node { String item; • pop: halver størrelsen når tabellen er 1/4 fuld. Node next; } public boolean isEmpty() { return first == null; • Tid og plads. } • Pladsforbrug. Tabellen altid 25-100% fuld: Θ(n) public void push(String item) { Node oldfirst = first; first = new Node(); • Tidsforbrug. push/pop tager worst case amortiseret O(1) tid (dvs. n first.item = item; first.next = oldfirst; operationer tager O(n) tid i alt). } public String pop() { if (isEmpty()) throw new RuntimeException(); String item = first.item; first = first.next; return item; } } Thursday, March 11, 2010 82 Thursday, March 11, 2010 83 Stak: Implementation med tabel i Java Implementation af stakke: pladsforbrug i Java public class StackofStrings { private String[] s; • Hægtet liste. ~ 16N bytes. private int top = 0; public StackofStrings(int capacity) { s = new String[capacity]; private class Node { 8 bytes overhead for object } String item; 4 bytes public boolean isEmpty() { Node next; 4 bytes return top == 0; } -------------------------------- } 16 bytes public void push(String item) { if (top == s.length) resize(2 * s.length); s[top++] = item; • Tabel med fordobling/halvering. Mellem ~4N (100% fuld) of ~16N (25% fuld) bytes. } public String pop() { public class DoublingStackofStrings { String item = s[--top]; s[top] = null; private String[] s; 4 bytes × størrelse af tabel if (top > 0 && top == s.length/4) resize(s.length/2); private int top = 0; 4 bytes return item; } public void resize(int capacity) { String[] dup = new String[capacity]; • Obs. Analysen inkluderer ikke pladsforbruget for indholdet af elementerne (items). for (int i = 0; i < top; i++) dup[i] = s[i]; s = dup; } } Thursday, March 11, 2010 84 Thursday, March 11, 2010 85
    • BFS: eksempel Opsummering - • Stakke A B C D • LIFO: Last in first out. • Implementeres med hægtet liste eller tabel. Alle operationer O(1) tid. • Køer E F G H • FIFO: First in first out. • Implementeres med hægtet liste eller tabel. Alle operationer O(1) tid. • BFS I • Køretid O(m+n) hvis der bruges incidenslister. • Implementeres med kø eller med liste for alle L • DFS • Køretid O(m+n) hvis der bruges incidenslister. start • Implementeres rekursivt eller med stak. FIFO Kø • OBS. Fordoblingsteknikken er ikke pensum. 25 Thursday, March 11, 2010 86 BFS: eksempel BFS: eksempel - - A B C D A B C D E F G H E F G H I I enqueue start knude start A dequeue næste knude Start A FIFO Kø FIFO Kø 26 27
    • BFS: eksempel BFS: eksempel - - A B C D A B C D E F G H E F G H I I Besøg A’s naboer start Besøg A’s naboer start FIFO Kø FIFO Kø 28 29 BFS: eksempel BFS: eksempel - - A A B C D A B C D E F G H E F G H I I Besøg A’s naboer start B opdaget start B FIFO Kø FIFO kø 29 30
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I I Besøg A’s naboer start B Besøg A’s naboer start B FIFO Kø FIFO Kø 31 31 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I I A A I opdaget start B I færdig med A start B I FIFO Kø FIFO Kø 32 33
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I I A A dequeue næste knude start B I Besøg B’s naboer start I FIFO Kø FIFO Kø 34 35 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I I A A Besøg B’s naboer start I Besøg B’s naboer start I FIFO Kø FIFO Kø 36 36
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H B B I I A A F opdaget start I F Besøg B’s naboer start I F FIFO Kø FIFO Kø 37 38 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H B B I I A A Besøg B’s naboer start I F A allerede opdaget start I F FIFO Kø FIFO Kø 38 39
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H B B I I A A færdig med B start I F dequeue næste knude start I F FIFO Kø FIFO Kø 40 41 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H B B I I A A Besøg I’s naboer start F Besøg I’s naboer start F FIFO Kø FIFO Kø 42 43
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H B B I I A A Besøg I’s naboer start F A allerede opdaget start F FIFO Kø FIFO Kø 43 44 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H B B I I A A Besøg I’s naboer start F Besøg I’s naboer start F FIFO Kø FIFO Kø 45 45
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I B I B I I A A E opdaget start F E Besøg I’s naboer start F E FIFO Kø FIFO Kø 46 47 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I B I B I I A A Besøg I’s naboer start F E F allerede opdaget start F E FIFO Kø FIFO Kø 47 48
    • BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I B I B I I A A I færdig start F E dequeue næste knude start F E FIFO Kø FIFO Kø 49 50 BFS: eksempel BFS: eksempel - A - A A B C D A B C D E F G H E F G H I B I B I I A A Besøg F’s naboer start E Besøg F’s naboer start E FIFO Kø FIFO Kø 51 51