61
1 Design, analyse og verifikation

Design, analyse og verifikation

Embed Size (px)

DESCRIPTION

Design, analyse og verifikation. Plan. Design BevisteknikkerDesign ved hjælp at matematisk induktion Analyse O-notationLogaritmerBinær søgning Verifikation Påstande Et eksempel på verifikation. Bevisteknikker (relevant både ved design og verifikation). - PowerPoint PPT Presentation

Citation preview

Page 1: Design, analyse og verifikation

1

Design, analyse og verifikation

Page 2: Design, analyse og verifikation

2

• Design BevisteknikkerDesign ved hjælp at matematisk induktion

• Analyse O-notationLogaritmerBinær søgning

• Verifikation PåstandeEt eksempel på verifikation

Plan

Page 3: Design, analyse og verifikation

3

Bevisførelse ved modstrid (indirekte bevis).

Antag at det givne teorem er falsk.

Konkluder at dette vil føre til en modstrid.

Bevisteknikker(relevant både ved design og verifikation)

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.

Page 4: Design, analyse og verifikation

4

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.

Nogle personer står i en kø:

Page 5: Design, analyse og verifikation

5

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.

Matematisk induktion formel beskrivelse

Antagelsen i induktionsskridtet kaldes induktionshypotesen.

Page 6: Design, analyse og verifikation

6

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.

Page 7: Design, analyse og verifikation

7

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 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.

Teorem: Ethvert beløb ≥ 4 kroner kan veksles i et antal 2-kroner og et antal 5-kroner.

Page 8: Design, analyse og verifikation

8

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.

Page 9: Design, analyse og verifikation

9

Induktionsprincippet kan benyttes konstruktivt. Løsning af små problemer benyttes til at løse større problemer.

Induktion kan benyttes ved design af algoritmer

(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.

Page 10: Design, analyse og verifikation

10

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 enten

(1) 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

(2) bestemme det mindste af de n tal og sætte det forrest, sortere de

resterende tal, og derefter sætte dem bagefter dette forreste tal (sortering ved udvælgelse).

Page 11: Design, analyse og verifikation

11

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.

Page 12: Design, analyse og verifikation

12

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;

i j

ai aj

Page 13: Design, analyse og verifikation

13

Forbedret algoritme

maxSum = 0;for (i = 1; i <= n; i++) sum = 0; for (j = i; j <= n; j++) sum += a[j]; if (sum > maxSum) maxSum = sum;

Fjern den inderste løkke.

Udnyt at akk=i

j∑ = akk=i

j−1∑ +aj

Page 14: Design, analyse og verifikation

14

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’.

a1 a2 anan-1

S

S’

S’M

Hvis S’M er tom, er den maksimale delsekvens for S tom, hvis an er negativ, ellers lig med (an).

Induktionshypotese: Vi ved, hvordan den maksimale delsekvens findes for en sekvens af længde n-1.

Page 15: Design, analyse og verifikation

15

Hvis j = n-1, udvides S’M med an , hvis og kun hvis an er positiv.

Antag at S’M ikke er tom, dvs. S’M = (ai,ai+1, .., aj), for 1 ≤ i ≤ j ≤n-1.

a1 a2 anan-1

S

S’

S’M

Page 16: Design, analyse og verifikation

16

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.

a1 a2 anan-1

S

S’

S’M

Page 17: Design, analyse og verifikation

17

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:

maxSum = maxSuffix = 0;for (i = 1; i <= n; i++) maxSuffix += a[i]; if (maxSuffix > maxSum) maxSum = maxSuffix; else if (maxSuffix < 0) maxSuffix = 0;

Page 18: Design, analyse og verifikation

18

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 start = System.currentTimeMillis(); int maxSum = maxSubSum1(a); System.out.println(" Time used: " + (System.currentTimeMillis() - start)/1000.0); System.out.println();

Page 19: Design, analyse og verifikation

19

Observerede køretider

MaxSubSum1 MaxSubSum2 MaxSubSum3100 0.010 0.002 0.000

1000 5.127 0.031 0.00010000 5104.632 2.270 0.001

100000 ikke målt 246.245 0.0081000000 ikke målt ikke målt 0.080

Page 20: Design, analyse og verifikation

20

Kurvefitning med MacCurveFitMaxSubSum1

Page 21: Design, analyse og verifikation

21

Page 22: Design, analyse og verifikation

22

Page 23: Design, analyse og verifikation

23

Page 24: Design, analyse og verifikation

24

Page 25: Design, analyse og verifikation

25

AlgoritmeanalyseBeskrivelse af algoritmers ressourceforbrug

Vurdering af algoritmers tids- og pladsforbrug.

Nyttigt: (1) ved valg imellem eksisterende algoritmer

(2) ved udvikling af nye algoritmer

Page 26: Design, analyse og verifikation

26

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, c og N0, således at algoritmens tidsforbrug er opadtil begrænset af cf(n) for alle n ≥ N0.

O-notation

Page 27: Design, analyse og verifikation

27

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))”

