METODY TWORZENIA ALGORYTMW METODA PRZYROSTOWA Sortuje tablic A1
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. 4. 5. 6. 7. i: = j-1; while (i>0) and (A[i]>pom) begin A[i+1]: = A[i]; i: = i-1; end; A[i+1]: = pom; end; do
"DZIEL I ZWYCIĘŻAJ" 3 ETAPY : 1. DZIEL 2. ZWYCIĘŻAJ 3. POŁĄCZ
SORTOWANIE PRZEZ SCALANIE 5 5 5 2 2 4 2 5 5 1 3 2 6 6 1 6 4 4 1 1 3 4 5 2 6 6 4 2 2 4 1 6 3 4 5 6 6 2 3 1 2 2 3 1 6 2 3 2 6 6 2 2 6 3 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; 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 begin n : = length [p]; PZ : = {1}; j : = 1; if p [i] k [j] then begin PZ : = PZ {i}; j : = i end; return PZ; { PZ - największy podzbiór zajęć parami zgodnych } end;
PROGRAMOWANIE DYNAMICZNE u Rozwiąż "małe" problemy. u Zapamiętaj rozwiązania. u Użyj tych rozwiązań do rozwiązania "dużych" problemów
u Liczby Fibonacciego DANE : n N; n>=0 WYNIK : n - ta liczba Fibonacciego l 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;
u Liczby Fibonacciego l metoda dynamiczna - złożoność O(n) fib ( n: integer ) : integer; f 1, f 2, f, k : integer; begin if ( n = 0 )or( n=1 )then fib : = 1 else begin f 1 = f 2 = 1; for k: = 2 to k : = n-1 do begin f : = f 1 + f 2; f 2 : = f 1; f 1 : = f; end end;
u Mnożenie ciągu macierzy DANE : n N, p 0, p 1, . . . , pn N A 1, . . . , An - macierze prostokątne o elementach rzeczywistych, Ai ma rozmiar pi-1 * pi. WYNIK : A 1 *. . . * An obliczony w sposób optymalny, tzn. : liczba wykonanych mnożeń elementów macierzy jest najmniejsza Optymalne nawiasowanie
Przykład : DANE : A 1 - 10 x 100 A 2 - 100 x 5 A 3 - 5 x 50 WYNIK : A 1 A 2 A 3 - optymalnie (A 1 A 2)A 3 A 1 A 2 10 x 100 x 5 (A 1 A 2)A 3 10 x 5 x 50 S A 1(A 2 A 3) A 2 A 3 = 2500 7500 100 x 5 x 50 A 1(A 2 A 3) 10 x 100 x 50 S = 5000 => A 1 A 2 (10 x 5) = 25000 => A 2 A 3 (100 x 50) = 50000 75000
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; } i k<j dla i < j
MATRIX-CHAIN-ORDER ( p ); { p[0. . n] – tablica rozmiarów macierzy A 1, . . . , 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] : = ; n : = length (p) - 1; for k : = i to j– 1 do for i : = 1 to n do begin m [i, i] : = 0; 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 end end return m and s end ;
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 return Ai 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;
- Slides: 18