一个函数的行数

时间:2017-03-22 00:55:26

标签: c++

使用以下函数和其他代码,并对其进行编码以便运行,它会计算自己的行数。

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倍。

1 个答案:

答案 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循环有三个语句加上循环的内容。我认为它更好地衡量发生的事情的数量,但这并不是你的问题所要求的,所以如果你真的想要行,你将不得不从循环比较和循环增量中删除计数。复杂性将保持不变。