web-dev-qa-db-ja.com

行列乗算アルゴリズムの時間計算量

行列乗算のためにこのアルゴリズムを思いつきました。私はどこかで、行列の乗算にはo(n ^ 2)の時間計算量があることを読みました。しかし、このアルゴリズムはo(n ^ 3)を与えると思います。ネストされたループの時間の複雑さを計算する方法がわかりません。だから私を修正してください。

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

コメントに記載されているように修正すると、単純なアルゴリズムがO(n ^ 3)になります。

これをいくらか減らすアルゴリズムは存在しますが、O(n ^ 2)実装を見つける可能性は低いです。最も効率的な実装の問題は未解決のままだと思います。

詳細については、ウィキペディアの Matrix Multiplication に関する記事を参照してください。

19
Don Roby

線形代数を使用すると、単純なO(n3)。 Solvay Strassen アルゴリズムはO(n2.807)各2x2サブマトリックスに必要な乗算の数を8から7に減らすことにより。

最速の既知の行列乗算アルゴリズムは、 Coppersmith-Winograd O(nの複雑度を持つアルゴリズムです。2.3737)。マトリックスが巨大でない限り、これらのアルゴリズムは計算時間に大きな違いをもたらしません。実際には、行列乗算に並列アルゴリズムを使用する方が簡単で高速です。

41
viswanathgs

M行n列の行列にn行p列の行列を掛ける標準的な方法には、O(mnp)の複雑さがあります。それらがすべて「n」である場合、O(n ^ 2)ではなくO(n ^ 3)です。編集:一般的なケースではO(n ^ 2)にはなりません。しかし、特定のタイプのマトリックスにはより高速なアルゴリズムがあります。より多くのことを知っていれば、より良くできるかもしれません。

10
Sean Owen

行列の乗算では、forループが3つあります。各forループの実行には時間の複雑さO(n)が必要なため、使用しています。したがって、3つのループではO(n^3)になります

1
user2024721