É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 1
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 ).
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 )
Quelques exemples de sorties attendues pour certaines entrées de la count
fonction:
Réponses:
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)
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
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:2 m
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.
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
la source
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)
la source