令m,n为整数,使得0 <= m,n <1。 N.
定义:
Algorithm A: Computes m + n in time O(A(N))
Algorithm B: Computes m*n in time O(B(N))
Algorithm C: Computes m mod n in time O(C(N))
使用算法A,B和C的任何组合描述了用于N×N矩阵加法和矩阵乘法的算法,其具有Z / NZ中的条目。同时指出算法的运行时间大O表示法。
尝试解决方案:
在Z / NZ中添加N X N: 令A和B为Z / NZ中的NXN矩阵,其中条目a_ {ij}和b_ {ij}使得i,j在{0,1,...,N}中,其中i表示行,j表示列在矩阵中。另外,让A + B = C
Step 1. Run Algorithm A to get a_{ij} + b_{ij} = c_{ij} in time O(A(N))
Step 2. Run Algorithm C to get c_{ij} mod N in time O(C(N))
对{0,1,...,N}中的所有i,j重复步骤1和2。
这意味着我们必须重复1,2 N ^ 2次的步骤。所以总运行时间由
估算 N^2[ O(A(N)) + O(C(N)) ] = O(N^2 A(N)) + O(N^2 C(N)) = O(|N^2 A(N)| + |(N^2 C(N)|).
对于乘法算法,我刚刚用算法B替换了步骤1,并且总运行时间为O(|N^2 B(N)| + |(N^2 C(N)|)
,如上所述。
请告诉我是否正确接近此问题,尤其是使用big-O表示法。
感谢。
答案 0 :(得分:0)
matrix multiplication的算法是错误的,并且会产生错误的答案,因为A*B_{i,j} != A_{i,j} * B_{i,j}
(除了像零矩阵这样的特殊情况外)
我认为问题的目标不是实现有效的矩阵乘法,因为它是一个很难且仍在研究的问题,所以我将回答矩阵乘法的天真实现。
对于任何指数i,j:
(AB)_{i,j} = Sum( A_{i,k} * B_{k,j}) =
= A_{i,1} * B_{1,j} + A_{i,2} * B_{2,j} + ... + A_{i,k} * B_{k,j} + ... + A_{i,n} * B_{n,j}
正如您所看到的,对于每对i,j
,有n
次乘法和n-1
次加法ץ关于C
的调用次数 - 这取决于您是否需要调用它在每次添加之后,或者在完成后只执行一次(这实际上取决于您需要代表每个数字的位数),因此对于每对i,j
- 您可能需要它从一次到{{1调用。
这给出了我们的总复杂度(假设每个(i,j)对的2n-1 modolus,如果需要更少,如上所述 - 相应调整):
2n-1
作为旁注,显示您的算法的良好健全性检查确实是错误的 - 证明矩阵乘法不能比O(n^3*A + n^3*B + n^3*C)
(Raz,2002)更好,并且最佳当前实现是{ {1}}
答案 1 :(得分:0)
#include <stdio.h>
void main()
{
int i, j;
int a[3][3], b[3][3];
printf("enter elements for 1 matrix\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", &a[i][j]);
}
printf("\n");
}
printf("enter elements for 2 matrix\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", &b[i][j]);
}
printf("\n");
}
printf("the sum of matrix 1 and 2\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d\n", (a[i][j] + b[i][j]));
}
printf("\n");
}
}