Dada uma matriz booleana X , deixe entradas representam o mar e entradas representam terra. Defina uma ilha como vertical ou horizontalmente (mas não na diagonal) entradas adjacentes .1 1
A questão original era contar o número de ilhas em uma determinada matriz. O autor descreveu uma solução recursiva ( memória ).
Mas eu estava tentando, sem êxito, encontrar uma solução de streaming (da esquerda para a direita e depois para a próxima linha) que conta dinamicamente ilhas com ou O ( n ) ou O ( n + m ) de memória ( não há limites para a complexidade do tempo). Isso é possível? Caso contrário, como posso provar isso?
Alguns exemplos de saídas esperadas para determinadas entradas da count
função:
Respostas:
Aqui está um esboço de um algoritmo que mantém apenas duas linhas na memória por vez, então memória. Mas como você pode executar esse algoritmo na transposição da matriz sem problemas, a complexidade real é a memória O ( min ( m , n ) ) . O tempo de processamento é O ( m n ) .O(m) O(min(m,n)) O(mn)
Inicialização. Digitalize sobre a primeira linha e encontre todas as substrings conectadas dessa linha. Atribua a cada substring separado um ID positivo único e salve-o como um vetor que é zero, onde é zero e o ID positivo exclusivo, caso contrário.X
Para cada linha restante, atribua IDs únicos (nunca reatribua IDs anteriores anteriores, verifique se os seus IDs estão aumentando estritamente) a substrings nessa linha novamente. Veja a linha anterior mais a linha atual como uma matriz de por m , e todas as áreas conectadas devem ser atribuídas ao mínimo. Como um exemplo:2 m
Não há necessidade de atualizar a linha anterior para a correção desse algoritmo, apenas o atual.
Depois disso, encontre o conjunto de todos os IDs na linha anterior que não se conectam à próxima linha, descartando duplicatas . Adicione o tamanho desse conjunto ao seu contador de ilhas em execução.
Agora você pode descartar a linha anterior e atribuir a linha atual à linha anterior e seguir em frente.
Para manipular corretamente a última linha, finja que há outra linha de zeros na parte inferior do e execute a etapa 2 novamente.X
fonte
Orlp fornece uma solução usando palavras de espaço, que são O ( n log n ) bits de espaço (assumindo por simplicidade queO(n) O(nlogn) ). Por outro lado, é fácil mostrar que Ω ( n ) bits de espaço são necessários, reduzindo a disjunção definida para o seu problema.n=m Ω(n)
fonte