2017-09-12 6 views
0

マイCSの先生は、それがN の時間計算量で実行するには、このコードに「小さな変更を加える」ために私たちを尋ねた - Nの代わりに、通常のN の。私は私の人生のためにそれを理解することはできませんし、誰かが知ってしまったのだろうかと思っていました。私は彼がstrassensメソッドについて話しているとは思わない。 私はそれを見てから、おそらく彼は正方形(対角線)の行列を気にしているという事実を利用することができました。ナイーブ行列乗算改善

void multiply(int n, int A[][], int B[][], int C[][]) { 
    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      C[i][j] = 0; 
      for (int k = 0; k < n; k++) 
      { 
       C[i][j] += A[i][k]*B[k][j]; 
      } 
     } 
    } 
} 
+4

これは宿題の修了サービスではないため、この質問をオフトピックとして閉じるよう投票しています。あなたが課題を理解したり完了したりすることに問題がある場合は、教えてくれた講師に助けを求めてください。彼らはあなたにそれを提供するために支払われています。 STOPタグのスパム。あなたは明らかにJavaとC++を同時に使用していないので、どちらも適用できません。タグには意味と意味があります。彼らはよく知られているので、単にそれらを追加しないでください。タグのスパミングは、下降音を得るための素早い方法です。 –

+0

あなたの質問は非常に不正確です。 「時間の複雑さ」とは何ですか?例えば。 N個のプロセッサを有するマシンは、O(N^2)時間の行列を掛けることができる。実行時間はマシンモデルによって異なります。従来、行列アルゴリズムの効率は行列要素の算術演算で測定されていました。あなたの教師はおそらく 'C [i] [j] = 0'を' C [i] [j] = A [i] [0] * B [0]に変更することによってN^] [j] 'を実行し、' k = 1'で内側の 'for'ループを開始します。実際にはこれはダムです。良いコンパイラはループアンローリングの最適化の一部としてそれを行います。 – Gene

答えて

3

あなたはO(N )で行列の乗算を達成することはできません。ただし、複雑さを改善するには、O(N )があります。線形代数では、8から7への各2×2サブマトリクスに必要な乗算の数を減らすことによってO(N 2.807までの時間の複雑さを低減Strasensアルゴリズムのようなアルゴリズムがある

Coppersmith Winogradアルゴリズムであります最良の時間複雑度を有する最も速い既知の行列乗算アルゴリズムO(N 2.3729