cf(n)

g(n)

N0 n

Page 28: Design, analyse og verifikation

28

Kurver for n2 , n og log2n

log2n

n2

n

Page 29: Design, analyse og verifikation

29

logb betegner logaritmefunktionen med base b.

logbN = x bx = N

Værd at vide om logaritmer

Specielt gælderlog10(10N) = 1 + log10Nlog2(2N) = 1 + log2N

To særligt interessante logaritmefunktioner erlog10 og log2.

log10N = x 10x = Nlog2N = x 2x = N

logb(M*N) = logbM + logbN

Page 30: Design, analyse og verifikation

30

Alle logaritmefunktioner er proportionale

Eksempel: log2N = k*log10N, hvor k = 1/log102 ≈ 3.3

Funktionskurve for log2N

N

log2N

°°

°°

°

Page 31: Design, analyse og verifikation

31

Brug af log2

Gentagen fordoblingHvis vi starter med X = 1, hvor mange gange kan X da fordobles, før X bliver større end eller lig med N?

Svar: log2N det nærmeste heltal, der er større end eller lig med log2N.

Gentagen halveringHvis vi starter med X = N, hvor mange gange kan X da halveres, før X bliver mindre end eller lig med 1?

Svar: log2N det nærmeste heltal, der er mindre end eller lig med log2N.

Page 32: Design, analyse og verifikation

32

• Eksempler:

• Hvis f(n) = dominerende led + ikke-dominerende led, så er O(f(n)) = O(dominerende led)

Regneregler for O-notationen

• Præcedensregler:

O(1) < O(log n) < O(n) < O(n log n) < O(n2) < O(n3) < O(2n) < O(10n) < O(n!)

O(1): konstant, O(log n): logaritmisk, O(n): lineær, O(n2): kvadratisk,

O(n3): kubisk, O(nc): polynomiel, O(cn): eksponentiel (hvor c > 1)

O(6n3) = O(n3)

O(logbn) = O(log n)

O(300) = O(1)

O(n3 + n log n) = O(n3)O(n3 - 10000n2 + 10000) = O(n3)

Page 33: Design, analyse og verifikation

33

x *= i; Tidsforbrug: O(1) (konstant)

Eksempler på analyse

for (i = 1; i <= n; i++) for (j = 1; j <= i; j++) x *= i+j;Tidsforbrug: O(n(n+1)/2) = O(n2/2+n/2) = O(n2)

for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) x *= i+j;Tidsforbrug: O(n2) (kvadratisk)

for (i = 1; i <= n; i++) x *= i;Tidsforbrug: O(n) (lineært)

Page 34: Design, analyse og verifikation

34

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;

Eksempel på analyse(Den maksimale delsekvenssum)

Tidsforbrug: O(n3) (kubisk)

