180 likes | 400 Views
METODY TWORZENIA ALGORYTMÓW. METODA PRZYROSTOWA. {Sortuje tablicę A[1..n] liczb rzeczywistych} 1. for j := 2 to n do begin 2. pom := A[j] ; { wstaw A[j] w posortowany ciąg A[1 .. j-1] } 3. i:= j-1; 4. while (i>0) and (A[i]>pom) do begin
E N D
METODY TWORZENIA ALGORYTMÓW
{Sortuje tablicę A[1..n] liczb rzeczywistych} 1. for j := 2 to n do begin 2. pom := A[j] ; { wstaw A[j] w posortowany ciąg A[1 .. j-1] } 3. i:= j-1; 4. while (i>0) and (A[i]>pom) do begin 5. A[i+1]:= A[i]; 6. i:= i-1; end; 7. A[i+1]:= pom; end;
"DZIEL I ZWYCIĘŻAJ" 3 ETAPY : 1. DZIEL 2. ZWYCIĘŻAJ 3. POŁĄCZ
SORTOWANIE PRZEZ SCALANIE 5 2 4 6 1 3 2 6 5 2 4 6 1 3 2 6 5 2 4 6 1 3 2 6 5 2 4 6 1 3 2 6 2 5 4 6 1 3 2 6 2 4 5 6 1 2 3 6 1 2 2 3 4 5 6 6
MERGE-SORT ( A, p, k); { Sortuje elementy w podtablicy A[p..k]; jeśli p >= k to podtablica jest już posortowana; jeśli p < k to dzielimy A[p..k] na dwie podtablice i sortujemy każdą z nich } begin if p < k then begin q := (p+k)/2 ; MERGE-SORT ( A, p, q ); MERGE-SORT ( A, q+1, k ); MERGE (A, p, q, k); end end; MERGE-SORT( A, 1, n ) -sortuje tablicę A[1..n] Złożoność : T(n) = (nlgn)
ALGORYTMY ZACHŁANNE (GREEDY ALGORITHMS)
PLANOWANIE ZAJĘĆ DANE : Z = {1, 2, ... n } - zbiór n zajęć , n>0 [ pi, ki ) pi - czas rozpoczęcia zajęcia i ki - czas zakończenia zajęcia i pi ki WYNIK: Największy podzbiór PZ zbioru Z, który zawiera zajęcia zgodne, tzn.: i, j PZ , to [ pi, ki ) [ pj, kj ) =
GREEDY-ACTIVITY-SELECTOR ( p, k); { p- tablica początków zajęć, k- tablica końców zajęć; zakładamy, że k [1] k [2] ... k [n] } for i := 2 to n do if p [i] k [j] then begin PZ := PZ {i}; j := i end; return PZ; { PZ - największy podzbiór zajęć parami zgodnych } end; begin n := length [p]; PZ := {1}; j := 1;
PROGRAMOWANIE DYNAMICZNE • Rozwiąż "małe" problemy. • Zapamiętaj rozwiązania. • Użyj tych rozwiązań do rozwiązania "dużych" problemów
Liczby Fibonacciego DANE :n N; n>=0 WYNIK :n - ta liczba Fibonacciego • metoda rekurencyjna - złożoność O(nn ) • fib( n: integer) : integer; • begin • if ( (n =0) or (n= 1)) then fib := 1; • else fib := fib(n-1) + fib(n-2) • end;
Liczby Fibonacciego • metoda dynamiczna - złożoność O(n) • fib ( n: integer): integer; • f1, f2, f, k : integer; begin • if ( n = 0 )or( n=1 )then fib := 1 • else • begin • f1 = f2 = 1; • for k:= 2 to k := n-1 do • begin • f := f1 + f2; • f2 := f1; • f1 := f; • end; • end • end;
Mnożenie ciągu macierzy DANE :n N, p0, p1, ... , pn N A1, ... , An - macierze prostokątne o elementach rzeczywistych, Ai ma rozmiar pi-1 * pi . WYNIK : A1 * ... * An obliczony w sposób optymalny, tzn.: liczba wykonanych mnożeń elementów macierzy jest najmniejsza Optymalne nawiasowanie
Przykład : DANE : A1 - 10x100 A2 - 100x5 A3 - 5x50 WYNIK : A1A2A3 - optymalnie A1A210x100x5 = 5000 => A1A2(10x5) (A1A2)A310x5x50= 2500 S7500 (A1A2)A3 A2A3100x5x50 = 25000 => A2A3(100x50) A1(A2A3) 10x100x50= 50000 S75000 A1(A2A3)
Struktura optymalnego nawiasowania : m [i,j] = minimalna liczba mnożeń potrzebna do obliczenia iloczynu Ai*...*Aj 0 dla i = j m [i,j] = min { m [i,k] + m [k+1, j ] + p i-1 * pk * pj; } dla i < j i k < j
MATRIX-CHAIN-ORDER ( p ); {p[0..n] – tablica rozmiarów macierzy A1, ... , An , tzn .: Ai ma rozmiar p[i-1] * p[i] } for r := 2 to n do for i := 1 to n-r+1 do begin j := i + r – 1; m [i,j] := ; for k := i to j–1 do begin q := m [i,k] + m [k+1, j ] + p i-1 * pk * pj; if q < m [i,j ] then begin m [i,j ] := q ; s [i,j] := k endend end return m and s end ; begin n := length (p) - 1; for i := 1 to n do m [i,i] := 0;
MATRIX-CHAIN-MULTIPLY ( A, s, i, j); {Oblicza optymalnie iloczyn Ai * A i+1 * ... * A j} begin if j > i then begin X := MARTIX-CHAIN-MULTIPLY(A, s, i,s[i,j]); Y := MARTIX-CHAIN-MULTIPLY(A, s, s[i,j ] +1, j); Z := MATRIX-MULTIPLY ( X, Y ); return Z end else returnAi end;
MATRIX-MULTIPLY ( A, B ); { Oblicza iloczyn : C = A * B } begin if kol(A) <> rows(B) then error else for i := 1 to rows (A) do for j := 1 to kol (B) do begin C [i,j ] := 0; for k := 1 to kol (A) do C [i,j ] := C [i,j] + A [i,k] * B [k,j] ; end; return C; end;