如何将代码表示为运行时分析的数学算法?

时间:2018-03-05 08:30:29

标签: algorithm math runtime theory analysis

假设我已经为矩阵乘法编写了一个小循环:

array1[2][2] = {
   {1, 2},
   {3, 4}
};
array2[2][2] = {
   {5, 6},
   {7, 8}
};
arrayOutput[2][2] = {
   {0, 0},
   {0, 0}
};

for (int x = 0; x < 2; x++){
    for (int y = 0; y < 2; y++){
        for (int z = 0; z < 2; z++){
            arrayOutput[x][y] += array1[x][z] * array2[z][y];
        }
    }
}

如何将其分解为用于计算运行时间的数学算法(一般而言,不仅仅是这一特定代码块的步骤)?

我已经阅读了很多关于如何将给定的数学算法分解为其最主要的运行时分析组件的材料,但是我还没有找到一个简单的解释如何获得一大块代码的数学表达式。事实上,我发现很难看到一大块代码与其数学表达式之间的关系;它们通常看起来相当遥远,而且我不完全掌握哪些数学符号与基本编程概念相关。

请按照我的说明进行解释,或者尽可能将其分解为简单的步骤;我可能一直在寻找有用的资源,只是不了解它们。

1 个答案:

答案 0 :(得分:0)

转换为

result = 0;
for (int i = a; i <= b; i++) {
    result = result + ...;
}

除了运算符和结果的初始化之外,

基本相同,因为乘法的中性元素是1而不是0的总和,所以它转换为

result = 1;
for (int i = a; i <= b; i++) {
    result = result * ...;
}

当我们讨论矩阵或向量的索引并且具有基于0的数组的编程语言时,我们必须减去一个,因为在数学中,向量中的第一个元素具有索引1而不是0.所以代码将变为for (int i = a - 1; i < b; i++)

类似地

意味着我们必须为矩阵中的每个元素执行此操作并转换为(对于基于0的矩阵,其维数为n * m):

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        c[i][j] = ...;
    }
}

这就解释了为什么在矩阵乘法示例中得到3个循环:

  • 矩阵中位置的2个循环
  • 总和的1个循环