2011-02-05 4 views
2

A « diagonale généralisée » dans une matrice nxn est une sélection de N cellules, telles que:trouver une « diagonale généralisée » dans une matrice binaire

  1. Exactement une cellule est sélectionnée à partir de chaque rangée et de chaque colonne
  2. Chaque cellule sélectionnée contient une valeur non nulle

Je cherche un algorithme pour trouver une diagonale généralisée dans O (n^3). Il me semble que l'algorithme de programmation dynamique suivant est "assez bon", mais je ne suis pas sûr de savoir comment analyser sa complexité.

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

Vous cherchez de l'aide pour analyser l'algorithme ci-dessus, ou pour résoudre le problème dans O (n^3)? Je pense que j'ai un algorithme O (n^3) qui résout cela en utilisant une technique complètement différente, mais je ne veux pas le poster s'il est hors-sujet ici. Aussi, pouvez-vous donner plus de détails sur l'origine de cet algorithme? Je ne comprends pas comment cela fonctionne ou ce qu'il essaie de faire, et sans une description de haut niveau de la façon dont vous y êtes arrivé, je ne suis pas certain de pouvoir vous aider. – templatetypedef

Répondre

3

L'algorithme exécute dans le pire des cas, un temps exponentiel, car la matrice suivante

11111 
11111 
11111 
11111 
00000 

il va essayer sur les n! combinaisons possibles. Pour la solution de temps polynomiale, créez un graphique bipartite à l'aide de la matrice et trouvez perfect matching.

Par exemple, avec la matrice

011 
101 
001 

de créer le graphique

A X 
B Y 
C Z 

avec des bords A-> Y, A-> Z, B-> X, B-> Z, C -> Z.

+0

Merci pour l'analyse et l'algorithme amélioré. – ripper234

Questions connexes