Submatriz cuadrada contigua más grande de elementos "verdaderos"

Esta es una pregunta de entrevista: dada una matriz booleana, encuentre el tamaño de la submatriz cuadrada contigua más grande, que contiene solo elementos "verdaderos".

Encontré este pregunta en SO pero no entendí la respuesta. El algoritmo propuesto mueve una línea diagonal desde la parte superior izquierda a la parte inferior derecha y realiza un seguimiento de los rectángulos de los elementos "verdaderos" a medida que avanza la línea.

Mis preguntas:

  • ¿Cómo hacer un seguimiento de los rectángulos en el algoritmo?
  • ¿Por qué movemos el diagonal ¿línea? ¿Qué pasa si movemos una línea vertical/horizontal o ambas?
  • ¿Cómo calcular la complejidad del algoritmo?

preguntado el 29 de julio de 12 a las 20:07

@SINTER Gracias. Sin embargo, la parte más interesante de la respuesta no está clara. Dicen que hay una solución DP de O(N*N) para cuadrado submatriz, pero no dio más detalles al respecto. Creo que eso es exactamente lo que estoy buscando. -

1 Respuestas

No puedo entender la respuesta en el enlace que pusiste, y no creo que la complejidad dada allí sea óptima para su problema. (Afirma que hay un O(N^(3/2)*logN) algoritmo donde N=n*n es el número de elementos en la matriz original.)

para tu mayor cuadrado problema de submatriz, se tiene un algoritmo DP cuya complejidad es lineal con el número de elementos:

Sea la matriz original A[n][n], estamos tratando de encontrar una matriz B[n][n], Donde B[i][j] indica el tamaño de la submatriz cuadrada más grande cuyo elemento inferior derecho es A[i][j]. Así que,

for (i = 0 ; i < n ; ++i)
  for (j = 0 ; j < n ; ++j) 
    if (A[i][j] == 0) B[i][j] = 0;
    else {
      if (B[i-1][j] != B[i][j-1]) {
        B[i][j] = min(B[i-1][j], B[i][j-1]) + 1
      } else {
        if (A[i-B[i-1][j]][j-B[i-1][j]] == 1)
          B[i][j] = B[i-1][j] + 1;
        else
          B[i][j] = B[i-1][j];
      }
    }

Y el mayor B[i][j] es la respuesta.

ps No revisé el rango de la matriz para simplificar. Simplemente puede considerar que los elementos fuera de rango son cero.

contestado el 23 de mayo de 17 a las 13:05

¡Estupendo! Muchas gracias. Parece la solución que estoy buscando. - Michael

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.