maxSum1:

Page 35: Design, analyse og verifikation

35

maxSum = 0;for (i = 1; i <= n; i++) sum = 0; for (j = i; j <= n; j++) sum += a[j]; if (sum > maxSum) maxSum = sum;

Tidsforbrug: O(n2) (kvadratisk)

maxSum2:

Page 36: Design, analyse og verifikation

36

maxSum = maxSuffix = 0;for (i = 1; i <= n; i++) maxSuffix += a[i]; if (maxSuffix > maxSum) maxSum = maxSuffix; else if (maxSuffix < 0) maxSuffix = 0;

Tidsforbrug: O(n) (lineært)

maxSum3:

Page 37: Design, analyse og verifikation

37

Søgning er det problem at afgøre, om en mængde af objekter indeholder et objekt, der opfylder visse specificerede krav, og i givet fald finde det.

Søgning

Søgning er genfinding af lagret information. Informationen har form af poster, der hver har en nøgle. Målet med en søgning er at finde den eller de poster, der har en nøgle, der matcher en given søgenøgle.

Søgning er den mest tidsforbrugende aktivitet i mange programmer. At erstatte en dårlig søgemetode med en god giver ofte en væsentlig effektivitetsforbedring.

Page 38: Design, analyse og verifikation

38

Klassifikation af søgemetoder

• intern/ekstern søgning

• statisk/dynamisk søgning

• søgning baseret på nøglesammenligninger/ digitale egenskaber ved nøglerne

• søgning baseret på de aktuelle nøgler/ transformerede nøgler

Page 39: Design, analyse og verifikation

39

Interfacet Comparable

public interface Comparable

int compares(Comparable rhs);

boolean lessThan (Comparable rhs);

Objekter, der skal sammenlignes, skal implementere dette interface.

lhs.compares(rhs), hvor lhs og rhs er to Comparable-objekter, skal returnere -1, 0 eller 1, alt efter om lhs er “mindre end”, “lig med” eller “større end” rhs.

lhs.lessThan(rhs) skal returnere true, hvis lhs er “mindre end” rhs. Ellers false.

Page 40: Design, analyse og verifikation

40

Eksempel på brug af Comparablepublic class MyInteger implements Comparable

public MyInteger(int x) value = x;

public int intValue() return value;

public int compares(Comparable rhs)

return value < ((MyInteger) rhs).value ? -1 :

value > ((MyInteger) rhs).value ? 1 : 0;

public boolean lessThan(Comparable rhs)

return value < ((MyInteger) rhs).value;

private int value;

Page 41: Design, analyse og verifikation

41

int sequentialSearch(Comparable[] a, Comparable key) throws ItemNotFound

for (int i = 0; i < a.length; i++) if (a[i].compares(key) == 0)

return i;

throw new ItemNotFound();

Sekventiel (lineær) søgning

Sekventiel søgning i et usorteret array bruger altid N sammenligninger for en mislykket søgning, og gennemsnitligt (N+1)/2 sammenligninger for en succesfuld søgning.

Tidskompleksiteten for sekventiel søgning er O(N).

Page 42: Design, analyse og verifikation

42

Binær søgningi et sorteret array

Metode:

Opdel arrayet i to (næsten) lige store dele.

Afgør i hvilken af de to dele, nøglen skal findes.

Fortsæt søgningen i denne del på samme måde.

Eksempel: Søgning efter N.

A B E F G H I L M N P R S X L M N P R S X L M N N

Page 43: Design, analyse og verifikation

43

int binarySearch(Comparable[] a, Comparable key)

throws ItemNotFound

int low = 0, high = a.length - 1;

while (low <= high)

int mid = (low + high)/2;

if (a[mid].compares(key) < 0)

low = mid + 1;

else if (a[mid].compares(key) > 0)

high = mid - 1;

else

return mid;

throw new ItemNotFound();

Implementation af binær søgning

