J'ai deux tableaux de chaînes, pas nécessairement de la même longueur, je souhaite trouver tous les "ensembles" possibles de combinaisons entre deux valeurs des tableaux, sans répéter de l'un ou l'autre des matrices.
Par exemple, étant donné les tableaux:
{"A1", "A2", "A3"}
{"B1", "B2"}
Le résultat que je veux est les ensembles suivants:
{("A1", "B1"), ("A2", "B2")}
{("A1", "B1"), ("A3", "B2")}
{("A1", "B2"), ("A2", "B1")}
{("A1", "B2"), ("A3", "B1")}
{("A2", "B1"), ("A3", "B2")}
{("A2", "B2"), ("A3", "B1")} P>
Mon orientation générale consiste à créer une fonction récursive qui prend en tant que paramètre les deux tableaux et supprime toutes les chaînes "choisies" à la fois, se rapprochant jusqu'à ce que l'une ou l'autre des matrices soit vide, mais je suis un peu inquiet des problèmes de performance (j'ai besoin Pour exécuter ce code sur environ 1000 paires de matrices de cordes).
Quelqu'un peut-il diriger mon vers une méthode efficace pour faire cela? P>
7 Réponses :
Ce n'est pas tout à fait le même problème, mais il y a une solution que j'ai faite à la question suivante qui serait probablement un point de départ décent: p>
Il peut être utile de penser aux deux tableaux de la table d'une table: Cela implique une boucle imbriquée dans une autre, une boucle pour les rangées et l'autre pour les colonnes. Cela vous donnera l'ensemble initial de paires: p> alors il s'agit de construire les combinaisons de cet ensemble initial. Vous pouvez visualiser les combinaisons de la même manière, avec l'ensemble de paires pour les lignes et les colonnes: p> à nouveau, cela peut être accompli avec une paire de boucles imbriquées (indice: votre intérieur La plage de la boucle sera déterminée par la valeur de la boucle externe). P> p>
À ma compréhension, l'utilisation d'une paire de boucles imbriquées ne peut pas générer l'ensemble complet sans l'hypothèse que l'une des deux tableaux initiaux a une longueur de deux. Une manière plus judicieuse de résolution de ce problème en général est d'utiliser la première recherche de profondeur.
Une autre solution consiste à résoudre l'ordre du réseau plus petit, générer toutes les permutations de la plus longue et faire une correspondance avec le même index des deux matrices à la longueur du réseau plus petit.
S'il vous plaît voir ma réponse pour des éclaircissements.
@Jingjiezheng Les deux tableaux initiaux peuvent être n'importe quelle longueur. Vous pouvez la visualiser en ajoutant des lignes / des colonnes à la table, selon le cas.
Il y a beaucoup de questions (et réponses) concernant des combinaisons de deux listes sur ce site (voir la barre latérale). Votre cas d'utilisation semble superficiellement différent si je le comprends correctement.
ne suffirait-il pas à avoir une méthode p> (qui existe dans divers formes et tailles déjà dans les «duplicats»), puis utilisent cela en suivant ces étapes (devoirs = vous remplissez les détails): P> Itéréter sur toutes les combinaisons de la liste 1 et la liste 2 (en utilisant quelque chose comme ce qui précède) et p>
Un moyen très simple est
Bien que cela me donne toutes les paires de cordes possibles, ce dont j'ai besoin, c'est la combinaison unique de ces paires
Si je comprends votre problème correctement, toutes les combinaisons peuvent être dérivées avec:
{a_i, a_j} code> de a, li>
- a choisi 2 éléments différents
{b_k, b_l} code> de b, li>
- Faites 2 combinaisons avec ces éléments
{(a_i, b_k), (a_j, b_l)}, {(a_i, b_l), (A_J, B_K)} code>. LI>.
ul> avec toutes les combinaisons de 2 sous-ensembles d'éléments d'A et B, vous obtenez toutes les combinaisons que vous recherchez. P>
Il y a | A | * (| A | - 1) * | B | * (| B | - 1) / 2 code> combinaisons. P> Work implémentée est avec 4 boucles: p> xxx pré> p>
Votre problème est équivalent au problème suivant:
Déclaration de problème: strong> Solution forte>: de Ensuite, nous générons toutes les permutations possibles de B, de sorte que les éléments du début N dans chaque permutation peuvent avoir une correspondance à une une à une correspondance avec les éléments de A. p> les premières permutations et les mappages vont comme suit:
Mise en œuvre: strong> p>
Compte tenu de deux vecteurs A code> avec la taille
n code>,
B code> avec la taille
m code>, où
n .
A = [0, 1, 2, ..., N - 1] Code>.
B = [0, 1, 2, ..., M - 1] Code>.
Trouver tout mappings injectif et non surjectif à partir de A code> à
B code>.
p>
Comme la taille d'A est plus petite, dans un mappage, le nombre de correspondances est égal à la taille d'A, I.e., n. p>
p>
class Helper {
public:
/**
* @brief generateArray
* @param size
* @return A vector [0, 1, ..., size - 1]
*/
vector<int> generateArray(int size) {
vector<int> arr;
for (int i = 0; i < size; ++i) {
arr.push_back(i);
}
return arr;
}
/**
* @brief generateMatches
* @param n, cardinality of the vector X, where X = [0,1, ..., n - 1].
* @param m, cardinality of the vector Y, where Y = [0,1, ..., m - 1].
* @return All possible injective and non-surjective mappings
* from the smaller vector to the larger vector.
*/
vector<vector<pair<int, int> > > generateMatches(int n, int m) {
// Deal with n > m. Swap back when generating pairs.
bool swapped = false;
if (n > m) {
swapped = true;
swap(n, m);
}
// Now n is smaller or equal to m
vector<int> A = generateArray(n);
vector<int> B = generateArray(m);
vector<vector<pair<int, int> > > matches;
// Generate all the permutations of m
do {
vector<pair<int, int> > match;
for (int i = 0; i < n; ++i) {
pair<int, int> p;
if (swapped) {
// Swap back to the original order.
p = make_pair(A[i], B[i]);
} else {
p = make_pair(B[i], A[i]);
}
match.push_back(p);
}
matches.push_back(match);
// Generate next permutation.
} while(next_permutaion(B.begin(), B.end()));
return matches;
}
};
J'ai examiné ce défi lorsque j'ai vu un puzzle de style croisé où chaque carré a un numéro et que vous devez trouver quelle lettre correspond à quel numéro afin de rendre les mots corrects. Sachant que je touche des réponses déjà données, je vais essayer de résumer le problème et montrerai comment il peut être résolu de manière récursive.
Dans l'affaire X-Word, le plus petit tableau A est une série de chiffres et le grand Array B contient les lettres de l'alphabet. Le problème est d'attribuer chaque numéro à une lettre et de trouver toutes les combinaisons possibles. Généralement, nous avons: p>
AllPairs (A,B,C) if Size(A)>1 ' check no of elements in A for i=1 to Size(B) C(Size(C)-Size(A)+1)= B(i) A'=Remove element 1 from A B'=Remove element i from B Call AllPairs(A',B',C) 'recursive call Next i else ' only one element in A for j=1 to Size(B) C(Size(C)) = B(i) 'looping last element in C through all unused in B Collect.ADD(C) 'collect C-arrays here for later use Next j End AllPairs
L'une des paires de la réponse est la suivante: {("A1", "B1"), ("A2", "B2")}; S'agit-il d'une autre paire valide ou d'un duplicata: {("A2", "B2"), ("A1", "B1")}
Qu'entendez-vous par «efficace»? Donné deux tableaux de taille
n code> et
m code>,
n <= m code>, il y aura
m * ... * (m- n + 1) code> sets.
@ C.Evenhuis L'ordre entre les combinaisons n'a pas d'importance, j'ai juste besoin des ensembles uniques
@MR e i Gensiez habituellement des algorithmes récursifs avec un grain de sel, ils peuvent être réalisés rapidement mais peuvent avoir une mauvaise performance, d'où mon commentaire
Éventuellement pertinent: Stackoverflow.com/Questions/983243/...