使用以下函数和其他代码,并对其进行编码以便运行,它会计算自己的行数。
typedef double Matrix[100][100];
void multiply(Matrix A, Matrix B, Matrix C, int n)
{
//n is the actual matrix order
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];
}
}
所以我很难理解我应该做些什么。我不确定这个特定问题的行数是多少。如果有人能够澄清我需要做什么,那将是一个很大的帮助,这就是我所要求的。
我被问到的是什么: 编写一个将int变量lc初始化为零的main,并输入n来调整矩阵的大小。通过参考乘法函数传递lc。让它以执行的代码行数返回,并与n一起打印出来。您还应该将矩阵A和B初始化为Hilbert矩阵(第i个条目为1.0 /(i + j + 1))。测试n = 3,这样你的产品将是3x3希尔伯特矩阵平方(只是为了确保你的代码有效)。然后,将其设置为运行两次:一次为n = 50,再次为n = 100.注意n = 100的时间,它应该是n = 50所需时间的8倍。
答案 0 :(得分:2)
问题是“在运行时编码,计算自己的行数”,这意味着“检测代码,以便每行代码都被计算”
如果计算for循环中执行的语句数从0到9,for循环初始化器将为1,循环比较为11(因为您对索引10进行一次比较以实现循环结束),循环增量为10,循环中每个内容语句为10。总数为32,与10(循环的大小)成比例,因此复杂度为O(N)
如果计算嵌套for循环中执行的语句数,其中两个循环都从0到9运行,则外循环初始化程序将为1,外循环比较将为11(因为您将索引10与实现循环结束),外循环增量为10,外循环中每个内容语句为10:内循环初始化器为10 * 1,内循环比较为10 * 11,10 * 10为内循环增量和循环中每个内容语句的10 * 10。总计352与10 ^ 2(环的大小的平方)成比例,因此复杂度为O(N ^ 2)
由于你的乘法函数有从0到n的三个循环,因此复杂度为O(n ^ 3)
以下是我如何设计代码来计算语句:
#include <stdio.h>
#include <math.h>
#define N 10
int count=0;
void simpleloop()
{
count=0;
++count; int sum=0; // 1 for this line
++count; for(int i=0; // 1 for this line
++count, i<N; // N+1 for this line (i=0 through i=N inclusive)
++count, ++i) // N for this line (i=0 through i=N-1 inclusive)
{
++count; sum+=i; // N for this line (i=0 through i=N-1 inclusive)
}
++count; printf("sum=%d\n",sum); // 1 for this line
}
void nestedloop()
{
count=0;
++count; int sum=0; // 1 for this line
++count; for(int i=0; // 1 for this line
++count, i<N; // N+1 for this line (i=0 through i=N inclusive)
++count, ++i) // N for this line (i=0 through i=N-1 inclusive)
{
++count; for(int j=0; // N for this line
++count, j<N; // N*(N+1) for this line N*(j=0 through j=N inclusive)
++count, ++j) // N*N for this line N*(j=0 through j=N-1 inclusive)
{
++count; sum+=i*N+j; // N*N for this line N*(j=0 through j=N-1 inclusive)
}
}
++count; printf("sum=%d\n",sum); // 1 for this line
}
typedef double Matrix[100][100];
void multiply(Matrix A, Matrix B, Matrix C, int n)
{
count=0;
// n is the actual matrix order
++count; for (int i = 0; // 1 for this line
++count, i < n; // n+1 for this line
++count, ++i) // n for this line
{
++count; for (int j = 0; // n for this line
++count, j < n; // n*(n+1) for this line
++count, ++j) // n*n for this line
{
++count; C[i][j] = 0; // n*n for this line
++count; for (int k = 0; // n*n for this line
++count, k < n; // n*n*(n+1) for this line
++count, ++k) // n*n*n for this line
{
++count; C[i][j] += A[i][k] * B[k][j]; // n*n*n for this line
}
}
}
}
int main()
{
printf("simpleloop:\n");
simpleloop();
printf("count=%d O(N^%d)\n\n",count,(int)log10(count/N)+1); // total counts = 3N + 4 -> O(N)
printf("nestedloop:\n");
nestedloop();
printf("count=%d O(N^%d)\n\n",count,(int)log10(count/N)+1); // total counts = 3N^2 + 4N + 4 -> O(N^2)
Matrix A={},B={},C={};
printf("multiply:\n");
multiply(A,B,C,N);
printf("count=%d O(N^%d)\n\n",count,(int)log10(count/N)+1); // total counts = 3N^3 + 5N^2 + 4N + 2 -> O(N^3)
return 0;
}
计算语句与计算行数略有不同,因为for循环有三个语句加上循环的内容。我认为它更好地衡量发生的事情的数量,但这并不是你的问题所要求的,所以如果你真的想要行,你将不得不从循环比较和循环增量中删除计数。复杂性将保持不变。