【发布时间】:2014-08-24 15:03:28
【问题描述】:
我开始学习如何实现分而治之的算法,但我在这个练习中遇到了一些严重的问题。 我编写了一个算法,它使用分治法找到给定向量中的最小值:
int minimum (int v[], int inf, int sup)
{
int med, m1, m2;
if (inf == sup)
return v[inf];
med = (inf+sup)/2;
m1 = minimum (v, inf, med);
m2 = minimum (v, med+1, sup);
if (m1 < m2)
return m1;
else
return m2;
}
而且它有效。现在,我必须在矩阵上做同样的练习,但我迷路了。具体来说,我被告知要执行以下操作: 设 n = 2^k。考虑一个 nxn 方阵。使用递归函数计算其最小值
double (minmatrix(Matrix M))
return minmatrix2(M, 0, 0, M.row);
(给出了 Matrix 类型,您可以想象 M.row 给出了矩阵的行数和列数)。使用辅助功能
double minmatrix2(Matrix M, int i, int j, int m)
这必须使用递归分治算法来完成。 所以..我想不出办法。有人建议我每次将矩阵分成 4 个部分(从 (i,j) 到 (i+m/2, j+m/2),从 (i+m/2,j) 到 (i +m,j+m/2), 从 (i,j+m/2) 到 (i+m/2,j+m), 从 (i+m/2,j+m/2) 到 (i +m,j+m)) 并尝试实现与我为数组编写的代码类似的代码。但我似乎无法做到。有什么建议?即使您不想发布完整的答案,也请给我一些指示。我真的很想明白这一点。
编辑:好的,我已经完成了。我发布了我使用的代码,以防其他人有同样的疑问。
double minmatrix2(Matrix M, int i, int j, int m)
{
int a1, a2, a3, a4;
if (m == 1)
return M[i][j];
else
a1 = minmatrix2(M, i, j, m/2);
a2 = minmatrix2(M, i+(m/2), j, m/2);
a3 = minmatrix2(M, i, j+(m/2), m/2);
a4 = minmatrix2(M, i+(m/2), j+(m/2), m/2);
if (min (a1, a2) < min (a3, a4))
return min (a1, a2);
else
return min (a3, a4);
}
(函数 min 在别处定义)
【问题讨论】:
标签: c++ recursion matrix divide-and-conquer