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

Langage Perl Discussion :

nombre de différence entre 2 chaines de caratère


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par défaut nombre de différence entre 2 chaines de caratère
    Bonjour,
    j'aimerai trouver une solution pour comparer 2 chaines de caractères et déterminer combien de caractères identique (et à la même position) il y a entre les 2 chaines (ou, bien sur, combien il y en a de différent, il ne me restera qu'à faire la soustraction).
    Un petit exemple que que vous compreniez mieux:
    $a="toto"
    $b="tati"

    et je voudrai faire afficher => il y a 2 lettres identique (les même et à la même position : les 2 t)

    merci de m'aider

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    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
    use strict;
     
    my $string1 = "toto";
    my $string2 = "tati";
     
     
    my @a_string1 = split ('', $string1);
    my @a_string2 = split ('', $string2);
     
     
    my $communs = 0;
    my $differents = 0;
     
    for (my $i = 0; $i < @a_string1; $i++){
        if($a_string1[$i] eq $a_string2[$i]){ $communs++; }
        else { $differents++; }
    }
     
    print "nombre de lettres communes = $communs\nnombre de lettres différentes = $differents";
    Dans le for (my $i = 0; $i < @a_string1; $i++) tu dois utiliser le mots le plus court si ils ne sont pas de même longueur. Il y a certainement moyen de faire mieux

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par défaut
    oui j'ai envisagée cette solution, mais elle est beaucoup trop longue. Car les chaines que je veux comparer font 1000 caractères et il y en à 20000 à comparer 2 à 2...

    merci quand même

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    utilise clustalW dans ce cas, il est fait pour cela (enfin si tes séquences sont nucléiques)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par défaut
    en fait, c'est des nombres (de 1 à 8-15 selon les cas). Un exemple réel (en plus court tout de meme ):
    1\t3\t5\t3\t2\t5\t.....
    1\t2\t5\t6\t8\t5\t.....

    et je voudrai avoir comme résultat 3

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Un truc comme ça (pas encore testé) :
    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
    #!/usr/bin/perl
    use strict; use warnings;
    use Inline C => <<'END_OF_C';
     
    int c_compare( SV* str_a, SV* str_b ) {
      int common = 0;
      STRLEN len_a, len_b, len, i;
      char *a, *b;
      a = SvPV( str_a, len_a );
      b = SvPV( str_b, len_b );
      len = len_a < len_b ? len_a : len_b;
     
      for( i = 0; i < len; i++ ) {
        if( a[i] == b[i] ) common++;
      }
     
      return common;
    }
     
    END_OF_C
     
    # initialise @sequences
    my @sequences = ( "1\t2\t3\t4\t45", "2\t2\t3\t4\t10" ) ;
    @sequences = map { join '', map {chr $_} (split /\t/, $_) } @sequences;
     
    for my $i ( 0 .. $#sequences ) {
      for my $j ( ($i+1) .. $#sequences ) {
        my $common = c_compare($sequences[$i], $sequences[$j]);
        print "Les séquences $i et $j ont $common caractères communs.\n";
      }
    }
     
    __END__
    Ca devrait être relativement performant, si ça ne l'est pas alors le problème est l'algorithme (mais je ne vois pas trop comment l'améliorer ?).

    --
    Jedaï

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

Discussions similaires

  1. Test différence entre 2 chaines
    Par Thomad dans le forum SQL
    Réponses: 8
    Dernier message: 10/05/2010, 15h52
  2. Différence entre 2 dates me donnant un nombre de jours
    Par Patoune dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2007, 13h28
  3. [pb MD5 MySql et C#]Différence entre les chaines
    Par ludovic85 dans le forum C#
    Réponses: 1
    Dernier message: 31/01/2007, 22h11
  4. Nombre de minutes de différence entre deux dates
    Par Oberown dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/05/2006, 16h41
  5. Réponses: 7
    Dernier message: 03/02/2006, 14h50

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