NXN矩阵中的“广义对角线”是N个单元的选择,例如:
我正在寻找一种算法来找到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;
}
答案 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。