810 likes | 975 Views
Design, analyse og verifikation. Plan. Algoritmebegrebet Design Bevisteknikker Design ved hjælp at matematisk induktion • Analyse O-notation Logaritmer Binær søgning Verifikation Programpåstande Et eksempel.
E N D
Plan • Algoritmebegrebet • Design Bevisteknikker Design ved hjælp at matematisk induktion • • Analyse O-notation Logaritmer Binær søgning • Verifikation ProgrampåstandeEt eksempel
En algoritme er en fremgangsmåde til løsning af et problem Algoritme Uddata Inddata Hvad er en algoritme? • Bemærk. Det er ikke et krav, at en algoritme skal kunne udføres på en datamat! • Dette kursus omhandler dog mest algoritmer af denne type.
Tre vigtige områder: • Design • Analyse • Verifikation Design: Hvorledes konstrueres en algoritme? Analyse: Hvor “ressourcekrævende” er en algoritme? Verifikation: Er en algoritme korrekt?
Databegrebet • Data: • En formaliseret repræsentation af kendsgerninger eller forestillinger på en sådan form, at den kan kommunikeres eller omformes ved en eller anden proces. • Datalogi: • Læren om data, deres væsen og brug. • Datastruktur: • Den sammenhæng, der er imellem en række sammenhørende dataelementer.
Informationsbegrebet Information: Det betydningsindhold, et menneske tillægger data ud fra en vedtagen konvention. Informationsteknologi: Enhver form for teknologi, der anvendes til opsamling, behandling, lagring og formidling af data og information.
Hvad forstås ved en “god” algoritme? • (1) den løser problemet korrekt • (2) den er (tilstrækkelig) hurtig • (3) den kræver et (tilstrækkeligt) lille lagerforbrug • (4) den er simpel • De sidste tre krav kan ofte være i konflikt med hinanden.
Kraftigere computere medfører ønske om at løse større problemer Betydningen af effektive algoritmer • Hvorfor bekymre sig om effektivitet med dagens hurtige computere? Teknologi forbedrer hastigheden med en konstant faktor. Med godt algoritmedesign opnås ofte langt større hastighedsforbedringer. En dårlig algoritme på en supercomputer kan være langsommere end en god algoritme på en kugleramme. Antag at en algoritmes tidsforbrug er proportional med kvadratet på problemet størrelse (tid = k*n2, hvor k er en konstant, og n er problemstørrelsen). Med anskaffelsen af en ny computer med 10 gange så meget lager, kan der løses problemer, der er 10 gange så store. Men hvis den nye computer “kun” er 10 gange hurtigere, vil det tage 10 gange så lang tid at udføre algoritmen.
Algoritmebegrebet • Historie: Ordet “algoritme” er oprindelig afledt af “algorisme”: (i middelalderen) at udføre aritmetik med arabertal, i modsætning til “abacisme”: at udføre aritmetik med kugleramme. • Algorisme er igen afledt at navnet på en persisk forfatter af matematiklærebøger: Abu Ja´far Mohammed ibn Mûsâ al-Khowârizmî (cirka år 825).
Problem: Find den største fælles divisor for to givne positive heltal. Euklids algoritme • En af de første ikke-trivielle algoritmer blev designet af Euklid (græsk matematiker cirka 300 år f. Kr.) Den største fælles divisor for to positive heltal er det største heltal, der “går op” i begge tal (giver resten 0 ved division). Givet Løsning 24 og 32 8 og 12 7 og 8 8 4 1
Lad gcd(u,v) betegne største fælles divisor for u og v. Problemet kan da formuleres således: • Givet to heltal u ≥ 1 og v ≥ 1. Bestem gcd(u,v). • gcd betegner greatest common divisor Løsning af problemet er bl.a. relevant ved forkortelse af brøker: 24=24/gcd(24,32)=24/8=3 32 32/gcd(24,32) 32/8 4
d = u < v ? u : v; while (u % d != 0 || v % d != 0) d--; gcd = d; for (d = 1; d <= u; d++) if (u % d == 0 && v % d == 0) gcd = d; To simple algoritmer • En simpel algoritme er følgende (skrevet i Java): • En anden simpel algoritme er: Algoritmernes ineffektivitet er tydelig for store værdier af u og v, f.eks. 461952 og 116298 (hvor gcd er lig med 18).
Euklids algoritme • Euklid benyttede følgende observation til at opnå en mere effektiv algoritme: • Hvis u ≥ v, og d går op i både u og v, så går d også op i differensen imellem u og v. Hvis u > v, så gælder gcd(u,v) = gcd(u-v,v). Hvis u = v, så gælder gcd(u,v) = v [ = gcd(0,v) ] Hvis u < v, så udnyttes, at gcd(u,v) = gcd(v,u) [ u og v ombyttes ]
Euklids algoritme(version 1) • while (u > 0) { • if (u < v) • { int t = u; u = v; v = t; } • u = u - v; • } • gcd = v; Eksempel på kørsel: } u = 461952, v = 18 u = 461934, v = 18 u = 461916, v = 18 . . . u = 18 , v = 18 u = 0 , v = 18 461952/18 = 25664 iterationer
while (u > 0) { if (u < v) { int t = u; u = v; v = t; } u = u % v; } gcd = v; Euklids algoritme(version 2) • Kan effektiviteten forbedres? • Ja. Algoritmen trækker v fra u, indtil u bliver mindre end v. Men det er præcis det samme som at dividere u med v, og så sætte u lig med resten. Hvis u > v, så er gcd(u,v) = gcd(u%v,v). • Antallet af iterationer ved kørsel af eksemplet fra før reduceres til 1.
Udførelse af version 2 } • u = 461952, v = 116298 • u = 113058, v = 116298 • u = 3240, v = 113058 • u = 2898, v = 3240 • u = 342, v = 2898 • u = 162, v = 342 • u = 18, v = 162 • u = 0, v = 18 7 iterationer Algoritmen er meget effektiv, selv for store værdier af u og v. Hvor effektiv kan bestemmes ved algoritmeanalyse. antal iterationer ≤ 4.8 log10N - 0.32, gennemsnitligt antal iterationer ≈ 1.94 log10N
En alternativ algoritme • En velkendt metode til forkortelse af brøker: • Ethvert positivt heltal kan udtrykkes som et produkt af primfaktorer u = 2u2 .3u3 .5u5 .7u7 .11u11... = ∏ pupp primtal • Lad u og v være to heltal. Så kan gcd(u,v) bestemmes som ∏ pmin(up ,vp) .p primtal • Eksempel: u = 4400 = 24 . 52 . 70 . 111, v =7000 = 23 . 53 . 71 . 110 • gcd(u,v) = 23 . 52 . 70 . 110 = 23 . 52 = 8 . 25 = 200
Ulempe ved den alternative algoritme Der kendes i dag ingen effektiv metode til at opløse et tal i dets primfaktorer. Dette faktum udnyttes i dag i mange krypteringsalgoritmer (algoritmer til hemmeligholdelse af meddelelser).
Algoritmebegrebet(præcisering) • Ved en algoritme forstås en fremgangsmåde til løsning af et problem. Udover blot at være en sekvens af operationer skal en algoritme have følgende 4 egenskaber: • (1) Endelighed. Algoritmen skal terminere efter et endeligt antal skridt. • (2) Entydighed. Hvert skridt skal være defineret præcist og utvetydigt. • (3) Effektfuldhed. Hvert skridt skal kunne udføres på endelig tid. • (4) Korrekthed. Udførelse af algoritmen skal resultere i uddata, der opfylder en specificeret relation med de givne inddata.
En algoritme er en beregningsmetode, der for enhver beregningssekvensterminerer i et endeligt antal skridt. Matematisk definition af begrebet “algoritme” • En beregningsmetode er et tupel (Q, I, Ω, f), hvor Q er en mængde, der omfatter mængderne I og Ω, og f er en funktion fra Q på sig selv. Endvidere skal f(q) være lig med q for alle q i Ω. • Q repræsenterer mængden af beregningstilstande, I mængden af inddatatilstande, Ω mængden af uddatatilstande og f den beregningsmæssige regel. • Ethvert element x i I definerer en beregningssekvens x0 = x, xk+1 = f(xk) for k ≥ 0. • En beregningssekvens siges at terminere i k skridt, hvis k er det mindste heltal, for hvilket xk tilhører Ω.
Start nej u = v v = r r = u % v r = 0 ? ja Stop Notation for algoritmer • (1) Natursproglig beskrivelseE1. [Find rest] Divider u med v, og lad r betegne resten. E2. [Er den nul?] Hvis r = 0, så afslut algoritmen med v som svar. E3. [Ombyt] Sæt u lig med v, og v lig med r. Gå til trin E1. • (2) Rutediagram
while (true) { int r = u % v; if (r == 0) { gcd = v; break; } u = v; v = r; } eller while ((r = u % v) != 0) { u = v; v = r; } gcd = v; eller ved brug af rekursion int gcd(int u, int v) { return v == 0 ? u : gcd(v, u % v); } • (3) Programmeringssproglig beskrivelse, f.eks. i Java (eller en tilpasset delmængde heraf)
Antag at det givne teorem er falsk. Konkluder at dette vil føre til en modstrid. Bevisteknikker(relevant både ved design og verifikation) Bevisførelse ved modstrid (indirekte bevis). Teorem. Der findes uendeligt mange primtal. Bevis: Antag at der findes et endeligt antal primtal, p1, p2 , ..., pk. Betragt nu tallet N = p1 . p2 ... pk+1. N er større end pk. Men ingen af de kendte primtal går op i N (resten ved division er 1). Så N må være et primtal. Vi har dermed en modstrid, hvilket beviser sætningen.
Nogle personer står i en kø: Matematisk induktionuformel beskrivelse • Hvis (1) jeg kender den forreste person, og • (2) hvis jeg for enhver person, jeg kender i køen, også kender dennes efterfølger, • så kender jeg alle personer i køen. Også selv om køen er uendelig lang.
Matematisk induktionformel beskrivelse • Lad T være et teorem, der skal bevises, og lad T være udtrykt i termer af heltalsparameteren n. • Teoremet T gælder da for enhver værdi af n ≥ c, hvor c er en konstant, hvis følgende to betingelser er opfyldt: • 1. Basistilfældet: • T gælder for n = c, og • 2. Induktionsskridtet: • Hvis T gælder for n-1, så gælder T for n. Antagelsen i induktionsskridtet kaldes induktionshypotesen.
Eksempler på simpel induktion • Teorem: Summen S(n) af de første n naturlige tal er n(n+1)/2. • Bevis:(1) Basistilfældet. For n = 1 er S(1) =1, hvilket stemmer med formlen. • (2) Induktionsskridtet. Antag at sætningen gælder for n-1, dvs. S(n-1) = (n-1)n/2. • S(n) = S(n-1) + n = (n-1)n/2 + n = n(n+1)/2. • Dermed gælder sætningen også for n.
Teorem: Ethvert beløb ≥ 4 kroner kan veksles i et antal 2-kroner og et antal 5-kroner. • Bevis: (1) Basistilfældet. 4 kroner kan veksles ved hjælp af to 2-kroner. • (2) Induktionsskridtet. Antag at n-1 kroner kan veksles. Vi kan vise, at denne veksling kan benyttes som udgangspunkt til at veksle n kroner. • Enten indeholder vekslingen en 5-krone, eller også gør den det ikke. I første tilfælde erstattes 5-kronen med tre 2-kroner. I andet tilfælde erstattes to 2-kroner med en 5-krone.
Stærk induktion • Teoremet T gælder for enhver værdi af n ≥ c, hvor c er en konstant, hvis følgende to betingelser er opfyldt: • 1. Basistilfældet: T gælder for n = c, og • 2. Induktionsskridtet: Hvis T gælder for ethvert k, c ≤ k < n, så gælder T for n.
(1) Start med en vilkårlig instans af problemet. (2) Prøv at løse dette under antagelse af, at det samme problem - men af mindre størrelse - er blevet løst. Induktion kan benyttes ved design af algoritmer • Induktionsprincippet kan benyttes konstruktivt. Løsning af små problemer benyttes til at løse større problemer.
Eksempel:Sortering af n tal i stigende rækkefølge • Antag at vi kan sortere n-1 tal. • Vi kan da opnå en sortering af n tal ved • først at sortere n-1 af tallene, og derefter indsætte det n´te tal på den rette plads (sortering ved indsættelse), • eller • bestemme det mindste af de n tal og sætte det forrest, sortere de resterende n-1 tal, og derefter sætte dem bagefter dette forreste tal (sortering ved udvælgelse).
Eksempel:Den maksimale delsekvenssum • Problem. Givet en sekvens (a1,a2, .., an) af reelle tal. Find en delsekvens (ai,ai+1, .., aj) af konsekutive elementer, sådan at summen af dens elementer er størst mulig. Eksempel. For sekvensen (-2, 11, -4, -1, 13, -5, 2) er den maksimale delsekvens (11, -4, -1, 13) med summen 19. Hvis alle elementer er positive, er sekvensen selv maksimal. Hvis alle elementer er negative, er den maksimale delsekvens tom. Idet den tomme delsekvens har summen 0.
aj ai j i En simpel algoritme maxSum = 0; for (i = 1; i <= n; i++) { for (j = i; j <= n; j++) { sum = 0; for (k = i; k <= j; k++) sum += a[k]; if (sum > maxSum) maxSum = sum; } }
Forbedret algoritme Fjern den inderste løkke. Udnyt at maxSum = 0; for (i = 1; i <= n; i++) { sum = 0; for (j = i; j <= n; j++) { sum += a[j]; if (sum > maxSum) maxSum = sum; } }
Induktionshypotese: Vi ved, hvordan den maksimale delsekvens findes for en sekvens af længde n-1. S an-1 a1 a2 an S’M S’ • Hvis n = 1, så kan den maksimale delsekvens let bestemmes. Hvis tallet er positivt, består den af tallet selv. Ellers er den tom. • Lad S = (a1,a2, .., an) og S’ = (a1,a2, .., an-1). • Lad S’M være den maksimale delsekvens for S’. Hvis S’M er tom, er den maksimale delsekvens for S tom, hvis an er negativ, ellers lig med (an).
S an-1 a1 a2 an S’M S’ Antag at S’M ikke er tom, dvs. S’M = (ai,ai+1, .., aj), for 1 ≤ i ≤ j ≤n-1. • Hvis j = n-1, udvides S’M med an , hvis og kun hvis an er positiv.
S an-1 a1 a2 an S’M S’ • Hvis j < n-1 er der to tilfælde: • (1) Enten er S’M også maksimal for S. • (2) Eller der er en anden delsekvens, der ikke er maksimal i S’, men som er maksimal i S, når an tilføjes. • Hvilket tilfælde, der er tale om, kan ikke afgøres på baggrund af den foreliggende information: S’M . • Men da an kun forlænger en delsekvens, der ender i an-1 , dvs. er et suffix for S’, kan afgørelsen træffes, hvis vi kender det maksimale suffix S’E = (ai,ai+1, .., an-1) for S’. • Induktionshypotesen skærpes.
maxSum = maxSuffix = 0; for (i = 1; i <= n; i++) { maxSuffix += a[i]; if (maxSuffix > maxSum) maxSum = maxSuffix; else if (maxSuffix < 0) maxSuffix = 0; } • Skærpet induktionshypotese: Vi ved, hvordan den maksimale delsekvens og det maksimale suffix findes for en sekvens af længde n-1. • Vi når derved frem til følgende algoritme:
Empirisk undersøgelse af algoritmernes tidsforbrug static void randomFill(int[] a) { java.util.Random r = new java.util.Random(7913); for (int i = 0; i < a.length; i++) a[i] = r.nextInt() % 1000; } public static void main(String [] args) { for (int n = 10; n <= 1000000; n *= 10) { System.out.println("n = " + n); int a[] = new int[n]; randomFill(a); long startTime = System.currentTimeMillis(); int maxSum = maxSubSum1(a); System.out.println(" Time used: " + (System.currentTimeMillis() - startTime)/1000.0); System.out.println(); } }
Estimat: cirka 160 år Estimat: cirka 7 timer Observerede køretider(sekunder)
AlgoritmeanalyseBeskrivelse af algoritmers ressourceforbrug • Vurdering af algoritmers tids- og pladsforbrug. • Nyttigt: (1) ved valg imellem eksisterende algoritmer • (2) ved udvikling af nye algoritmer
O-notation • O-notation benyttes til at angive en øvre grænse for en algoritmes ressourceforbrug (tid eller plads), idet der ses bort fra konstante faktorer. • At en algoritmes tidsforbrug er O(f(n)), hvor n er et udtryk for problemets “størrelse”, betyder: • (1) Intuitiv definition: Algoritmens tidsforbrug vokser i værste tilfælde som f(n), når blot n er tilstrækkelig stor. • (2) Formel definition: Der eksisterer to konstanter, cog N0, således at algoritmens tidsforbrug er opadtil begrænset af cf(n) for alle n ≥ N0.
cf(n) g(n) N0 n • O-notationen fokuserer på den generelle kurveform (ser bort fra proportionali-tetskonstanter). • O-notationen muliggør vurderinger af algoritmers effektivitet (kompleksitet), som er uafhængige af det valgte programmeringssprog, oversætter og maskinel. • Illustration af udsagnet “g(n) er O(f(n))”
Kurver for n2 , n og log2n n n2 log2n
logb(M*N) = logbM + logbN Værd at vide om logaritmer • logb betegner logaritmefunktionen med base b. • logbN = x bx = N To særligt interessante logaritmefunktioner er log10 og log2. log10N = x 10x = N log2N= x 2x= N Specielt gælder log10(10N) = 1 + log10N log2(2N)= 1 + log2N