Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wprowadzimy teraz pojęcie niezmiennika pętli, które jest często wykorzystywane do projektowania algorytmów i dowodzenia ich poprawności. Rozważmy pętlę

Podobne prezentacje


Prezentacja na temat: "Wprowadzimy teraz pojęcie niezmiennika pętli, które jest często wykorzystywane do projektowania algorytmów i dowodzenia ich poprawności. Rozważmy pętlę"— Zapis prezentacji:

1 Wprowadzimy teraz pojęcie niezmiennika pętli, które jest często wykorzystywane do projektowania algorytmów i dowodzenia ich poprawności. Rozważmy pętlę while, która ma postać:

2

3

4 Ostatnie stwierdzenie dotyczące prawdziwości zdania g po zakończeniu pętli jest tak oczywistym, że często się o nim zapomina. Jednak dostarcza ono ważnych informacji pozwalających uzasadnić semantyczną poprawność algorytmów. Dlatego zostało umieszczone w treści twierdzenia.

5 k=4; while(k>=4) k=k+1; k=4; while(k>=4) k=k+1;

6 Przykład 1. Algorytm NWD Euklidesa. Zapis w pseudokodzie Jak znaleźć niezmiennik pętli?

7 Najpierw należy pokazać, że

8

9

10

11

12

13 Ćwiczenie

14

15

16 Przykład 2. Rozważmy algorytm dzielenia całkowitego liczb naturalnych. void dzielenie (int x,y) {// : 0<=x i 0<=y int q,r; q=0; r=x; while(y<=r)//p: x=q*y+r i 0<=r i 0<=y { q=q+1; r=r-y; }; }// : x=q*y+r i 0<=r

17 Należy udowodnić pewną własność obliczeń algorytmu, która łączy zachodzenie warunku początkowego z warunkiem końcowym. Jaki warunek spełniają x, y, q, r w pętli while w chwili sprawdzenia warunku y<=r sterującego iteracją? Określamy niezmiennik p. Wykażemy, że za każdym razem, gdy obliczenie algorytmu rozpoczyna się stanem spełniającym warunek początkowy oraz dochodzi do warunku iteracji, to spełniony jest warunek p.

18 void dzielenie (int x,y) { // : 0<=x i 0<=y int q,r; q=0; r=x; while(y<=r)//p: x=q*y+r i 0<=r i 0<=y { q=q+1; r=r-y; }; } // : x=q*y+r i 0<=r

19 void dzielenie (int x,y) {// : 0<=x i 0<=y int q,r; q=0; r=x; while(y<=r)//p: x=q*y+r i 0<=r i 0<=y { q=q+1; r=r-y; }; }// : x=q*y+r i 0<=r

20 void dzielenie (int x,y) {// : 0<=x i 0<=y int q,r; q=0; r=x; while(y<=r)//p: x=q*y+r i 0<=r i 0<=y { q=q+1; r=r-y; }; }// : x=q*y+r i 0<=r

21 Dowodzenie własności stopu Kryterium liczników iteracji Kryterium malejących wielkości

22 Załóżmy, że dany jest algorytm: M:{ l=c; while(p)do { K; l=l+1; } Dobieramy teraz dwie wielkości: takie, że l<= oraz takie, które wyjaśnia zależność między wartościami zmiennych w chwili sprawdzania warunku (niezmiennika) p. Kryterium liczników iteracji Jeżeli: 1) i >=l jest w algorytmie M niezmiennikiem instrukcji iteracyjnej while przy warunku początkowym, 2)K ma własność stopu względem i p, to M oraz while(p)do K mają własność stopu względem. zmienna l jest licznikiem iteracji, służy do obliczania liczby wykonań instrukcji iterowanej K

23 Przykład 3. void dzielenie1 (int x,y) { // 1: 0<=x i 0

24 void dzielenie1 (int x,y) { // 1: 0<=x i 0=0 i 0=0, y>0, czyli zachodzi i q =y. Wtedy dostajemy nowe wartości: q=q+1 i r=r-y.

25 void dzielenie1 (int x,y) { // 1: 0<=x i 0=0 i 00q=x/y-r/y, y>0 (r>=0,y>0) q<=x/y Stosując teraz kryterium liczników iteracji wnioskujemy, że algorytm ma własność stopu względem 1. Ponadto nierówność q<=x/y podaje ograniczenie na liczbę wykonywanych iteracji.

26 Załóżmy, że dany jest algorytm: M:{ i=w+1; while(p)do { i=w; K; } Dobieramy teraz trzy wielkości: i oraz w będące liczbami całkowitymi i takie, które wyjaśnia zależność między wartościami zmiennych w chwili sprawdzania warunku (niezmiennika) p. Kryterium malejących wielkości Jeżeli: 1) i i>w, i w>=0 jest w algorytmie M niezmiennikiem instrukcji iteracyjnej while przy warunku początkowym, 2)K ma własność stopu względem i p, to M oraz while(p)do K mają własność stopu względem.

27 Metodę malejących wielkości stosuje się, gdy w algorytmie zwiększanie wartości następuje w sposób nieregularny, czyli niekoniecznie o 1. Zamiast szacować wzrost rozpatruje się jednak te wielkości, które zmniejszają swoje wartości w trakcie wykonywania algorytmu i dla których istnieją wartości ograniczające je z dołu.

28 Przykład 4. void dzielenie2 (int x,y) { // 2: 0<=x i 0

29 void dzielenie2 (int x,y) { // 2: 0<=x i 00 i (i=r+1 i=r+y). Przy wejściu do instrukcji while warunek jest spełniony, bo i=r+1.

30 void dzielenie2 (int x,y) { // 2: 0<=x i 00 i (i=r+1 i=r+y). Warunek zachowuje się przy każdym wykonaniu instrukcji iterowanej, bo jeśli i i r są nowymi wartościami, to i=r oraz r=r-y, czyli i=r+y. Zatem jest niezmiennikiem iteracji. Ponieważ r>=0, to cały warunek i r =0 jest niezmiennikiem iteracji. Na podstawie kryterium malejących wielkości mamy własność stopu względem 2.


Pobierz ppt "Wprowadzimy teraz pojęcie niezmiennika pętli, które jest często wykorzystywane do projektowania algorytmów i dowodzenia ich poprawności. Rozważmy pętlę"

Podobne prezentacje


Reklamy Google