O uso de espaço é no máximo para todos os algoritmos do tipo Strassen (ou seja, aqueles baseados no limite superior do ranking de multiplicação de matrizes algebricamente). Consulte Complexidade espacial do algoritmo Coppersmith – WinogradO ( n2)
No entanto, percebi na minha resposta anterior que não expliquei por que o uso do espaço é ... então aqui vai algo ondulado à mão. Considere o que um algoritmo do tipo Strassen faz. Começa a partir de um algoritmo fixo para K × K matriz de multiplicação que usa K c multiplicações para alguma constante c < 3 . Em particular, esse algoritmo (seja ele qual for) pode ser escrito no WLOG para que:O ( n2)K× KKcc < 3
Ele calcula diferentes matrizes L 1 , … , L K c que multiplicam as entradas da primeira matriz A por vários escalares e K c matrizes R 1 , … , R K c da segunda matriz B de uma forma semelhante,Kceu1, … , LKcAKcR1,…,RKcB
Multiplica essas combinações lineares , em seguida,Li⋅Ri
Multiplica entradas de por vários escalares, em seguida, adiciona todas essas matrizes acima entrywise obter Um ⋅ B .Li⋅RiA⋅B
(Esse é um algoritmo chamado "bilinear", mas acontece que todo algoritmo de multiplicação de matrizes "algébrico" pode ser escrito dessa maneira.) Para cada , esse algoritmo precisa apenas armazenar o produto atual L i ⋅ R i e o valor atual de A ⋅ B (inicialmente definido como todos os zeros) na memória em um determinado ponto, portanto, o uso do espaço é O ( K 2 ) .i=1,…,KcLi⋅RiA⋅BO(K2)
Dado este algoritmo finito, isto é, em seguida, estendida para arbitrária matrizes, por quebrar as grandes matrizes em K × K blocos de dimensões K ℓ - 1 × K l - 1 , aplicando-se o finito K × K algoritmo para o bloco matrizes e chamando recursivamente o algoritmo sempre que precisar multiplicar dois blocos. Em cada nível de recursão, precisamos manter apenas os elementos do campo O ( K 2 ℓ ) na memória (armazenando O ( 1 )Kℓ×KℓK×KKℓ−1×Kℓ−1K×KO(K2ℓ)O(1)diferente matrizes). Supondo que o uso de espaço para a multiplicação da matriz K ℓ - 1 × K ℓ - 1 seja S ( ℓ - 1 ) , o uso de espaço desse algoritmo recursivo é S ( ℓ ) ≤ S ( ℓ - 1 ) + O ( K 2 ℓ ) , que para S ( 1 ) = 2 K 2Kℓ×KℓKℓ−1×Kℓ−1S(ℓ−1)S(ℓ)≤S(ℓ−1)+O(K2ℓ)S(1)=2K2resolve para .S(ℓ)≤O(K2ℓ)
fonte