Requisito de memória para multiplicação rápida de matrizes


12

Suponha que desejamos multiplicar matrizes. O algoritmo de multiplicação de matriz lenta é executado no tempo O ( n 3 ) e usa memória O ( n 2 ) . A multiplicação mais rápida da matriz ocorre no tempo n ω + o ( 1 ) , onde ω é a álgebra linear constante, mas o que se sabe sobre sua complexidade de memória?n×nO(n3)O(n2)nω+o(1)ω

Parece que é possível a priori que a rápida multiplicação de matrizes consuma memória. Existe alguma garantia de que isso possa ser feito na memória O ( n 2 ) ? É o caso de os algoritmos de multiplicação de matriz atualmente conhecidos usarem memória O ( n 2 ) ?nωO(n2)O(n2)

(Na verdade, estou interessado na multiplicação de matrizes retangulares, mas presumo que a resposta seja a mesma nesse caso que no caso quadrado e o caso quadrado seja melhor estudado.)

Respostas:


16

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

  1. 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,KcL1,,LKcAKcR1,,RKcB

  2. Multiplica essas combinações lineares , em seguida,LiRi

  3. Multiplica entradas de por vários escalares, em seguida, adiciona todas essas matrizes acima entrywise obter Um B .LiRiAB

(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 iR 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,,KcLiRiABO(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×KK×KK1×K1K×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×KK1×K1S(1)S()S(1)+O(K2)S(1)=2K2resolve para .S()O(K2)


Para qualquer algoritmo no estilo Strassen, isso me parece correto. Mas Coppersmith-Winograd também provou que chegar a realmente requer uma sequência infinita de algoritmos no estilo Strassen, cada um dos quais se aproxima cada vez mais do verdadeiro expoente. De fato, os algoritmos no estilo CW e no estilo CU fornecem essas seqüências (embora não se aproximem de ω , tanto quanto sabemos). Sobre os racionais, é possível que as constantes usadas nessa sequência cresçam muito rapidamente, para que "o algoritmo " n ω possa acabar usando o espaço ω ( n 2 ) . nωωnωω(n2)
Joshua Grochow

1
... Mas, pelo seu argumento, sempre é possível obter um algoritmo no tempo e no espaço O ( n 2 ) para qualquer δ > 0 . O(nω+δ)O(n2)δ>0
Joshua Grochow

f(i)n2i=0,...,knω+o(1)n2+o(1)

kfkf1fkkn2+o(1)

nkknf(k(n))=no(1)k(n)nnω+o(1)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.