web-dev-qa-db-fra.com

algorithme de multiplication matricielle complexité temporelle

J'ai trouvé cet algorithme pour la multiplication matricielle. J'ai lu quelque part que la multiplication matricielle a une complexité temporelle de o (n ^ 2). Mais je pense que mon algorithme donnera o (n ^ 3). Je ne sais pas comment calculer la complexité temporelle des boucles imbriquées. Veuillez donc me corriger.

for i=1 to n
   for j=1 to n    
     c[i][j]=0
     for k=1 to n
         c[i][j] = c[i][j]+a[i][k]*b[k][j]
19
zedai

L'algorithme naïf, qui est ce que vous avez une fois que vous le corrigez comme indiqué dans les commentaires, est O (n ^ 3).

Il existe des algorithmes qui réduisent quelque peu cela, mais vous ne trouverez probablement pas d'implémentation O (n ^ 2). Je pense que la question de la mise en œuvre la plus efficace reste ouverte.

Voir cet article wikipedia sur Matrix Multiplication pour plus d'informations.

19
Don Roby

En utilisant l'algèbre linéaire, il existe des algorithmes qui atteignent une meilleure complexité que le naïf O (n3). Solvay Strassen l'algorithme atteint une complexité de O (n2,807) en réduisant le nombre de multiplications nécessaires pour chaque sous-matrice 2x2 de 8 à 7.

L'algorithme de multiplication de matrice le plus rapide connu est Coppersmith-Winograd algorithme avec une complexité de O (n2,3737). À moins que la matrice ne soit énorme, ces algorithmes n'entraînent pas une grande différence de temps de calcul. En pratique, il est plus facile et plus rapide d'utiliser des algorithmes parallèles pour la multiplication matricielle.

41
viswanathgs

La manière standard de multiplier une matrice m-par-n par une matrice n-par-p a la complexité O (mnp). Si tout cela est "n" pour vous, c'est O (n ^ 3), pas O (n ^ 2). EDIT: ce ne sera pas O (n ^ 2) dans le cas général. Mais il existe des algorithmes plus rapides pour des types particuliers de matrices - si vous en savez plus, vous pourrez peut-être faire mieux.

10
Sean Owen

Dans la multiplication matricielle, il y a 3 pour la boucle, nous utilisons car l'exécution de chaque boucle nécessite une complexité temporelle O(n). Donc, pour trois boucles, cela devient O(n^3)

1
user2024721