Vím-li, jak efektivně uzávorkovat matic, pomůže mi to k tomu, abych věděl, jak uzávorkovat matic?
Příklad: součin délky 4+1:
Z něj je vidět, že nemohu postupovat tak, že zjistím uzávorkování pro první matice, přidám k nim další a pak provedu triviální výpočet. Musím postupovat slučováním - nejprve zjistím složitost pro všechny součiny délky 2, pak délky 3… Dále je vidět, že pro hledání složitosti násobení matic musím provést porovnání pro danou posloupnost.
Vytvořím si tak následující tabulku:
Každá z těchto položek obsahuje následující vlastnosti:
Počítám-li od jedničky, pak pro výpočet složitosti násobení na pozici musím porovnat násobení na pozicích a pro . Konkrétně - hledám-li vhodné uzávorkování pro pole , pak porovnávám ty součiny, které začínají a končí (bez vynechání).
Přidaná náročnost je rovna součinu pravého rozměru levé matice a levého rozměru pravé matice (k tomu je potřeba připočíst náročnost původních matic).
Rozměry součinu mohu určit okamžitě, bez počítání složitosti - levý rozměr první matice x pravý rozměr poslední matice.
Proč? Součin vyprodukuje matice o rozměrech , takže musím ještě připočst součin těchto matic, což je .
Nakonec je otázka - jak se dobrat k výsledku? Vzdálenost znám, ale potřebuju i konstruktivní odpověď.
Pro každé pole si uložím číslo matice, na které druhý částečný součin začínal (nebo první končil - konzistentně!). Jakmile mám tabulku vyplněnou, jdu od spoda nahoru rekurzivně - výsledek rozdělím závorkami a poté opět hledám, jak rozdělit uzávorkované části.
Například: říká - výraz tak rozdělím na a hledám pole označené ( už je triviální součin). U najdu napsáno , takže celkové uzávorkování je .
Pro hledání nejlepšího uzávorkování délky budu muset porovnat čísel. Ke každému z těchto čísel také musím přičíst určitý součin. To, kolik polí budu muset vyplnit, záleží na řádku; mám-li matic a porovnávám-li násobení z nich, pak budu vyplňovat jenom polí (). Informaci o rozdělení držím společně s minimem, takže toto složitost neovlivní.
Pro matic tak musím vyplnit polí, což je . Při zpětném vyhledávání projdu nejhůře celou tabulku (ale nikdy se nebudu muset vracet, protože každé uzávorkování jednotlivé součiny pouze rozdělí). Složitost je tak .