【问题标题】:Divide and conquer algorithm: find the minimum of a matrix分治算法:求矩阵的最小值
【发布时间】: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


    【解决方案1】:

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

    或者,考虑一个二维矩阵有两个维度 N 和 M。只需沿着较大的维度重复将其分成两半,直到较大的维度小于 X,一个合理的值来停止并按顺序进行实际计算。这并不是完全最优的,因为您在寻址内存时必须“跳过”矩阵的某些部分。

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

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 2011-06-18
      • 2016-02-04
      • 2015-09-05
      • 2019-03-13
      • 2011-01-19
      • 1970-01-01
      • 2021-11-20
      • 2012-05-02
      相关资源
      最近更新 更多