Professional Documents
Culture Documents
Niech A i B bd dwiema macierzami n n, gdzie n = 2k Naszym celem jest obliczenie iloczynu A B, czyli obliczenie C=A B. Jak wiemy, mona to zrobi korzystajc ze wzoru:
procedure MM(A: array[1..n, 1..n], B: array[1..n, 1..n], C: array[1..n, 1..n]) begin for i:=1 to n do for j:=1 to n do begin s:=0; for k:=1 to n do C[i, j]:=A[i, k] B[k, j] end end;
Jak atwo zauway, zoono procedury MM wynosi O(n3). Jednake, mona atwo zastosowa podejcie dziel i rzd, dzielc najpierw macierze A, B i C na wiartki wedug nastpujcego schematu:
[ ][ ] [ ]
A11 A12 A21 A22 B11 B12 B21 B22 C11 C12 = C21 C22
wtedy:
C11 = A11 B11 + A12 B21 C12 = A11 B12 + A12 B22 C 21 = A21 B11 + A22 B21 C 22 = A21 B12 + A22 B22
T ( n) = {
b 2 + 8T ( n / 2 ) cn
Jednake gdybymy potrafili mnoy macierze 22 za pomoc siedmiu mnoe, to moglibymy zmniejszy zoono obliczeniow tego podejcia. Istotnie, w 1969 roku Strassen znalaz tak metod, ktra polega na tym, e najpierw oblicza si siedem podmacierzy wedug wzorw: P = (A11 + A22) (B11 + B22) Q = (A21 + A22 ) B11 R = A11 (B12 B22) S = A22 (B21 B11) T = (A11 + A12 ) B22 U = (A21 A11) (B11 + B12) V = (A12 A22) (B21 + B22)
Wwczas odpowiednie wiartki macierzy wynikowej C uzyskuje si wedug wzorw: C11 = P + S T + V C12 = R + T C21 = Q + S C22 = P + R Q + U
function Strassen (A, B : matrix, n : integer) : matrix; begin if n = 1 then Strassen : = A B else begin podziel A i B na wiartki; P := Strassen(A11 + A22, B11 + B22, n/2); Q := Strassen(A21 + A22, B11, n/2); R := Strassen(A11, B12 B22, n/2); S := Strassen(A22, B21 B11, n/2); T := Strassen(A11 + A12, B22, n/2); U := Strassen(A21 A11, B11 + B12, n/2); V := Strassen(A12 A22, B21 + B22, n/2); C11 := P + S T + V; C12 := R + T; C21 := Q + S; C22 := P + R Q + U; end end;
M ( n) = {
wic
1 7 M ( n / 2)
log2 7
M ( n) = 7
log2 n
=n
P ( n) = {
wic
0 7 P ( n / 2 ) +18 ( n / 2 )2
P ( n) = 6n
2 ,81
6 n = ( n
2
2 ,81
Jeli n 2k, to - dodawaj extra wiersz i kolumn zer, dopki rozmiar n nie jest potg dwjki - uywaj formu Strassena, dopki rozmiar n jest liczb parzyst - zrb kombinacj dwch powyszych metod W nastpnej tabeli przedstawiono porwnanie czasw dziaania niektrych algorytmw oraz czas dziaania programu pobranego z biblioteki numerycznej Accelerate. Podane wyniki stanowi redni czas potrzebny do pomnoenia jednej pary macierzy uzyskany po przeprowadzeniu testw na prbie 1000 mnoe.
Klasyczny
Strassen 22
Laderman 33
Schachtel 55
Biblioteka Accelerate
* Przepenienie stosu
Tabela 8.1
Analiza stabilnoci numerycznej metod szybkiego mnoenia macierzy jest bardziej skomplikowana. Tym niemniej ustalono, e metoda SS nie jest stabilna. Najbardziej stabilna numerycznie jest metoda klasyczna zaimplementowana rekurencyjnie.
nn CW 22 33 44 55 5* 13* 26* 45 Liczba mnoe Do udoskonalenia SS 6* 21* 48 91 Znany 7 22 49 100 Klasyczny 8 27 64 125
(n 2,373 )
(n 2,81 )
Tabela 8.2
* Niemoliwe do uzyskania
(2,771=)log321 < log27(=2,807) < log322(=2,813) Strassen: Mnoenie macierzy wg Gaussa nie jest optymalne. Pan: Mnoenie macierzy wg Strassena nie jest optymalne. Obecnie najlepsze znane oszacowanie grne problemu mnoenia macierzy to O(n2,373) dziki Coppersmithowi i Winogradowi (1990) i Vassileskiej Williams (2011).
Algorytmy probabilistyczne (inaczej randomizowane) to takie, ktre do swojego dziaania uywaj losowoci. W praktyce oznacza to e implementacja takiego algorytmu korzysta przy obliczeniach z generatora liczb losowych.
Algorytm probabilistyczny moe, w przeciwiestwie do deterministycznego, wygenerowa rne wyniki dla tych samych podstawowych danych wejciowych (w szczeglnoci moe, w zalenoci od bitw losowych, rozwiza problem lub nie). Rwnie liczba operacji potrzebnych do zakoczenia dziaania algorytmu moe zmienia si w zalenoci od uytych bitw losowych. Te dwa aspekty implikuj dwie podstawowe klasy algorytmw probabilistycznych: Algorytmy Monte Carlo. W algorytmach tej klasy kadziemy nacisk na zminimalizowanie pesymistycznej (tj. dla dowolnych bitw losowych) zoonoci obliczeniowej, dopuszczajc z pewnym prawdopodobiestwem, e algorytm nie rozwie stawianego przed nim problemu.
Algorytmy Las Vegas. Algorytmy tego typu zawsze rozwizuj problem, przy zminimalizowanej oczekiwanej zoonoci obliczeniowej (tj. urednionej po wszystkich moliwych wartociach bitw losowych). Dopuszczamy jednak, by dla pewnych, rzadkich cigw bitw losowych pesymistyczny czas dziaania algorytmu by gorszy ni w przypadku rednim, a nawet gorszy ni w algorytmie deterministycznym. Podstawowa praktyczna rnica midzy dobrym algorytmem typu Las Vegas, a algorytmem deterministycznym polega na tym, e spodziewana zoono obliczeniowa dotyczy kadych moliwych danych wejciowych (nie ma pechowych danych moemy jedynie pechowo losowa).
Przykad: Dane: Cig A dugoci n skadajcy si z maych liter alfabetu aciskiego, przy czym wszystkie litery wystpuj w cigu tyle samo razy (kada litera n/26 razy). Zadanie: Poda dowoln pozycj w cigu, na ktrej wystpuje litera a. Oczywisty algorytm deterministyczny rozwizuje nasz problem w pesymistycznym czasie O(n), gdy moe by i tak, e wszystkie litery a s zgrupowane w drugiej poowie cigu. procedure FindAnyDeterministic(A, n); begin for i := 1 to n do if A[i] = a then return (i) end;
Moemy jednak stosunkowo atwo skonstruowa algorytm Monte Carlo, ktry dla dowolnego z gry ustalonego > 0 rozwie nasz problem z prawdopodobiestwem 1 w czasie O(m). procedure FindAnyMonteCarlo(A, n, m); begin for i := 1 to m do begin j := liczba losowa ze zbioru {1,,n}; if A[j] = a then return (j) end; return (fiasko) end; Powyszy algorytm ma pesymistyczn zoono obliczeniow O(m) i zapewnia sukces z prawdopodobiestwem 1(25/26)m.
Wartoci m wyznaczone dla kilku przykadowych prawdopodobiestw poraki zostay zebrane w tabeli 8.3 .
0,0001 235
Tabela 8.3
Dysponujc algorytmem Monte Carlo i potrafic sprawdzi, czy jego wykonanie zakoczyo si sukcesem, moemy pokusi si o skonstruowanie algorytmu Las Vegas. Konstrukcj tak mona przeprowadzi na dwa sposoby: 1. Wywoujemy algorytm Monte Carlo do skutku, a osigniemy sukces. Podejcie to ma jednak t wad, e pesymistyczny czas dziaania otrzymanego w ten sposb algorytmu Las Vegas nie daje si oszacowa. A to dlatego, e dla kadego N > 0 istnieje cig wyborw losowych, prowadzcy do wykonania przez nasz algorytm wicej ni N operacji.
2. Wady tej pozbawione jest drugie podejcie. Jeli dysponujemy algorytmem deterministycznym i algorytmem Monte Carlo oraz potrafimy sprawdzi, czy wykonanie algorytmu Monte Carlo koczy si sukcesem, to moemy stworzy algorytm Las Vegas (czsto bardzo efektywny) w nastpujcy sposb: wykonaj algorytm Monte Carlo jeli wykonanie zakoczyo si sukcesem, to koniec. W przeciwnym razie wykonaj algorytm deterministyczny.
Rozpatrzmy nastpujcy algorytm: procedure FindAnyLasVegas(A, n); begin v := FindAnyMonteCarlo(A, n, logn/log(26/25)); if v failure then return (v); return (FindAnyDeterministic(A, n)) end; W najgorszym przypadku czas wykonania algorytmu FindAnyMonteCarlo wynosi zatem O(logn). Oczekiwany czas wykonania FindAnyLasVegas dla =1/n szacuje si w zwizku z tym przez O((11/n)logn+n/n)=O(logn+1)=O(logn). Jeli chodzi o oszacowanie pesymistyczne, to w najgorszym wypadku bdziemy musieli wykona jednokrotnie obie procedury, czyli pesymistyczny czas wykonania algorytmu FindAnyLasVegas szacuje si przez W(n) = O(logn + n) = O(n).
KONIEC