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
Respuesta
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.
¿Qué quiere decir con "secuencia de filas en su matriz dada"? – yassin
@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
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
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).
- 1. creada dinámicamente matriz rectangular irregular
- 2. matplotlib: superficie en 3D de una matriz rectangular de alturas
- 3. ¿Cómo extraer texto de un documento PDF dentro de una región rectangular específica?
- 4. Detección de área brillante rectangular en una imagen usando OpenCv
- 5. matriz rectangular física con el fin de memoria
- 6. Programáticamente seleccionando una región
- 7. Cuál es la forma más rápida de mover una región rectangular (píxel) dentro de un elemento de lienzo HTML5
- 8. ¿Cómo puedo saber si una matriz rectangular tiene filas duplicadas en MATLAB?
- 9. Traverse Rectangular Matrix en tiras diagonales
- 10. sombreado simple (rectangular) para una UIView
- 11. Ventana rectangular moderna en maps.google.com
- 12. Cómo resaltar una región en Google Maps
- 13. La suma máxima de una forma rectangular sub-array
- 14. ¿Cómo recortaría programáticamente una imagen a una forma no rectangular?
- 15. Copiar la región de una imagen a otra región en otra imagen
- 16. C# copiar pegar una región de imagen en otra imagen
- 17. Conteo rectangular de Python Matplotlib
- 18. Método de extensión para la matriz rectangular de relleno en C#
- 19. Emacs: resaltado persistente de una región
- 20. Acciones de Sikuli dentro de una región
- 21. UIImage de una región de UIView
- 22. Alinear región seleccionada en emacs
- 23. ¿Cómo "insertar" una pequeña matriz numpy en un bloque predefinido de una matriz numpy grande?
- 24. cómo colapsar espacios en blanco en una región?
- 25. MKMapView Zoom y región
- 26. ¿Región de código flexible?
- 27. Región del conjunto MKMapView
- 28. jvectormap región colores
- 29. Core monitoreo Localización región
- 30. ¿Cómo puedo sombrear una región entre dos líneas en flot?
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. –
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
Una pregunta similar está aquí: http://stackoverflow.com/questions/1726632/dynamic-programming-largest-square-block – bobobobo