Временная сложность алгоритма умножения матрицы

Я придумал этот алгоритм для матричного умножения. Я где-то читал, что матричное умножение имеет временную сложность 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]

Ответ 1

Наивный алгоритм, который есть у вас после того, как вы исправили его, как отмечено в комментариях, - это O (n ^ 3).

Существуют алгоритмы, которые несколько уменьшают это, но вы вряд ли найдете реализацию O (n ^ 2). Я считаю, что вопрос об наиболее эффективной реализации все еще открыт.

Для получения дополнительной информации см. эту статью в википедии Matrix Multiplication.

Ответ 2

Используя линейную алгебру, существуют алгоритмы, которые достигают лучшей сложности, чем наивная O (n 3). Алгоритм Solvay Strassen достигает сложности O (n 2.807) за счет уменьшения количества умножений, требуемых для каждого субстрата 2x2, матрица от 8 до 7.

Самый быстрый алгоритм матричного умножения - алгоритм Coppersmith-Winograd со сложностью O (n 2.3737). Если матрица не огромна, эти алгоритмы не приводят к огромной разнице в времени вычислений. На практике проще и быстрее использовать параллельные алгоритмы для матричного умножения.

Ответ 3

Стандартный способ умножения матрицы m-на-n на матрицу n-by-p имеет сложность O (mnp). Если все они "n" вам, то O (n ^ 3), а не O (n ^ 2). EDIT: в общем случае он не будет O (n ^ 2). Но существуют более быстрые алгоритмы для конкретных типов матриц - если вы знаете больше, вы сможете сделать лучше.

Ответ 4

В матричном умножении есть 3 для цикла, мы используем, так как выполнение каждого цикла for требует сложности времени O(n). Таким образом, для трех циклов он становится O(n^3)