Algoritmen bruger altid log2N ˚ +1sammenligninger for en mislykket søgning, og

gennemsnitligt log2N ˚ sammenligninger for en succesfuld søgning.

Page 44: Design, analyse og verifikation

44

int binarySearch(Comparable[] a, Comparable key) throws ItemNotFound

int low = 0, high = a.length - 1;

while (low < high)

int mid = (low + high)/2;

if (a[mid].compares(key) < 0) low = mid + 1;

else high = mid;

if (a[low].compares(key) == 0) return mid;

throw new ItemNotFound();

Algoritmen bruger altid log2N˚ +1 sammenligninger for en søgning.

Alternativ implementation afbinær søgning

Page 45: Design, analyse og verifikation

45

Binær søgning blev første gang beskrevet i 1946.Den første fejlfri udgave blev publiceret i 1962.

I 1986 fandt Bentley, at 90% af de professionelle programmører på hans kurser ikke kunne skrive en fejlfri udgave på to timer.

Hvor svært kan det være?

Page 46: Design, analyse og verifikation

46

Kompleksiteten af binær søgning

Binær søgning bruger aldrig mere end log2N ˚ + 1 sammenligninger - for såvel succesfuld som mislykket søgning.

Binær søgning kan beskrives ved et søgetræ:

H

D

B

A C E G I M P S

F L R

N

X

Page 47: Design, analyse og verifikation

47

Interpolationssøgning

Indeksintervallet opdeles efter et gæt på nøglens placering. Ved lineær interpolation sammenholdes søgenøglen med nøglerne i de to interval-endepunkter. I binær søgning erstattes mid med next, og

mid = (low + high)/2 med next = low + (key - a[low])*(high -

low)/(a[high] - a[low]).

a[high]

a[low]

key

low next high

Page 48: Design, analyse og verifikation

48

Kompleksiteten af interpolationssøgning

Interpolationssøgning bruger log2log2N ˚ + 1 sammenligninger for både succesfuld og mislykket søgning på “ tilfældige” tabeller.

Færre end 5 forsøg i praksis (225 ≈ 4*1010).

Svagheder: (1) tabellerne er normalt ikke “tilfældige”,

(2) beregningerne af next kan koste mere end de sparede sammenligninger.

Page 49: Design, analyse og verifikation

49

Kompleksitetsvurdering

3 tilfælde: • det bedste• det værste• det gennemsnitlige

Eksempel - Quicksort:

Bedste: O(n log n) Værste: O(n2) Gennemsnitlige: O(n log n) (hvor n er antallet af elementer, der skal sorteres)

Sædvanligvis er vi interesseret i det værste tilfælde, fordi:

(1) vi ønsker en øvre grænse (en garanti), og (2) det er lettest at beregne.

Page 50: Design, analyse og verifikation

50

O-notationens begrænsning

O-notationen er kun brugbar for “store” værdier af n.

For små værdier af n kan de ikke-dominerende led have en væsentlig betydning.

Page 51: Design, analyse og verifikation

51

Hvor O(f(n)) kan benyttes til at angive en øvre grænse (≤) for vækst, kan Ω(f(n)) benyttes til at angive en nedre grænse (≥):

g(n) = Ω(f(n)), hvis der findes konstanter, c og N0, således at g(n) ≥ cf(n), når n ≥ N0.

g(n) = (f(n)), hvis væksten for g er mindre end (<) væksten for f. g(n) = (f(n)), hvis og kun hvis g(n) = O(f(n)) og g(n) ≠ (f(n))

g(n) = f(n)), hvis væksten for g er den samme (=) som væksten for f.g(n) = (f(n)), hvis og kun hvis g(n) = O(f(n)) og g(n) = Ω(f(n))

Ω, og

Page 52: Design, analyse og verifikation

52

At ræsonnere om algoritmer

Evnen til at drage logiske slutninger er nyttig ved

• algoritmedesign

