Mon entrée est une liste d'ensembles d'entiers. Ce qui veut dire que chaque ensemble a un index dont j'ai besoin de suivre. Ces ensembles (uniques) contiennent des entiers et différents ensembles peuvent avoir un ou plusieurs de ces éléments entiers en commun (il est également possible que deux ensembles soient identiques).Fusion d'ensembles dans un graphe orienté
Mon but est d'exprimer ces ensembles non pas comme une liste, mais plutôt comme une structure arborescente, afin que je puisse éliminer les éléments entiers qui sont partagés par plusieurs ensembles. La structure est un graphe orienté avec un noeud racine artificiel. Les autres nœuds sont les entiers trouvés dans les ensembles. Le nœud racine aura jusqu'à n enfants (n est le nombre de jeux). Ces enfants sont en fait un premier entier provenant des différents ensembles et doivent être ajoutés par l'algorithme. Il y a quelques conditions:
- Il doit être possible de recréer un tel ensemble en suivant un chemin à travers l'arbre.
- Un chemin à travers l'arbre doit être non ambigu, aucun sommet ne peut avoir plus d'un enfant.
- Il y a une exception: Le nœud racine artificielle est autorisé à avoir plusieurs enfants (les enfants seraient les points de départ pour les chemins pour recréer les ensembles)
De toute évidence, il ne sera pas possible d'éliminer tous les doublons, mais j'aimerais trouver un algorithme qui trouve le plus d'éliminations possible. C'est là que je dois demander de l'aide. Je peux le faire à la main, mais ne pas l'exprimer dans un algorithme formel qui fonctionnerait dans tous les cas).
Edit: Espérons que ce petit exemple illustre mieux le problème:
Nous avons trois listes, list0 = [0,3,4,7,8], list1 = [1,2,3,6,7], list3 = [5,6,7,8]
. L'index de ces listes est la légende du premier tronçon à partir du nœud racine R
. Suivre ce premier front conduit à un chemin non ambigu vers un nœud qui n'a pas d'enfants (dans cet exemple c'est le même nœud pour les trois listes, mais ce n'est pas forcément le cas). Toutes les légendes des noeuds sur ce chemin forment la liste avec l'index respectif.
Comme vous pouvez le voir, la valeur 7 apparaît trois fois, les valeurs 3, 6 et 8 chacune deux fois. Donc, le meilleur scénario serait de se débarrasser des 5 nœuds inutiles. Mais avec notre condition, qu'aucun nœud ne peut avoir plus d'un enfant, il n'est pas toujours possible de se débarrasser de tous les doublons. Le graphique ci-dessous montre une solution possible, où les 6 et 8 dupliqués n'ont pas pu être résolus. [remarque:. 6 ou 8 pourrait être échangé avec 3, et ont encore une solution de 12 noeuds]
Je ne suis pas clair sur la structure que vous voulez. Vous dites que vous pouvez le faire à la main; pouvez-vous montrer un exemple ou deux et les arbres qui en résultent? Je ne suis pas du tout clair ce * résultat * que vous voulez au "???", donc je ne peux pas vous aider à y arriver. – Prune
J'ai ajouté un exemple et enlevé la partie avec ???, il est difficile de décrire ma pensée algorithmique, donc je vais la rajouter quand je l'ai formalisée pour qu'elle soit plus compréhensible. – flowit
Beaucoup mieux; Merci. – Prune