Conteggio delle isole in matrici booleane


9

Data una matrice booleana , lascia che voci rappresentino il mare e voci rappresentino la terra. Definire un'isola come adiacente verticalmente o orizzontalmente (ma non in diagonale) .n×mX011

La domanda originale era di contare il numero di isole in una data matrice. L'autore ha descritto una soluzione ricorsiva ( memoria ).O(nm)

Ma stavo tentando senza successo di trovare una soluzione di streaming (da sinistra a destra, quindi fino alla riga successiva) che conteggi dinamicamente le isole con o o memoria (non ci sono limiti per la complessità temporale). È possibile? In caso contrario, come posso provarlo?O(m)O(n)O(n+m)


Alcuni esempi di uscite previste per determinati ingressi per la countfunzione:

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

count(1111100100010110100011011111)=2

count(101111)=1


1
1. Cosa intendi con "ortogonale"? Intendi un componente collegato? 2. Cosa possiamo supporre su come è memorizzata la matrice? Possiamo supporre che sia archiviato su un archivio esterno (ad esempio un disco rigido lento), in modo da poter leggere qualsiasi porzione desiderata, ma sarà più veloce leggerlo un blocco alla volta? Oppure riceviamo la matrice in modo streaming, dove una volta che abbiamo ricevuto un po 'della matrice di input non possiamo più vedere quel bit di input?
DW

1
Figo, grazie. Vi incoraggio a modificare la domanda per chiarire tali punti. Se è in streaming, in quale ordine arrivano i bit della matrice? Scansione da sinistra a destra tra una riga, quindi giù alla riga successiva?
DW

1
Modifica la domanda per includere tutti questi dettagli. I commenti sono effimeri.
Yuval Filmus,

2
Non tutte le informazioni fornite nei commenti sono reperibili nel post stesso. Alcune di queste informazioni sono piuttosto cruciali, come il tuo modello di streaming. I commenti potrebbero scomparire, e quindi (e a causa degli standard della comunità), tutti i dettagli richiesti dovrebbero far parte del post principale.
Yuval Filmus,

1
Qual è la complessità temporale richiesta?
hengxin,

Risposte:


4

O(m) memoria. Il tempo di elaborazione è O ( m n ) .O(min(m,n))O(mn)

  1. Inizializzazione. Scansione sopra la prima riga e trova tutte le sottostringhe connesse di quella riga. Assegna a ogni sottostringa disgiunta un ID positivo univoco e salvalo come un vettore che è zero dove è zero e l'id positivo univoco altrimenti.X

  2. Per ogni riga rimanente assegnare gli ID univoci (non riassegnare mai gli ID univoci precedenti, assicurarsi che gli ID siano in costante aumento) alle sottostringhe di quella riga. Visualizza la riga precedente più la riga corrente come una matrice per m e tutte le aree connesse dovrebbero essere assegnate al minimo. Come esempio:2m

    010402220333300506607080009990010402220333300504402020003330

    Non è necessario aggiornare la riga precedente per la correttezza di questo algoritmo, solo quello corrente.

    Al termine, trova il set di tutti gli ID nella riga precedente che non si connettono alla riga successiva, eliminando i duplicati . Aggiungi le dimensioni di questo set al tuo contatore di isole in esecuzione.

    Ora puoi scartare la riga precedente e assegnare la riga corrente alla riga precedente e andare avanti.

  3. Per gestire correttamente l'ultima riga fingere che ci sia un'altra fila di zeri nella parte inferiore di ed eseguire nuovamente il passaggio 2.X


6

Orlp fornisce una soluzione usando parole di spazio, che sono O ( n log n ) bit di spazio (supponendo per semplicità che n = m ). Viceversa, è facile dimostrare che Ω ( n ) bit di spazio sono necessari riducendo la disunione impostata al problema.O(n)O(nlogn)n=mΩ(n)

Supponiamo che Alice detenga un vettore binario e Bob detenga un vettore binario y 1 , ... , y n e che vogliano sapere se esiste un indice i tale che x i = y i = 1 . Eseguono il tuo algoritmo per la matrice 2 × ( 2 n - 1 ) le cui righe sono x 1 , 0 , x 2 , 0 , ... ,X1,...,Xny1,...,ynioXio=yio=12×(2n-1) ed y 1 , 0 , y 2 , 0 , ... , 0 , y n . Dopo aver letto la prima riga, Alice invia Bobi x i così come i contenuti della memoria, in modo che Bob possa completare l'algoritmo e confrontarei ( x i + y i ) con il numero di componenti collegati. Se i due numeri corrispondono, i due vettori sono disgiunti (non vi è alcun indice i ) e viceversa. Dal momento che qualsiasi protocollo per impostare le esigenze di disgiunzioneX1,0,X2,0,...,0,Xny1,0,y2,0,...,0,ynΣioXioΣio(Xio+yio)io bit (anche se può errare con una piccola probabilità costante), deduciamo unlimite inferiore di Ω ( n ) , che vale anche per i protocolli randomizzati a cui è consentito errare con qualche piccola probabilità costante.Ω(n)Ω(n)

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.