• fejlfinding

• forbedringer

• verifikation (bevis for korrekthed)

Page 53: Design, analyse og verifikation

53

En algoritme A siges at være partielt korrekt, når der gælder følgende: Hvis A terminerer for et givet legalt input, så vil dens output være korrekt.

Verifikation

Bevisførelse af partiel korrekthed foretages ved brug af påstande (assertions).

En påstand er et logisk udsagn, der er knyttet til et givet punkt i algoritmen, og som er opfyldt, hver gang algoritmen når til dette punkt.

En algoritme A siges at være korrekt (eller totalt korrekt), hvis A er partielt korrekt, og A terminerer for ethvert legalt input.

Page 54: Design, analyse og verifikation

54

Påstande

• Før-betingelse (precondition) Et udsagn, som gælder før udførelsen af en eller flere sætninger.

• Efter-betingelse (postcondition) Et udsagn, som gælder efter udførelsen af en eller flere sætninger.

• Løkke-invariant (loop invariant) Et udsagn, som gælder umiddelbart før løkke-testen i en løkke.

Page 55: Design, analyse og verifikation

55

m ≤ n før-betingelsesort(a, m, n);

a[m] ≤ a[m+1] ≤ . . . ≤ a[n] efter-betingelse

Eksempler på påstande

i = m;

while

a[m] ≤ a[m+1] ≤ . . . ≤ a[i-1] ^

a[m .. i-1] ≤ a[i .. n] løkke-invariant (i < n)

min = i;

for (j = i+1; j <= n; j++)

if (a[j] < a[min]) min = j;

x = a[i]; a[i] = a[min]; a[min] = x;

i++;

Page 56: Design, analyse og verifikation

56

Regler for verifikation

• Tildeling:

P w > 2 v = w; P v > 2

w

• Valg:

Pif (B) P ^ B S1;else P ^ ¬ B S2;

w v

Page 57: Design, analyse og verifikation

57

Givet algoritmen

q = 0; r = x;

while (r >= y)

r = r - y;

q = q + 1;

hvor x, y, q og r er heltal, x ≥ 0 og y > 0.

Eksempel på verifikation(heltalsdivision)

Bevis at algoritmen bestemmer kvotienten q og resten r ved heltalsdivision af x med y, dvs.

r = x - q*y (0 ≤ r < y)

Page 58: Design, analyse og verifikation

58

Bevisførelsen

(1) Løkke-invarianten er opfyldt ved indgangen til løkken.

(2) Hvis løkke-invarianten er opfyldt i en given iteration, så er den også opfyldt i den efterfølgende iteration.

(3) Hvis algoritmen terminerer, så er dens efter-betingelse opfyldt.

(4) Algoritmen terminerer.

induktion

Page 59: Design, analyse og verifikation

59

x ≥ 0, y > 0 algoritmens før-betingelseq = 0;

r = x;

while r = x - qy ^ r ≥ 0 løkke-invariant (r >= y)

r = r - y;

q = q + 1;

r = x - qy ^ 0 ≤ r < y algoritmens efter-betingelse

r = x - qy ^ r ≥ y r - y = x - (q+1)y ^ r - y ≥ 0

r = x - (q+1)y ^ r ≥ 0

Page 60: Design, analyse og verifikation

60

q = 0; r = x;while (r >= y) r = r - y; q = q + 1;

Algoritmen terminerer.

Terminering

Bevis:

Da y > 0, mindskes r ved hvert gennemløb af løkken. Løkketesten må derfor blive falsk efter et endeligt antal gennemløb.

Page 61: Design, analyse og verifikation

61

• Læs kapitel 6 lærebogen (side 143-172)

• Løs følgende opgaver

1-1. Opgave 5.5

1-2. Opgave 5.10

1-3. Opgave 5.13

1-4. Opgave 5.14a

1-5. Opgave 5.23

Ugeseddel 111. september - 18. september