Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

04slides

649 views

Published on

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

04slides

  1. 1. Rekursion og eksperimental analyse Tuesday, February 23, 2010 1
  2. 2. 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 • 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 2
  3. 3. Rekursion Tuesday, February 23, 2010 3
  4. 4. Rekursion • Iteration • Aktioner der skal gentages beskrives ved hjælp af en løkke. • Rekursion • Aktioner der skal gentages beskrives ved hjælp af en metode/algoritme der kalder sig selv. Tuesday, February 23, 2010 4
  5. 5. Rekursion: Skriv ord ud i omvendt rækkefølge • 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
  6. 6. Input: er line: er public static void reverse(Scanner input){ dette environment if (input.hasNextLine()) { String line = input.nextLine(); ikke reverse(input); sjovt System.out.println(line); } } Tuesday, February 23, 2010 6
  7. 7. Input: er line: er public static void reverse(Scanner input){ dette environment if (input.hasNextLine()) { String line = input.nextLine(); ikke reverse(input); sjovt line: dette System.out.println(line); public static void reverse(Scanner input){ } 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); } } Tuesday, February 23, 2010 10
  8. 8. Input: er line: er public static void reverse(Scanner input){ dette environment if (input.hasNextLine()) { String line = input.nextLine(); ikke reverse(input); sjovt System.out.println(line); } } Output: sjovt ikke dette er Tuesday, February 23, 2010 14
  9. 9. Rekursion • Basis-tilfælde. Simpelt/simple tilfælde der løses uden rekursivt kald • Rekursions-tilfælde/skridt. Reducerer til simplere problem der kan løses ved et (eller flere) rekursive kald. Tuesday, February 23, 2010 15
  10. 10. Eksempel public static void reverse(Scanner input){ if (input.hasNextLine()) { String line = input.nextLine(); reverse(input); System.out.println(line); } } • Basis-tilfælde. Gør ingenting. • Rekursions-tilfælde. reverse(input) Tuesday, February 23, 2010 16
  11. 11. Rekursion og induktion • Rekursion • Basis-tilfælde. Simpelt/simple tilfælde der løses uden rekursivt kald • Rekursions-tilfælde/skridt. Reducerer til simplere problem der kan løses ved et (eller flere) rekursive kald. • Induktion (over n) • Basis-tilfælde. Simpelt/simple tilfælde der bevises for specifikke værdier af n. • Induktionsskridt. Antag at udsagnet gælder for alle heltal mindre end n, og brug dettte til at vise det er sandt for n. Tuesday, February 23, 2010 17
  12. 12. Eksempel public static void reverse(Scanner input){ if (input.hasNextLine()) { String line = input.nextLine(); reverse(input); System.out.println(line); } } • Korrekthed • Tom linie: Gør ingenting. ✓ • 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 bagefter udskrives den første linie. ✓ Tuesday, February 23, 2010 18
  13. 13. Eksempel public static void reverse(Scanner input){ if (input.hasNextLine()) { String line = input.nextLine(); reverse(input); System.out.println(line); } } • Køretid T(n) Hvert rekursivt kald tager worst-case O(1) tid T(n) = O(n). Tuesday, February 23, 2010 19
  14. 14. Største fælles divisor (gcd) • gcd(p,q). Find største heltal der går op i begge tal. • Eksempel. gcd(4032,1272) = 24. 4032 = 26 × 32 × 71 1272 = 23 × 31 × 531 gcd = 23 × 31 = 24 • Anvendelser • Simple brøker = 1272/4032 = 53/168 • RSA kryptografisystem Tuesday, February 23, 2010 20
  15. 15. Største fælles divisor • gcd(p,q). Find største heltal der går op i både p og q. • Euclids algoritme. p if q = 0 ← Basistilfælde gcd(p, q) = gcd(q, p % q) otherwise ← Rekursionsskridt Konvergerer mod basistilfældet. gcd(4032, 1272) = gcd(1272, 216) 4032 = 3 × 1272 + 216 = gcd(216, 192) = gcd(192, 24) = gcd(24, 0) = 24. Tuesday, February 23, 2010 21
  16. 16. Største fælles divisor • gcd(p,q). Find største heltal der går op i både p og q. • Euclids algoritme. p if q = 0 ← Basistilfælde gcd(p, q) = gcd(q, p % q) otherwise ← Rekursionsskridt Konvergerer mod basistilfældet. p q q p%q x x x x x x x x gcd(p,q) = x, p = 8x, q = 3x Tuesday, February 23, 2010 22
  17. 17. Største fælles divisor • gcd(p,q). Find største heltal der går op i både p og q. p if q = 0 ← Basistilfælde gcd(p, q) = gcd(q, p % q) otherwise ← Rekursionsskridt • Pseudokode gcd(p,q) { if (q = 0) return p; ← Basistilfælde else return gcd(q,p % q); ← Rekursionsskridt } Tuesday, February 23, 2010 23
  18. 18. Towers of Hanoi • Ryk alle plader fra den venstre pind til den højre pind. • Kun tilladt at rykke én plade ad gangen. • En plade kan enten placeres på en tom pind eller ovenpå en større plade. start slut • 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 24
  19. 19. Towers of Hanoi: Rekursiv løsning Tuesday, February 23, 2010 25
  20. 20. 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 26
  21. 21. 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 } • Antal flytninger. T(n) = 2·T(n-1) + 1 Tuesday, February 23, 2010 27
  22. 22. Towers of Hanoi: Rekursiv løsning • Antal flytninger: T(n) = 2·T(n-1) + 1 • T(1) = 1, T(2) = 3, T(3) = 7, T(4) = 15 • T(n) = 2n - 1 • Bevis: • Hjælpefunktion U(n): U(n) = T(n) + 1 • U(0) = T(0) +1 = 1 • 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 Tuesday, February 23, 2010 28
  23. 23. Towers of Hanoi: Rekursiv løsning • Antal flytninger: T(n) = 2·T(n-1) + 1 = 2n - 1 • Induktionsbevis: • Basis tilfælde: T(0) = 20 - 1 = 0. • Induktionsskridt: • Antag T(n-1) = 2n-1 - 1. • T(n) = 2 · (2n-1 - 1) + 1 = 2n - 2 + 1 = 2n - 1. Tuesday, February 23, 2010 29
  24. 24. Towers of Hanoi: Rekursiv løsning • Antal flytninger: T(n) = 2n - 1 • For n = 64 tager det 585 milliarder år (hvis der rykkes en plade i sekundet). • Enhver løsning bruger mindst så mange skridt. • Køretiden af TowersOfHanoi: T(n) = 2·T(n-1) + O(1) = Θ(2n) • Pas på programmer der tager eksponentiel tid!!! Tuesday, February 23, 2010 30
  25. 25. Mergesort Tuesday, February 23, 2010 31
  26. 26. 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. • 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 32
  27. 27. Mergesort • Mergesort • Del tabellen i 2 halvdele. • Sorter rekursivt hver del • Flet de to halvdele sammen til én sorteret liste. Jon von Neumann (1945) A L G O R I T H M S 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
  28. 28. Fletning • Mål. Kombiner to sorterede lister til én sorteret liste i lineær tid • Idé. • Hold styr på mindste element i hver sorteret halvdel. • Indsæt mindste af de to elementer i en ekstra tabel. • Gentag indtil færdig. Tuesday, February 23, 2010 34
  29. 29. Fletning • Flet. • Hold styr på mindste element i hver sorteret halvdel. • Indsæt mindste af de to elementer i en ekstra tabel. • Gentag indtil færdig. mindste mindste A G L O R H I M S T A ekstra tabel Tuesday, February 23, 2010 35
  30. 30. Fletning • Flet. • Hold styr på mindste element i hver sorteret halvdel. • Indsæt mindste af de to elementer i en ekstra tabel. • Gentag indtil færdig. første halvdel anden halvdel udtømt udtømt A G L O R H I M S T A G H I L M O R S T ekstra tabel Tuesday, February 23, 2010 45
  31. 31. Mergesort Mergesort(A, low, hi){ if (low hi) then { mid = (hi + low)/2 L = Mergesort(A, low, mid) R = Mergesort(A, mid+1, hi) return Merge(L,R) } } Tuesday, February 23, 2010 46
  32. 32. Mergesort: Eksempel • A = 5, 2, 4, 7, 1, 3, 2, 6 1 2 2 3 4 5 6 7 flet 2 4 5 7 1 2 3 6 flet flet 2 5 4 7 1 3 2 6 flet flet flet flet 5 2 4 7 1 3 2 6 Tuesday, February 23, 2010 47
  33. 33. Mergesort: Korrekthed • Påstand. Mergesort sorterer korrekt enhver tabel. • Bevis: (induktion over n) • Basistilfælde. n=1. Allerede sorteret. • Induktionsskridt. Antag at påstanden er sand for alle tabeller af størrelse mindre end n. • Venstre og højre halvdel har begge størrelse mindre end n. • det rekursive kald sorterer dem korrekt • Merge fletter de to sorterede tabeller korrekt. Tuesday, February 23, 2010 48
  34. 34. Mergesort: Køretid • Analyse • Hvis n = 0, 1 eller 2: bruger vi konstant tid • Hvis n 2 bruger vi tid på • indeling af tabellen i 2 halvdele • rekursivt kald på venstre og højre halvdel • fletning af de sorterede tabeller • Rekursionsligning • T(n) ≤ 2T(n/2) + cn, for n 2 og en konstant c. • T(2) ≤ c. Tuesday, February 23, 2010 49
  35. 35. Mergesort: rekursionsligningen • Rekursionsligning • T(n) ≤ 2T(n/2) + cn, for n 2 og en konstant c. • T(2) ≤ c. • Løsning • T(n) = O(n log n) • Forskellige beviser • Rekursionstræ • Substitution/induktion Tuesday, February 23, 2010 50
  36. 36. Bevis: Rekursionstræ • 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) T(n) cn T(n/2) T(n/2) 2(cn/2) T(n/4) T(n/4) T(n/4) T(n/4) 4(cn/4) log2n ... T(n / 2k) 2k (cn / 2k) ... 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 51
  37. 37. Bevis: Substitution • Substitutionsmetoden. 1. Gæt på løsningen. 2. Brug matematisk induktion til at finde konstanterne og vise at løsningen virker. Tuesday, February 23, 2010 52
  38. 38. Bevis: Substitution • 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) • Bevis: (induktion over n). • 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 53
  39. 39. Rekursion: faldgruber • Manglende basistilfælde • Ingen konvergens mod basistilfældet • Overdrevent pladsforbrug • Overdreven genberegning Tuesday, February 23, 2010 54
  40. 40. Rekursion: QA • Er der situationer hvor iteration er den eneste mulige måde at angribe problemet på? • Nej. Enhver løkke kan erstattes af en rekursiv funktion. • Er der situationer hvor rekursion er den eneste mulige måde at angribe problemet på? • 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 55
  41. 41. Opsummering • Rekursive algoritmer • Basistilfælde, rekursionsskridt • Tæt knyttet til matematisk induktion. • Køretid: Rekursionstræ, substitutionsmetoden. • Del-og-hersk. Elegant løsning til mange vigtige problemer. • Mergesort: O(n log n) Tuesday, February 23, 2010 56
  42. 42. Eksperimentiel Analyse af Programmer Philip Bille Tuesday, February 23, 2010 1
  43. 43. Plan • Teoretisk vs. eksperimentiel analyse • Den videnskabelige metode • Bubblesort som eksempel Tuesday, February 23, 2010 2
  44. 44. Teoretisk vs. Eksperimentiel Analyse • Teoretisk analyse: • Analysere algoritmer for at estimere antal operationer som funktion af input størrelse. • 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 3
  45. 45. Den Videnskabelige Metode Tuesday, February 23, 2010 4
  46. 46. Den Videnskabelige Metode Udfør og observer Indtil hypoteser og observation eksperimenter stemmer overens Verificer forudsigelse med nye Opstil hypoteser der passer eksperimenter med observationer Forudsig udfald af nye eksperimenter vha. af hypotese Tuesday, February 23, 2010 5
  47. 47. Eksempel: BubbleSort Tuesday, February 23, 2010 6
  48. 48. 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]) { tmp = A[j]; A[j] = A[j-1]; A[j-1] = tmp; } } } } Tuesday, February 23, 2010 7
  49. 49. BubbleSort • Hvad ved vi om effektivitet af bubbleSort? • Teori: Køretid for bubbleSort er cn2 (Θ(n2)) for konstant c 0 • Praksis: Hvordan passer den teoretiske køretid med praksis? • Er køretiden faktisk Θ(n2) for standard input (f. eks. tilfældige tal)? • Hvad er konstanten c? • Er der andre faktorer der har væsentlig betydning for praktisk køretid? Tuesday, February 23, 2010 8
  50. 50. Observer n tid 10000 0.27 20000 1.40 40000 3.23 80000 12.87 160000 51.38 320000 205.49 Tuesday, February 23, 2010 9
  51. 51. 300 250 200 150 100 50 -80 0 80 160 240 320 400 480 • Kunne ligne cn2 Tuesday, February 23, 2010 10
  52. 52. Fordoblingshypotese • Lad T(n) være tid for bubbleSort på tabel af størrelse n. • Kig på forholdet mellem T(2n) og T(n). • Hvis T(n) = cn2 har vi: T (2n) c(2n)2 c4n2 = = =4 T (n) cn 2 cn 2 • Hypotese 1 (fordoblingshypothese): T(2n)/T(n) ≈ 4 Tuesday, February 23, 2010 11
  53. 53. Fordoblingshypotese n tid T(2n)/T(n) 10000 0.27 20000 1.40 5.18 40000 3.23 2.31 80000 12.87 3.98 160000 51.38 3.99 320000 205.49 4.00 Ser ud til at konvergere mod 4 Tuesday, February 23, 2010 12
  54. 54. Forudsigelse og Verifikation n tid T(2n)/T(n) 10000 0.27 20000 1.40 5.18 40000 3.23 2.31 80000 12.87 3.98 160000 51.38 3.99 320000 205.49 4.00 • Forudsigelse: T(640000) = 205.49 ⋅ 4 = 821.96 • Observation: T(640000) = 822.01 ! • Yderligere observationer verificerer fordoblingshypotese. • Overensstemmelse med hypotese og observationer :-) Tuesday, February 23, 2010 13
  55. 55. Hvad Med c? • Hvad nu hvis vi gerne vil finde konstanten c i køretid for cn2 for bubbleSort? • Metode: • Plot eksperimentielle målinger og tilpas c for kurve f(n) = cn2. • Nemmest på dobbeltlogaritmisk skala da cnd bliver ret linie. Tuesday, February 23, 2010 14
  56. 56. Målinger passer med 1/5 ⋅ n2 1000 100 10 1 10 100 1000 10000 100000 1000000 10000000 Tuesday, February 23, 2010 15
  57. 57. Hypotese • Hypotese 2: Køretid for bubbleSort er 1/5⋅n2 . • Kan ligeledes bruges til forudsigelse af køretider. Tuesday, February 23, 2010 16
  58. 58. Klassifikation af Køretider Tuesday, February 23, 2010 17
  59. 59. Teoretisk vs. Eksperimentiel Analyse • Eksperimentiel analyse: • Mål køretider, opstil hypoteser • Nemt at udføre eksperimenter • Brugbar til at forudsige opførsel af programmer men ikke forklare • 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
  60. 60. Resume • Teoretisk vs. eksperimentiel analyse • Den videnskabelige metode • Bubblesort som eksempel • Fordoblingshypoteser • Bestemmelse af konstanter vha. dobbeltlogaritmisk plot Tuesday, February 23, 2010 19

×