iloczyn macierzy

Iloczyn Macierzy

Przykład

Mamy trzy macierze

Mnożenie macierzy jest łączne. Zatem A1x(A2xA3) = (A1xA2)xA3 . Ile mnożeń między liczbami wykonamy mnożąc macierze z pierwszym rozłożeniem nawiasów, a ile z drugim?

Reguła:

Niech macierz A jest rozmiaru ixk, macierz B jest rozmiaru kxj. Liczba mnożeń między liczbami, gdy mnożymy macierze AxB równa się i*k*j.

Zatem,

Konkluzja: to nie wszystko jedno, jak rozłożymy nawiasy, gdy mnożymy wiele prostokątnych macierzy o pasujących rozmiarach.

Zadanie

Dana liczba n macierzy i wektor r[0,n] reprezentujący rozmiary kolejnych macierzy.

A1 jest rozmiaru r[0]xr[1]
A2 jest rozmiaru r[1]xr[2]
.
.
.
Ai jest rozmiaru r[i-1]xr[i]
.
.
.
An jest rozmiaru r[n-1]xr[n]

Obliczyć liczbę mnożeń między liczbami przy optymalnym rozłożeniu nawiasów w iloczynie

A1xA2x . . . xAn

macierzy.

Podzadania

Dla 1 ≤ i < j ≤ n,

aij = liczba mnożeń liczb przy optymalnym rozłożeniu nawiasów w iloczynie Aix…xAj

Lemat

aij = min{aik + ak+1j + r[i-1]*r[k]*r[j] | i ≤ k < j } , aii=0.

Rysunek tablicy częściowych rozwiązań i kierunek wypełniania tablicy

Funkcja, dla i < j, min(i, j) = min{aik + ak+1j + r[i-1]*r[k]*r[j] | i ≤ k < j } .

Algorytm funkcji min

Wejście: i < j

Działanie:
1. m = A[i+1, j] + r[i-1]*r[i]*r[j]; // i=k < j
2. for(k=i+1;k<j; k++)
{
p = A[i, k] + A[k+1, j] + r[i-1]*r[k]*r[j];
if (p<m) m=p;
}
3. zwróć m;

Algorytm rozwiązania zadania

  1. A[1..n,1..n] – tablica częściowych rozwiązań, na początku wyzerowana.

  2. for(i=n-1;i>=1;i--)
    for(j=i+1;j<=n; j++)
    a[i, j] = min(i, j);

  3. wyświetl A[1, n].

Zadanie indywidualne (niebanalne; bez dynamicznych struktur danych, a mianowicie drzew, beznadziejnie skomplikowane rozwiązanie tablicowe)

Napisać program obliczający liczbę mnożeń przy optymalnym rozłożeniu nawiasów i wyświetlający to optymalne rozłożenie nawiasów.

Drugi wykład

Kod Greya, początki programowania na dynamicznych strukturach danych, zadanie generowania podziałów zbioru {1,2,…,n}.


Wyszukiwarka