Comment obtenir le tableau 2D de combinaisons possibles
J'ai le texte suivant tableau 2D:
String[M][]
String[0]
"1","2","3"
String[1]
"A", "B"
.
.
.
String[M-1]
"!"
Toutes les combinaisons possibles doit être stocké dans un tableau résultant
String[] combinations
. Ainsi, par exemple:
combinations[0] == {"1A....!")
combinations[1] == {"2A....!")
combinations[2] == {"3A....!")
combinations[3] == {"1B....!")
Avis que les tableaux sont de longueur variable. L'ordre des éléments dans la Chaîne de sortie n'a pas d'importance. Aussi, je ne m'inquiète pas si il y a des doublons.
Si les tableaux ont la même longueur, boucles imbriquées ferait l'affaire, mais ils ne le sont pas, et je ne sais vraiment pas comment aborder le problème.
OriginalL'auteur lekroif | 2013-04-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez parcourir les combinaisons une à une comme sur des roulettes par l'utilisation d'un tableau pour enregistrer la taille de chaque intérieur tableau, et un compteur de tableau qui garde la trace de membre à l'utilisation de chaque intérieur du tableau. Quelque chose comme cette méthode:
Comment la méthode fonctionne
Si vous imaginez que le compteur de tableau, d'être comme une horloge numérique la lecture alors que la première Chaîne combinaison voit le compteur de tableau à tous les zéros, de sorte que la première Chaîne est faite par prendre le zéro de l'élément (premier membre de chaque intérieur tableau.
Pour obtenir la combinaison suivante le compteur de tableau est incrémenté de un. Donc, la moins significative, de l'index de compteur est augmenté de un. Si ce qui provoque sa valeur à devenir égale à la longueur de l'intérieur de la matrice, il représente alors l'index est mis à zéro, et le prochain indice d'une plus grande importance est accrue. Séparé de la taille de la matrice de magasins de la longueur de chaque intérieur tableau, de sorte que le compteur de boucle de tableau sait quand un indice a atteint son maximum.
Par exemple, si la taille de la matrice a:
et le compteur de tableau a:
puis l'incrément ferait le moins significatif (le plus à droite) indice égal à 1, ce qui est sa valeur maximale. De sorte que l'index sera remis à zéro et le prochain indice de plus grande importance (le deuxième à partir de la droite) augmente de 2. Mais c'est aussi le maximum de l'indice, donc il s'est mis à zéro, et nous nous dirigeons vers le prochain indice de la plus grande importance. Qu'est accrue de trois, ce qui est sa valeur maximale, donc il s'est mis à zéro, et nous nous dirigeons vers le plus significatif (le plus à gauche) de l'indice. Qui se fait augmenté à 1, ce qui est inférieur au maximum de sorte que le compteur incrémenté tableau devient:
Qui signifie que le prochain Chaîne de combinaison est faite en prenant le second membre de la première intérieure de tableau, et le premier membre de la cours des trois prochaines intérieur des tableaux.
Avertissements et notes
J'ai écrit ce juste maintenant en une quarantaine de minutes, et c'est la moitié d'une heure du matin, ce qui signifie que, même s'il semble faire exactement ce qui est nécessaire, il y a très probablement des bugs ou des morceaux de code qui pourrait être optimisé. Assurez-vous donc de l'unité de la tester à fond si sa performance est critique.
Remarque qu'elle retourne une Liste plutôt qu'un tableau de Chaîne parce que je pense que Java Collections sont infiniment préférable à l'utilisation de tableaux dans la plupart des cas. Aussi, si vous avez besoin d'un jeu de résultats avec pas de doublons, vous pouvez simplement modifier la Liste pour un Jeu qui va automatiquement supprimer les doublons et vous laisse avec un ensemble unique.
Si vous avez vraiment besoin le résultat sous la forme d'un tableau de Chaîne, n'oubliez pas que vous pouvez utiliser le
List<String>.toArray(String[])
méthode pour convertir simplement de la Liste retournée à ce que vous avez besoin.À partir d'un rapide coup d'œil, on dirait qu'il calcule le nombre total de combinaisons que vous pourriez faire, puis initialise un tableau de compteurs, un pour chaque tableau de combinaisons - le comptoir à l'une des extrémités est en vélo et à chaque fois qu'il fait une boucle, il incrémente le suivant, et si que des boucles de la prochaine est incrémenté, et ainsi de suite. Pense à un porte-documents serrure à gorges.
J'ai ajouté un gros bloc après le code qui s'exécute par le biais de fonctionnement de la méthode. Patashu est juste: c'est comme un cadran numérique en cochant une place à chaque fois pour produire les coordonnées de la combinaison suivante, jusqu'à ce qu'il a exécuté toutes les combinaisons possibles. J'ai aussi modifié le code ci-dessus pour supprimer inutilement la réinitialisation de la boucle qui était dans la première version que j'ai posté.
OriginalL'auteur Bobulous
Ce problème a une très belle structure récursive (qui signifie aussi qu'elle pourrait exploser à la mémoire, à la manière correcte devrait utiliser des itérateurs comme l'autre réponse, mais cette solution est plus photogénique de l'omi et nous pouvons le prouver la justesse de pertinence en raison de la nature récursive). Une combinaison est constituée d'un élément de la première liste jointe à toutes les combinaisons possibles formé à partir de l'restants (n-1) listes. Le récursive travail est effectué dans AllCombinationsHelper, mais vous appelez AllCombinations. Note pour le test de vide listes et plus largement.
OriginalL'auteur Anil Vaitla
Devrait être simple à faire avec la récursivité.
Permettez-moi de reformuler un peu, de sorte que la terminologie est moins déroutant.
Nous appellerons String[] Liste des jetons, qui est une liste de Jetons
Vous disposez maintenant d'une Liste de Liste de jetons, vous voulez obtenir un Jeton de chaque Liste de jetons disponibles, et de trouver toutes les combinaisons.
Ce que vous devez faire est, donné une liste de TokenList
Je suis seulement de donner un pseudo code:
OriginalL'auteur Adrian Shum
J'ai été aux prises avec ce problème depuis un certain temps. Mais j'ai finalement résolu. Mon principal obstacle a été le CHAMP d'application que j'ai utilisé pour déclarer chaque variable. Si vous ne déclarez pas vos variables dans le domaine approprié, alors la variable permettra de conserver les modifications apportées à l'itération précédente.
OriginalL'auteur JasonRobinson
En Python, on utilise itertools.du produit et de l'argument de déballage (appliquer)
OriginalL'auteur Larry Stewart