L'utilisation de l'espace est au maximum de pour tous les algorithmes de type Strassen (c'est-à-dire ceux basés sur la limite supérieure du rang de multiplication matricielle algébriquement). Voir Complexité spatiale de l'algorithme Coppersmith – WinogradO(n2)
Cependant, j'ai réalisé dans ma réponse précédente que je n'avais pas expliqué pourquoi l'utilisation de l'espace était ... alors voici quelque chose de vague. Considérez ce que fait un algorithme de type Strassen. Il part d'un algorithme fixe pour multiplication de matrice qui utilise les multiplications pour une constante . En particulier, cet algorithme (quel qu'il soit) peut être écrit WLOG pour que:O(n2)K×KKcc<3
Il calcule différentes matrices qui multiplient les entrées de la première matrice par différents scalaires et matrices partir de la deuxième matrice d'une forme similaire,KcL1,…,LKcAKcR1,…,RKcB
Il multiplie ces combinaisons linéaires , puisLi⋅Ri
Il multiplie les entrées de par divers scalaires, ajoute toutes ces matrices jusqu'à entrywise pour obtenir .Li⋅RiA⋅B
(Il s'agit d'un algorithme dit "bilinéaire", mais il s'avère que chaque algorithme de multiplication matricielle "algébrique" peut être écrit de cette manière.) Pour chaque , cet algorithme n'a qu'à stocker le produit actuel et la valeur actuelle de (initialement définie sur tous les zéros) en mémoire à tout moment donné, de sorte que l'utilisation de l'espace est .i=1,…,KcLi⋅RiA⋅BO(K2)
Étant donné cet algorithme fini, il est ensuite étendu à des matrices arbitraires , en divisant les grandes matrices en blocs de dimensions , en appliquant l' algorithme fini aux matrices de blocs et en appelant récursivement l'algorithme chaque fois qu'il a besoin de multiplier deux blocs. À chaque niveau de récursivité, nous devons conserver uniquement les éléments de champ en mémoire (stocker différentes matrices ). En supposant que l'utilisation de l'espace pour la multiplication de la matrice estKℓ×KℓK×KKℓ−1×Kℓ−1K×KO(K2ℓ)O(1)Kℓ×KℓKℓ−1×Kℓ−1S(ℓ−1), l'utilisation de l'espace de cet algorithme récursif est , qui pour résout en .S(ℓ)≤S(ℓ−1)+O(K2ℓ)S(1)=2K2S(ℓ)≤O(K2ℓ)
Plus généralement, une multiplication matricielle rapide peut être effectuée sur processeurs en mémoire par processeur. Cependant, la communication entre les processeurs est alors sous-optimale. Une communication optimale peut être obtenue en utilisant plus de mémoire. Pour autant que je sache, on ne sait pas si une communication optimale et une mémoire optimale peuvent être obtenues simultanément. Les détails sont dans http://dx.doi.org/10.1007/PL00008264p O(n2/p)
la source