我开始学习如何实现分治算法,但是我在这个练习中遇到了一些严重的麻烦。 我已经写指找到使用分在给定的矢量的最小值的算法和方法克服:分而治之算法:找到一个矩阵的最小值
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。考虑一个n×n方阵。使用递归函数
double (minmatrix(Matrix M))
return minmatrix2(M, 0, 0, M.row);
计算其最小值(矩阵类型给出,并且作为可以想像M.row给出行和矩阵的列数)。使用辅助功能
double minmatrix2(Matrix M, int i, int j, int m)
这必须使用递归除法和征服算法完成。 所以..我想不出一个办法。 (i,j)到(i + m/2,j + m/2),从(i + m/2,j)到(i (i + m/2,j + m/2)到(i,m + 2,j + m) + 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);
}
(功能分钟别处定义)