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

avec Java Discussion :

Alignement de chaines de caractères


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Points : 17
    Points
    17
    Par défaut Alignement de chaines de caractères
    Bonjour !

    Je me suis inspiré de cette fonction sur wikipedia

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function printDiff(C[0..m,0..n], X[1..m], Y[1..n], i, j)
        if i > 0 and j > 0 and X[i] = Y[j]
            printDiff(C, X, Y, i-1, j-1)
            print "  " + X[i]
        else if j > 0 and (i = 0 or C[i,j-1] ≥ C[i-1,j])
            printDiff(C, X, Y, i, j-1)
            print "+ " + Y[j]
        else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j])
            printDiff(C, X, Y, i-1, j)
            print "- " + X[i]
        else
            print ""
    pour faire ce bout de code, qui va aligner des séquences de lettres.

    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
        public static void printDiff(int opt[][], char input1[], char input2[], int i, int j) {
     
            if (i > 0 && j > 0 && input1[i] == input2[j]) {
                printDiff(opt, input1, input2, i-1, j-1);
                //System.out.print("" + input1[i]);
     
            } else if (j > 0 && (i == 0 || opt[i][j-1] >= opt[i-1][j])) {
                printDiff(opt, input1, input2, i, j-1);
                System.out.print("-" + input2[j]);
     
            } else if (i > 0 && (j == 0 || opt[i][j-1] < opt[i-1][j])) {
                printDiff(opt, input1, input2, i-1, j);
               //System.out.print("-" + input1[i]);
     
            } else {
                System.out.print(input1[i]);
     
            }
     
        }
    Par exemple voici la sortie voulue pour cette entrée

    Entrée
    ABCDE
    ACDC

    Sortie Désirée
    ABCDE-
    A-CD-C

    Sortie actuelle
    A-C-D-C

    Le problème est que je ne sais pas comment faire en sorte que l'algo ajoute +1 lorsqu'un tiret est ajouté pour que la chaine soit alignée. Clairement dans mon code, il ne considère pas le tiret donc la boucle continue de voir des différences dans mes chaines.

    Je veux pricipalement utiliser cette facon de faire, car je vais devoir refaire le même programme en assembleur et je suis très limité dans les fonctions et espace memoire.

    Merci !

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Pourquoi as tu commentés ces 2 lignes en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //System.out.print("-" + input1[i]);
    ?

    En fait l'affichage (print) sauf si je me trompe n'est pas la même dans la première version du code et dans la 2 ème c'est cela qui m'intrigue.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    En fait voici le code complet, j'avais mis des lignes en commentaires pour voir la sortie... L'aglo donne la différence de charactères avec des + et -, ce qui n'est pas vraiment ce que je veux faire, mais cela fait en partie. Donc je me demandais comment modifier l'algo pour faire plus un alignement de séquence un peut comme on aligne un code génétique !


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    public class PrintDiff {
     
        char[]  input1  = "ABCDE".toCharArray();
        char[]  input2  = "ACDC".toCharArray();
        int     M       = input1.length;
        int     N       = input2.length;
     
        public void run() {
            int[][] opt = lcsLength(input1, input2);
            printDiff(opt, input1, input2, M - 1, N - 1);
        }
     
        public int[][] lcsLength(char[] input1, char[] input2) {
            int[][] opt = new int[M][N];
            for (int i = 1; i < input1.length; i++) {
                for (int j = 1; j < input2.length; j++) {
                    if (input1[i] == input2[j]) {
                        opt[i][j] = opt[i - 1][j - 1] + 1;
                    } else {
                        opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]);
                    }
                }
            }
            return opt;
        }
     
        public void printDiff(int opt[][], char input1[], char input2[], int i,
                int j) {
            if ((i >= 0) && (j >= 0) && (input1[i] == input2[j])) {
                printDiff(opt, input1, input2, i - 1, j - 1);
                System.out.print("  " + input1[i]);
            } else if ((j > 0) && ((i == 0) || (opt[i][j - 1] >= opt[i - 1][j]))) {
                printDiff(opt, input1, input2, i, j - 1);
                System.out.print(" +" + input2[j]);
            } else if ((i > 0) && ((j == 0) || (opt[i][j - 1] < opt[i - 1][j]))) {
                printDiff(opt, input1, input2, i - 1, j);
                System.out.print(" -" + input1[i]);
            } else {
                System.out.print("");
            }
        }
     
        public static void main(String[] args) {
            new PrintDiff().run();
        }
     
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    En gros ce que je veux faire c'est ceci avec le diff, sans passer par un Algorythme de 200 lignes comme celui de Needleman–Wunsch.

    Input
    Array 1 : MKNLASREVN
    Array 2 : QMASREVNIY

    Output
    Array 1 (or a simple print) : -MKNLASREVN
    Array 2 (or a simple print) : QM---ASREVN

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Crypter une chaine de caractères
    Par Yabo dans le forum Réseau
    Réponses: 18
    Dernier message: 19/11/2004, 23h04
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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