2010-09-18 31 views
9

Dada una matriz N * N con 1's un 0 en ellas y dado un número entero k, ¿cuál es el mejor método para encontrar una región rectangular tal que tenga k 1 en ella ???Región rectangular en una matriz

+0

Pregunta interesante. ¿Estás buscando una sola región? ¿Qué tan grande son normalmente N yk, y cuál es la distribución de probabilidad de 1 y 0? ¿Qué tan rápido debe ser el algoritmo? Supongo que no sabes las respuestas, porque esta es una pregunta de entrevista, pero eso es lo que preguntaría. –

+0

Es bastante esencial saber un poco más. Si p es la probabilidad de 1, y k/p es mucho más pequeño que N, entonces la forma * más fácil * es simplemente probar una sola fila o columna. Tome una región 1xk, cuente el número de unidades, luego agregue celdas hasta el final hasta que tenga k. Si k/p es mucho más pequeño que N, tiene una alta probabilidad de funcionar. Por supuesto, si una fila no cumple con los requisitos, puede pasar a la siguiente ... tiene N de ellos, después de todo. Pero, ¿qué es 'mejor' de todos modos? ¿El mejor peor caso? ¿Mejor tiempo promedio de casos? El área del rectángulo de resultado más pequeño? – Joren

+1

Una pregunta similar está aquí: http://stackoverflow.com/questions/1726632/dynamic-programming-largest-square-block – bobobobo

Respuesta

2

consideran este problema más sencillo:

dado un vector de tamaño N que contiene sólo los valores 1 y 0, encontrar una subsecuencia que contiene exactamente k valores de 1 en ella.

Let A el vector dado y S[i] = A[1] + A[2] + A[3] + ... + A[i], lo que significa el número de 1s existen en la subsecuencia A[1..i].

Por cada i, estamos interesados ​​en la existencia de un j <= i tal que S[i] - S[j-1] == k.

Podemos encontrar esto en O(n) con una tabla hash utilizando la siguiente relación:

S[i] - S[j-1] == k => S[j-1] = S[i] - k

let H = an empty hash table 
for i = 1 to N do 
    if H.Contains (S[i] - k) then your sequence ends at i 
    else 
    H.Add(S[i]) 

Ahora podemos usar esto para resolver su problema dado en O(N^3): para cada secuencia de filas en su matriz dada (hay O(N^2) secuencias de filas), considere esa secuencia para representar un vector y aplicarle el algoritmo anterior. El cálculo de S es un poco más difícil en el caso de la matriz, pero no es tan difícil de entender. Déjeme saber si usted necesita más detalles.

Actualización: He aquí cómo el algoritmo trabajaría en la siguiente matriz, suponiendo k = 12:

0 1 1 1 1 0 
0 1 1 1 1 0 
0 1 1 1 1 0 

Considérese la primera fila solo:

0 1 1 1 1 0 

Se deben considerar un vector 0 1 1 1 1 0 y aplique el algoritmo para el problema más simple: encontramos que no hay subsecuencias sumando hasta 12, así que seguimos adelante.

Consideremos las dos primeras filas:

0 1 1 1 1 0 
0 1 1 1 1 0 

consideran que son el vector 0+0 1+1 1+1 1+1 1+1 0+0 = 0 2 2 2 2 0 y aplicar el algoritmo para el problema más simple en él: de nuevo, sin subsecuencia que se suma a 12, por lo que seguir adelante.

en cuenta las tres primeras filas:

0 1 1 1 1 0 
0 1 1 1 1 0 
0 1 1 1 1 0 

consideran que son el vector 0 3 3 3 3 0 y aplicar el algoritmo para el problema más simple en él: nos encontramos con la secuencia de arranque en la posición 2 y termina en la posición 5 para ser la solución. De esto podemos obtener todo el rectángulo con contabilidad simple.

+0

¿Qué quiere decir con "secuencia de filas en su matriz dada"? – yassin

+0

@Yassin Ezbakhe - Me refiero a una secuencia consecutiva de filas. Considere una matriz que tiene 5 filas numeradas del 1 al 5. Las filas 2, 3 y 4 forman una secuencia de filas. Trate esas filas como un vector (las columnas de esas filas son elementos del vector) y aplique el algoritmo para resolver el problema más simple. Como hay 'O (N^2)' tales secuencias de filas y el algoritmo para el problema más simple es 'O (N)' y debe aplicarse en todas las secuencias de filas, la complejidad total de la solución es cúbica. – IVlad

+0

Si tiene la matriz [[0,1,1,1,1,0], [0,1,1,1,1,0], [0,1,1,1,1,0]], ¿cómo extraerías el rectángulo de 3x4 todos los unos? – yassin

3

Puedo hacerlo con O (N^3 * log (N)), pero seguro que la mejor solución es más rápida. Primero crea otra matriz N * N B (la matriz inicial es A). La lógica de B es la siguiente:

B[i][j] - is the number of ones on rectangle in A with corners (0,0) and (i,j). 

puede evaluar B para O (N^2) por programación dinámica: B [i] [j] = B [i-1] [j] + B [ i] [j-1] - B [i-1] [j-1] + A [i] [j].

Ahora es muy fácil resolver este problema con O (N^4) iterando sobre toda la parte inferior derecha (i = 1..N, j = 1..N, O (N^2)), left-bottom (z = 1..j, O (N)), y right-upper (t = 1..i, O (N)) y obtienes el número de unidades en este rectángulo con la ayuda de B:

sum_of_ones = B[i][j] - B[i][z-1] - B[t-1][j] + B[t-1][z-1]. 

Si obtuvo exactamente k: k == sum_of_ones, entonces sale el resultado.

Para convertirlo en N^3 * log (N), debe encontrar la posición superior derecha mediante la búsqueda binaria (por lo tanto, no solo itere todas las celdas posibles).

Cuestiones relacionadas