划分和征服算法:找到矩阵的最小值

时间:2014-07-03 13:07:32

标签: c++ recursion matrix divide-and-conquer

我开始学习如何实施分而治之的算法,但我在这项练习中遇到了一些严重的问题。 我编写了一个算法,使用分而治之的方法找到给定向量中的最小值:

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在别处定义)

1 个答案:

答案 0 :(得分:1)

考虑到C或C ++中的2D矩阵通常在1D阵列之上实现为访问器函数。您已经知道如何为一维数组执行此操作,因此唯一的区别是您如何处理单元格。如果你这样做,你的表现本质上是最佳的,因为你将一起处理相邻的单元格。

或者,考虑2D矩阵具有两个维度N和M.只需沿着较大的维度将其分成两半,直到较大的维度小于X,停止一些合理的值并依次进行实际计算。这不是完全最优的,因为你必须跳过&#34;跳过&#34;当你处理内存时,在矩阵的一部分上。

最后一个想法是首先除以主要维度,然后除以次要维度。在C中,这意味着除以行,直到您有单行,然后在每一行上运行您的一维数组算法。这可以产生大致最佳的性能。