Problem nawiasowania ciągu macierzy

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

Problem nawiasowania ciągu macierzy – problemem znalezienia takiego nawiasowania iloczynu macierzy A0,A1,,An, by zminimalizować łączny koszt wszystkich mnożeń. Nawiasowanie takie nazywa się optymalnym. Mówimy, że iloczyn macierzy A0A1An ma ustalone nawiasowanie, jeżeli tworzy go pojedyncza macierz lub iloczyn dwóch iloczynów macierzy o ustalonym nawiasowaniu.

Przykład ustalonych nawiasowań

Niech A0,A1,A2,A3 będzie ciągiem macierzy. Ich iloczyn ma następujące ustalone nawiasowania:

(((A0A1)A2)A3)
((A0(A1A2))A3)
((A0A1)(A2A3))
(A0((A1A2)A3))
(A0(A1(A2A3)))

Nawiasowanie a koszt obliczenia iloczynu macierzy

Wybór nawiasowania może mieć znaczący wpływ na liczbę operacji potrzebnych do obliczenia iloczynu macierzy – koszt pomnożenia dwóch macierzy o wymiarach odpowiednio a×b i b×c wynosi O(abc) (dokładnie – wymaga abc mnożeń skalarnych).

Niech dane będą trzy macierze A0,A1,A2 o rozmiarach odpowiednio 2×20, 20×1 i 1×10. Dla nawiasowania ((A0A1)A2) koszty wyniosą:

  • obliczenie iloczynu A'=A0A1 – koszt 2201=40 mnożeń; macierz A' ma rozmiary 2×1;
  • obliczenie iloczynu A'A2 – koszt 2110=20 mnożeń;
  • razem: 40+20=60 mnożeń skalarnych.

Dla tych samych macierzy, ale nawiasowania (A0(A1A2)), koszty wyniosą:

  • obliczenie iloczynu A'=A1A2 – koszt 20110=200 mnożeń; macierz A' ma rozmiary 20×10;
  • obliczenie iloczynu A0A' – koszt 22010=400 mnożeń;
  • razem: 200+400=600 mnożeń skalarnych.

Przewaga pierwszego nawiasowania jest oczywista.

Własność optymalnej podstruktury

Można wykazać, że problem nawiasowania macierzy wykazuje własność optymalnej podstruktury.

Dowód

Załóżmy, że dla optymalnego nawiasowania macierzy Ai,Ai+1,,Aj występuje podział między Ap i Ap+1 oraz, niewprost, że dla tego nawiasowania nawiasowanie Ai,Ai+1,,Ap nie jest optymalne. Wówczas można by w nawiasowaniu Ai,Ai+1,,Aj „podmienić” nawiasowanie Ai,Ai+1,,Ap na optymalne, w wyniku czego otrzymalibyśmy nowe nawiasowanie Ai,Ai+1,,Aj lepsze od optymalnego – sprzeczność.

Rozwiązanie problemu nawiasowania macierzy

Problem nawiasowania ciągu macierzy można łatwo rozwiązać, stosując algorytm dynamiczny. Definiujemy koszt optymalnego nawiasowania jako funkcję optymalnych rozwiązań podproblemów.

Niech k[i][j] oznacza minimalny koszt wymnożenia macierzy Ai,Ai+1,,Aj o rozmiarach odpowiednio ai×ai+1,ai+1×ai+2,,aj×aj+1.
k[i][j] może być zdefiniowane następująco:

  • k[i][i] – nawiasowanie tylko jednej macierzy – k[i][i]=0
  • k[i][j] – nawiasowanie to musi wyznaczać punkt podziału p taki, że (zgodnie z podpunktem o własności optymalnego nawiasowania) Ai,,Ap i Ap+1,,Aj są optymalnymi rozwiązaniami podproblemów. Wtedy k[i][j] jest równe sumie minimalnych kosztów obliczenia Ai,,Ap i Ap+1,,Aj oraz kosztu pomnożenia macierzy wynikowych tych podrozwiązań:
k[i][j]=minim<j{k[i][m]+k[m+1][j]+aiam+1aj+1}