IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme, factorisation de séquences/combinaisons


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut Algorithme, factorisation de séquences/combinaisons
    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...

  2. #2
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    je sais pas si ca peut t'aider, mais tu peux peut etre utiliser un arbre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           A
     A------B----C
     A      A    A
    A-B    A-B   B
    0 7    2 6   4   <--- indice de la ligne correspondant au chemin de l'arbre

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Oui c'est un petit peu comme ça que je fais pour l'instant, je parcours l'ensemble des éléments "de haut en bas" pour les comparer à leurs voisins mais c'est loin de donner des solutions optimales, ça permet tout juste d'avoir une solution rapide: c'est ce qui me donne la première solution de mon exemple, comparé à la deuxième (optimale ?)... Je ne cherche pas non plus *la* solution parfaite, mais quelque chose de plus efficace quand même.
    (Je ne sais pas si ce genre de problème porte un nom: si il y a des documents là-dessus, je prends aussi)

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Déjà, tu peux voir du côté de la distance de Levenshtein pour avoir des chiffres "objectifs". Ceci étant dit, c'est assez long à faire... Mais bon, si tu as peu de chaînes à factoriser, c'est pas l'enfer, surtout que tu n'autorise que la substitution dans ton cas.

    Ceci étant dit, j'ai un peu peur que ta factorisation "ultime" tombe sur un truc du genre "[AB][ABC][AB][ABC]" par rapport à ton exemple...
    J'ai l'impression que tu cherches à retrouver l'expression régulière correspondante à un ensemble de données, en lisant l'exposé de ton problème.

    Ceci étant dit, toujours en fonction du nombre de données à traiter, partir sur la solution de construire une regexp puis de l'affiner en fonction des résultats incohérents pourrait être une solution... Mais je crains que ça ne soit très long et/ou prohibitif en terme d'occupation mémoire, car cela reviendrait à expander une regexp en toutes ses possibilités, et à éliminer une par une les possibilités générées qui n'existent pas dans la liste originale.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Ceci étant dit, j'ai un peu peur que ta factorisation "ultime" tombe sur un truc du genre "[AB][ABC][AB][ABC]" par rapport à ton exemple...
    J'ai l'impression que tu cherches à retrouver l'expression régulière correspondante à un ensemble de données, en lisant l'exposé de ton problème.
    Effectivement, ca ressemble beaucoup a de la minimisation d'automate à états finis.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Effectivement, ca ressemble beaucoup a de la minimisation d'automate à états finis.
    Merci pour l'expression exacte, peut-être que ça pourra aider l'OP un peu plus au passage.

    Voici un petit lien "au cas où"...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Déjà, tu peux voir du côté de la distance de Levenshtein pour avoir des chiffres "objectifs". Ceci étant dit, c'est assez long à faire... Mais bon, si tu as peu de chaînes à factoriser, c'est pas l'enfer, surtout que tu n'autorise que la substitution dans ton cas.
    Merci pour la lecture. Ça serait plutôt distance de Hamming dans mon cas, les "mots" ont tous la même longueur et il n'y a que des permutations de lettres.

    Ceci étant dit, j'ai un peu peur que ta factorisation "ultime" tombe sur un truc du genre "[AB][ABC][AB][ABC]" par rapport à ton exemple...
    J'ai l'impression que tu cherches à retrouver l'expression régulière correspondante à un ensemble de données, en lisant l'exposé de ton problème.
    Il y a un peu de ça, mais alors ça serait une expression régulière *stricte* (ou plutôt une addition d'expressions régulières) qui ne doit donner en sortie que la liste de départ, et pas un "mot" de plus qui n'en fasse pas partie.

    Ceci étant dit, toujours en fonction du nombre de données à traiter, partir sur la solution de construire une regexp puis de l'affiner en fonction des résultats incohérents pourrait être une solution... Mais je crains que ça ne soit très long et/ou prohibitif en terme d'occupation mémoire, car cela reviendrait à expander une regexp en toutes ses possibilités, et à éliminer une par une les possibilités générées qui n'existent pas dans la liste originale.
    Et quand bien même... parmi toutes les sous-regexps générées à partir de l'expression régulière (qui serait [AB][ABC][AB][ABC] ici, pour définir l'univers des lettres possibles à chaque rang), il y a toujours plusieurs possibilités d'arrangements entre elles pour finir par couvrir la liste de départ. Et je cherche, sinon la solution optimale, du moins quelque chose qui s'en approche un peu ! (voir "solutions" 1 et 2: on peut considérer qu'il s'agit d'une somme d'expression régulières, elles sont elles-mêmes de sousensembles de l'expression régulière globale [AB][ABC][AB][ABC] mais une solution est meilleure que l'autre)...

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Et je cherche, sinon la solution optimale, du moins quelque chose qui s'en approche un peu !
    Si c'est ça, tu peux factoriser itérativement toutes les chaines qui n'ont qu'un caractère de différence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    départ (trié):
    AAAA, AAAB, ABAA, ABAB, ACAB, ACAC, BAAA, BAAC, BCAA
     
    1ere factorisation possible:
    AAAA, AAAB -> AAA[AB]
    résultat:
    AAA[AB], ABAA, ABAB, ACAB, ACAC, BAAA, BAAC, BCAA
     
    1ere factorisation possible:
    ABAA, ABAB -> ABA[AB]
    résultat:
    AAA[AB], ABA[AB], ACAB, ACAC, BAAA, BAAC, BCAA
     
    1ere factorisation possible:
    AAA[AB], ABA[AB] -> A[AB]A[AB]
    résultat:
    A[AB]A[AB], ACAB, ACAC, BAAA, BAAC, BCAA
     
    1ere factorisation possible:
    ACAB, ACAC -> ACA[BC]
    résultat:
    A[AB]A[AB], ACA[BC], BAAA, BAAC, BCAA
     
    1ere factorisation possible:
    BAAA, BAAC -> BAA[AC]
    résultat:
    A[AB]A[AB], ACA[BC], BAA[AC], BCAA
     
    plus de factorisation possible -> fini
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. algorithme comparant des séquences
    Par Jasmine80 dans le forum Langage
    Réponses: 9
    Dernier message: 15/04/2011, 10h26
  2. Algorithme de listage de combinaison avec répétition de caractère
    Par Gilles57-H-G dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/11/2010, 20h38
  3. [Tableaux] Algorithme pour les combinaisons
    Par Death83 dans le forum Langage
    Réponses: 33
    Dernier message: 09/08/2010, 14h31
  4. Algorithme de combinaisons
    Par slimjoe dans le forum Delphi
    Réponses: 6
    Dernier message: 30/01/2007, 23h31
  5. Algorithme combinaisons mots à partir de lettres
    Par micfont999 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 16/01/2007, 00h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo