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 :

Modification d'un algo [recherche de chaine]


Sujet :

Langage Perl

  1. #1
    Membre du Club Avatar de bluecurve
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 68
    Points : 43
    Points
    43
    Par défaut Modification d'un algo [recherche de chaine]
    J'ai trouv un algo sur ce forumn il sert a trouver pour un mot la chaine de caractères ou il est le plus de fois présent :


    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #!/usr/bin/perl -w 
    use strict; 
    use diagnostics;
     
    ########################FONCTION######################## 
     
    sub function{ 
       #Le tableau solutions contiendra comme première valeur 
       #la valeur maximale de nos tables de hachages 
       #et comme 2ème valeur l'index de notre tableau passé en argument 
       #contenant les références de nos tables et qui pointera sur la table ayant 
       #la plus grande valeur 
       my @solutions; 
            $solutions[0] = 0; 
     
            #On cherche quel est la plus grande valeur contenue 
            #dans nos tables de hachages 
       for(my $i=0; $i<scalar(@_); $i++){ 
          my %hash = %{$_[$i]}; 
          my @tablo = @{$hash{"m"}}; 
          my $value = $tablo[0]; 
          if($value>$solutions[0]){ 
             $solutions[0] = $value; 
             $solutions[1] = $i; 
          } 
       } 
     
       return @solutions; 
    } 
     
    ######################MAIN#################### 
     
    #########VARIABLES À DÉCLARER############ 
     
    my %i = ( 
     
         m => [ "7", "http://www.developpez.com" ] 
     
    ); 
     
     
     
    my %t = ( 
     
         m => [ "5", "http://gldavid.developpez.com" ] 
     
    ); 
     
     
    my %u = ( 
     
         m => [ "3", "http://www.google.com" ] 
     
    ); 
     
    my @tab = (); 
     
    #Pour se simplifier la vie, on va ranger nos tables de hachages 
    #dans une liste. On stocke les références de nos tables. 
     
    my$i = \%i; 
    my$t = \%t; 
    my$u = \%u; 
     
    push(@tab, $i); 
    push(@tab, $t); 
    push(@tab, $u); 
     
    #Et on lance notre fonction de recherche. 
    #Celle-ci renvoit un tableau. 
     
    my @sol = function(@tab); 
     
    #Affichage de la solution 
    my %hash = %{$tab[$sol[1]]}; 
    my @tablo = @{$hash{"m"}}; 
    my $link = $tablo[1]; 
    print "Le lien à garder est $link.\n";

    Pour utiliser l'algo il faut passer pas des tables de hachages des références et un tableau . Je ne peut pas l'utiliser de cette façon du coup j'essaie depuis un bon moment de le modifier.

    j'ai un tableau @Strings qui contient des chaines des caractères , et $var = 'maison'; disont.

    Je cherche comment modifier l'algo précédent pour ne pas avoir a passer par des hash , puis références et enfin un tableau. J'ai testé divers solutions mais a base de référence anonyme etc... bref rien de très propre j'avoue ne plus avoir d'idées.

    merci a vous

  2. #2
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par bluecurve
    J'ai trouv un algo sur ce forumn il sert a trouver pour un mot la chaine de caractères ou il est le plus de fois présent :


    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #!/usr/bin/perl -w 
    use strict; 
    use diagnostics;
     
    ########################FONCTION######################## 
     
    sub function{ 
       #Le tableau solutions contiendra comme première valeur 
       #la valeur maximale de nos tables de hachages 
       #et comme 2ème valeur l'index de notre tableau passé en argument 
       #contenant les références de nos tables et qui pointera sur la table ayant 
       #la plus grande valeur 
       my @solutions; 
            $solutions[0] = 0; 
     
            #On cherche quel est la plus grande valeur contenue 
            #dans nos tables de hachages 
       for(my $i=0; $i<scalar(@_); $i++){ 
          my %hash = %{$_[$i]}; 
          my @tablo = @{$hash{"m"}}; 
          my $value = $tablo[0]; 
          if($value>$solutions[0]){ 
             $solutions[0] = $value; 
             $solutions[1] = $i; 
          } 
       } 
     
       return @solutions; 
    } 
     
    ######################MAIN#################### 
     
    #########VARIABLES À DÉCLARER############ 
     
    my %i = ( 
     
         m => [ "7", "http://www.developpez.com" ] 
     
    ); 
     
     
     
    my %t = ( 
     
         m => [ "5", "http://gldavid.developpez.com" ] 
     
    ); 
     
     
    my %u = ( 
     
         m => [ "3", "http://www.google.com" ] 
     
    ); 
     
    my @tab = (); 
     
    #Pour se simplifier la vie, on va ranger nos tables de hachages 
    #dans une liste. On stocke les références de nos tables. 
     
    my$i = \%i; 
    my$t = \%t; 
    my$u = \%u; 
     
    push(@tab, $i); 
    push(@tab, $t); 
    push(@tab, $u); 
     
    #Et on lance notre fonction de recherche. 
    #Celle-ci renvoit un tableau. 
     
    my @sol = function(@tab); 
     
    #Affichage de la solution 
    my %hash = %{$tab[$sol[1]]}; 
    my @tablo = @{$hash{"m"}}; 
    my $link = $tablo[1]; 
    print "Le lien à garder est $link.\n";

    Pour utiliser l'algo il faut passer pas des tables de hachages des références et un tableau . Je ne peut pas l'utiliser de cette façon du coup j'essaie depuis un bon moment de le modifier.

    j'ai un tableau @Strings qui contient des chaines des caractères , et $var = 'maison'; disont.

    Je cherche comment modifier l'algo précédent pour ne pas avoir a passer par des hash , puis références et enfin un tableau. J'ai testé divers solutions mais a base de référence anonyme etc... bref rien de très propre j'avoue ne plus avoir d'idées.

    merci a vous


    Je pense pas que tu est un autre choix que d'utiliser la méthode normal de l'ago, mais c'est vrais que passer par des hash, puis des références puis un tableau c'est un peu lourd. J'ai pas trop d'idée pour ton algo mais la technique utilisé est très bonne quoi que les préliminaires soit lourde

  3. #3
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Changer la façon dont est appelé ton algo revient a encoder un nouveau en gros. l'utilisation de l'algo actuel est pourtant simple


    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
     
    sub _trie_function ($)
    { 
       my $data = shift;
       my @solutions; 
          $solutions[0] = 0; 
     
       for(my $i=0; $i<scalar(@$data); $i++){ 
          my %hash = %{$data->[$i]}; 
          my @tablo = @{$hash{'m'}}; 
          my $value = $tablo[0]; 
          if($value>$solutions[0]){ 
             $solutions[0] = $value; 
             $solutions[1] = $i; 
          } 
       } 
       return @solutions; 
    }
     
     
    sub _set_segment ($)
    {
      my $tab  = shift;
      my @sol = _trie_function($tab); 
      my %hash = %{$tab->[$sol[1]]}; 
      my @tablo = @{$hash{'m'}}; 
      my $segment = $tablo[1]; 
      print "The segment is $segment\n"; 
      #return $segment;
    }
     
     
    my @string = ();
    push(@string, 'maison poisson coucou maison maison');
    push(@string, 'titi vas a la maison');
    push(@string, 'bobo maison maison');
    push(@string, 'ddddddddddd');
     
     
     
    teste();
     
    sub teste
    {
      my @var = qw/maison/;
      my @p = ();
      foreach my $line ( @string )
      {
          my $t = { 'm' => [0,''] };
        foreach my $vars ( @var )
        {
          while ( $line =~ /\b$vars\b/gci )
          {
             $t->{'m'}[0]++;
          }
          $t->{'m'}[1] = $line;
        }
        push(@p, $t);
      }
     
      use Data::Dumper;
      print Dumper(\@p);
       _set_segment(\@p);
    }

Discussions similaires

  1. [vbexcel]Rechercher une chaine dans une autre chaine...
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/12/2005, 14h49
  2. Réponses: 2
    Dernier message: 09/12/2005, 13h23
  3. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 19h04
  4. Recherche de chaine (TFindDialog)
    Par PoOky dans le forum Composants VCL
    Réponses: 10
    Dernier message: 30/08/2005, 08h59
  5. Recherche de chaine ...
    Par Metal3d dans le forum C
    Réponses: 8
    Dernier message: 27/07/2002, 02h20

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