Contando ilhas em matrizes booleanas


9

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 .n×mX1 1011

A questão original era contar o número de ilhas em uma determinada matriz. O autor descreveu uma solução recursiva ( memória ).O(nm)

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?O(m)O(n)O(n+m)


Alguns exemplos de saídas esperadas para determinadas entradas da countfunção:

count(010111010)=1;count(101010101)=5;count(111101111)=1;

count(1111100100010110100011011111)=2

count(101111)=1


11
1. O que você quer dizer com "ortogonal"? Você quer dizer um componente conectado? 2. O que podemos assumir sobre como a matriz é armazenada? Podemos supor que ele esteja armazenado em armazenamento externo (por exemplo, um disco rígido lento), para que você possa ler qualquer parte que desejar, mas será mais rápido ler um bloco de cada vez? Ou nós recebemos a matriz de uma forma de streaming, onde uma vez que recebemos um pouco da matriz de entrada, nunca mais podemos ver essa parte de entrada?
DW

11
Legal, obrigado. Convido você a editar a pergunta para esclarecer esses pontos. Se estiver fluindo, em que ordem os bits da matriz chegam? Digitalizando da esquerda para a direita em uma linha e depois para a próxima linha?
DW

11
Edite a pergunta para incluir todos esses detalhes. Comentários são efêmeros.
Yuval Filmus

2
Nem todas as informações fornecidas nos comentários podem ser encontradas no próprio post. Algumas dessas informações são cruciais, como o seu modelo de streaming. Os comentários podem desaparecer e, portanto (e devido aos padrões da comunidade), todos os detalhes necessários devem fazer parte da postagem principal.
Yuval Filmus

11
Qual é a complexidade de tempo necessária?
Hengxin

Respostas:


4

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)

  1. 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

  2. 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:2m

    010402220333300506607080009990010402220333300504402020003330

    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.

  3. Para manipular corretamente a última linha, finja que há outra linha de zeros na parte inferior do e execute a etapa 2 novamente.X


6

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)

x1,,xny1,,ynixi=yi=12×(2n1)x1,0,x2,0,,0,xny1,0,y2,0,,0,ynixii(xi+yi)iΩ(n)Ω(n)

O(n)O(logn)O(n)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.