在二进制矩阵中找到“广义对角线”

时间:2011-02-05 12:18:07

标签: algorithm matrix dynamic-programming

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

  1. 从每行和每列中选择一个单元格
  2. 每个选定的单元格都包含非零值
  3. 我正在寻找一种算法来找到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;
    }
    

1 个答案:

答案 0 :(得分:3)

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

 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。