【问题标题】:Finding a "generalized diagonal" in a binary matrix在二进制矩阵中找到“广义对角线”
【发布时间】:2011-06-21 20:43:01
【问题描述】:

NXN 矩阵中的“广义对角线”是 N 个单元的选择,例如:

  1. 从每一行和每一列中只选择一个单元格
  2. 每个选定的单元格都包含一个非零值

我正在寻找一种算法来找到 O(n^3) 中的广义对角线。在我看来,以下动态规划算法“足够好”,但我不确定如何分析它的复杂性。

Set<Set<Integer>> failedCache = new HashSet<Set<Integer>>();

List<Integer> find(int[][] matrix, Set<Integer> used, int row) {
    int N = matrix.length;
    if (failedCache.contains(used))
        return null;

    if (row == N) return new ArrayList<Integer>();

    for (int col = 0; col < N; ++col) {
        if (matrix[row][col] == 0)
            continue;

        if (used.contains(col))
            continue;

        Set<Integer> newUsed = new HashSet<Integer>(used);
        newUsed.add(col);
        List<Integer> answer = find(matrix, newUsed, row + 1);
        if (answer != null) {
            answer.add(col);
            return answer;
        }
    }

    failedCache.add(used);
    return null;
}

【问题讨论】:

  • 您是在寻求帮助分析上述算法,还是在 O(n^3) 中解决问题?我认为我有一个 O(n^3) 算法可以使用完全不同的技术解决这个问题,但如果它在这里偏离主题,我不想发布它。另外,您能否详细说明该算法的来源?我不明白它是如何工作的或它试图做什么,而且如果没有对你是如何做到这一点的高级描述,我不确定我能提供多少帮助。

标签: algorithm matrix dynamic-programming


【解决方案1】:

算法在最坏情况下以指数时间运行,因为在以下矩阵上

 11111
 11111
 11111
 11111
 00000

它会尝试大约 n!可能的组合。

对于多项式时间解,使用矩阵创建二分图,并找到perfect matching

以矩阵为例

 011
 101
 001

你创建图表

 A    X
 B    Y
 C    Z

带有边 A->Y、A->Z、B->X、B->Z、C->Z。

【讨论】:

  • 感谢您的分析和改进的算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多