Dado un matriz booleana , dejemos que entradas representen el mar y entradas representen la tierra. Definir una isla como (pero no en diagonal) vertical u horizontalmente adyacentes entradas.
La pregunta original era contar el número de islas en una matriz dada. El autor describió una solución recursiva ( memoria).
Pero estaba intentando sin éxito encontrar una solución de transmisión (de izquierda a derecha, y luego hacia la fila siguiente) que cuenta dinámicamente las islas con o o memoria (no hay límites para la complejidad del tiempo). ¿Es eso posible? Si no, ¿cómo puedo probarlo?
Algunos ejemplos de salidas esperadas para ciertas entradas para la count
función:
Respuestas:
Aquí hay un boceto de un algoritmo que solo mantiene dos filas en la memoria a la vez, por lo que memoria. Pero como puede ejecutar este algoritmo en la transposición de la matriz sin problemas, la complejidad real es la memoria O ( min ( m , n ) ) . El tiempo de procesamiento es O ( m n ) .O(m) O(min(m,n)) O(mn)
Inicializacion. Escanee sobre la primera fila y encuentre todas las subcadenas conectadas de esa fila. Asigne a cada subcadena disjunta una identificación positiva única y guárdela como un vector que es cero donde es cero y la identificación positiva única de lo contrario.X
Para cada fila restante, asigne identificadores únicos (nunca reasigne identificadores únicos anteriores, asegúrese de que sus identificadores estén aumentando estrictamente) a las subcadenas en esa fila nuevamente. Vea la fila anterior más la fila actual como una matriz de por m , y cualquier área conectada debe asignarse a su mínimo. Como ejemplo:2 m
No es necesario actualizar la fila anterior para la corrección de este algoritmo, solo la actual.
Una vez hecho esto, busque el conjunto de todos los identificadores en la fila anterior que no se conectan a la siguiente fila, descartando duplicados . Agregue el tamaño de este conjunto a su contador de islas en ejecución.
Ahora puede descartar la fila anterior y asignar la fila actual a la fila anterior y continuar.
Para manejar correctamente la última fila, finja que hay otra fila de ceros en la parte inferior de y ejecute el paso 2 nuevamente.X
fuente
Orlp ofrece una solución utilizando palabras de espacio, que son O ( n log n ) bits de espacio (suponiendo, por simplicidad, que n = m ). Por el contrario, es fácil demostrar que se necesitan Ω ( n ) bits de espacio al reducir la desunión establecida a su problema.O(n) O(nlogn) n=m Ω(n)
fuente