Compter les îles dans les matrices booléennes

9

Étant donné une matrice booléenne , soit entrées représentent la mer et entrées représentent la terre. Définissez un îlot comme verticalement ou horizontalement (mais pas en diagonale) adjacent entrées.X 0 1 1n×mX011

La question initiale était de compter le nombre d'îles dans une matrice donnée. L'auteur a décrit une solution récursive ( mémoire ).O(nm)

Mais j'essayais en vain de trouver une solution de streaming (de gauche à droite, puis vers le bas à la ligne suivante) qui compte dynamiquement les îles avec ou ou mémoire (il n'y a pas de limite de complexité temporelle). Est-ce possible? Sinon, comment puis-je le prouver?O ( n ) O ( n + m )O(m)O(n)O(n+m)


Quelques exemples de sorties attendues pour certaines entrées de la countfonction:

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

count(1111100100010110100011011111)=2

count(101111)=1

pgs
la source
1
1. Que voulez-vous dire par "orthogonal"? Voulez-vous dire un composant connecté? 2. Que pouvons-nous supposer sur la façon dont la matrice est stockée? Pouvons-nous supposer qu'il est stocké sur un stockage externe (par exemple, un disque dur lent), afin que vous puissiez lire n'importe quelle partie de votre choix, mais il sera plus rapide de le lire un bloc à la fois? Ou recevons-nous la matrice en mode streaming, où une fois que nous avons reçu un peu de la matrice d'entrée, nous ne pouvons plus jamais voir ce bit d'entrée?
DW
1
Cool merci. Je vous encourage à modifier la question pour clarifier ces points. Si c'est en streaming, dans quel ordre arrivent les bits de la matrice? Numériser de gauche à droite dans une rangée, puis descendre à la rangée suivante?
DW
1
Veuillez modifier la question pour inclure tous ces détails. Les commentaires sont éphémères.
Yuval Filmus
2
Toutes les informations fournies dans les commentaires ne peuvent pas être trouvées dans le message lui-même. Certaines de ces informations sont plutôt cruciales, comme votre modèle de streaming. Les commentaires pourraient disparaître, et donc (et en raison des normes de la communauté), tous les détails requis devraient faire partie du message principal.
Yuval Filmus
1
Quelle est la complexité temporelle requise?
hengxin

Réponses:

4

Voici un schéma d'un algorithme qui ne conserve que deux lignes en mémoire à la fois, donc de la mémoire . Mais comme vous pouvez exécuter cet algorithme sur la transposition de la matrice sans problème, la complexité réelle est la mémoire O ( min ( m , n ) ) . Le temps de traitement est .O(m)O(min(m,n))O(mn)

  1. Initialisation. Parcourez la première ligne et recherchez toutes les sous-chaînes connectées de cette ligne. Attribuez à chaque sous-chaîne disjointe un identifiant positif unique et enregistrez-le en tant que vecteur nul où est nul et identifiant positif unique sinon.X

  2. Pour chaque ligne restante, attribuez des ID uniques (ne réattribuez jamais les ID uniques précédents, assurez-vous que vos ID augmentent strictement) aux sous-chaînes de cette ligne. Affichez la ligne précédente plus la ligne actuelle sous la forme d'une matrice de par m , et toutes les zones connectées doivent être affectées à leur minimum. Par exemple:2m

    010402220333300506607080009990010402220333300504402020003330

    Il n'est pas nécessaire de mettre à jour la ligne précédente pour l'exactitude de cet algorithme, seul celui en cours.

    Après cela, recherchez l'ensemble de tous les identifiants de la ligne précédente qui ne se connectent pas à la ligne suivante, en supprimant les doublons . Ajoutez la taille de cet ensemble à votre compteur d'îles en cours d'exécution.

    Vous pouvez maintenant supprimer la ligne précédente et affecter la ligne actuelle à la ligne précédente et continuer.

  3. Pour gérer correctement la dernière ligne, faites comme s'il y avait une autre ligne de zéros au bas de et exécutez à nouveau l'étape 2.X

orlp
la source
6

Orlp donne une solution en utilisant mots d'espace, qui sont O ( n log n ) bits d'espace (en supposant pour simplifier que n = m ). Inversement, il est facile de montrer que Ω ( n ) bits d'espace sont nécessaires en réduisant la disjonction d'ensemble à votre problème.O(n)O(nlogn)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)

Yuval Filmus
la source