Bonjour,
Je voudrais savoir s'il existe des algorithmes (efficaces) permettant de résoudre ce type de problème:
J'ai une liste de "séquences" simples (on pourrait faire l'analogie avec des séquences d'ADN par ex.), que je souhaite factoriser de façon à obtenir une nouvelle liste la plus courte possible. La factorisation consiste à regrouper deux ou plusieurs séquences qui ne diffèrent que par une "lettre", en une seule séquence "condensée".
Soit par exemple cette liste de séquences de départ:
0 AAAA
1 BAAC
2 ABAA
3 BCAA
4 ACAB
5 BAAA
6 ABAB
7 AAAB
8 ACAC
Si on compare la première séquence de la liste (indice 0: AAAA) aux suivantes, on voit qu'elle n'a qu'une différence avec la séquence 5 (BAAA) par ex., ce qui permet de les regrouper/factoriser en une nouvelle séquence qui serait [AB]AAA.
De même la séquence 2 (ABAA) et la séquence 6 (ABAB) ne diffèrent que d'une lettre et peuvent être regroupées en une séquence ABA[AB].
Puis la séquence 4 (ACAB) et la séquence 7 (AAAB) peuvent être regroupées en A[AC]AB.
Ce qui donnerait une solution de 6 éléments:
0 [AB]AAA
1 BAAC
2 ABA[AB]
3 BCAA
4 A[AC]AB
5 ABAB
Mais de façon optimale on pourrait factoriser la même liste de départ en une solution de 4 éléments seulement:
0 A[AB]A[AB]
1 BAAC
2 B[AC]AA
3 ACA[BC]
(Il est facile de retrouver la liste des séquences de départ en décomposant chaque séquence: A[AB]A[AB] donne les séquences AAAA/AAAB/ABAA/ABAB)
Bref, si je fais simplement une boucle pour comparer les grilles une par une, et de la première lettre vers la dernière, j'obtiens la première solution, qui est loin d'être la solution optimale; je cherche donc un algorithme qui pourrait améliorer mes résultats.
Je travaille en Delphi mais un pseudo-algorithme me suffit, si vous avez des idées ou des liens/références...
Partager