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 :

recherche dichotomique sur chaînes de carctères


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut recherche dichotomique sur chaînes de carctères
    Bonjour à tous,

    Je ne pensais pas rencontrer ce genre de problème en Perl un jour, mais là, j' .

    Je dispose d'un lexique de noms propres, une forme par ligne dans un fichier texte trié par les bons soins de la fonction sort du plus petit au plus grand. Dans ce fichier, "Allemagne de l'Est" se situe avant "Allemagne".

    Le problème, c'est que quand je fais une recherche dichotomique sur ce fichier, j'utilise la fonction lt pour savoir si le mot que je cherche est situé avant ou arpès le mot que je teste, et que cette fonction considère que la forme "Allemagne" est plus petite que la forme "Allemagne de l'Est". Résultat, à chaque fois que j'ai une forme simple et une forme composée à partir de celle-ci dans mon lexique, ma recherche n'aboutit pas.

    voici le code de ma recherche:

    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
    my ($forme1) = shift @_;
     
    	#initialisation des variables pour la recherche dichotomique
    	my ($debut)=0;
    	my ($fin)=$#lexique_NP;
    	my ($tampon)=0;
    	my ($milieu);
     
    	#comparer les deux listes
    	while($debut<=$fin) {
     
    		$milieu= ($debut+$fin)/2;
    		$milieu=~s/(.*),.*/$1/;
     
    		chomp $lexique_NP[$milieu];
     
    		#si la forme est identifiée, modifier la valeur de tampon 
    		if($forme1=~/^$lexique_NP[$milieu]$/i){
    			$tampon=1;
    			$debut=$fin+1;
    			}
     
    		elsif($forme1 lt $lexique_NP[$milieu]){
    			 $fin=$milieu-1;
    		}
     
    		else{
    			$debut=$milieu+1;
    		}
     
    	}
    	return($tampon);
    Je ne vois pas comment faire ma comparaison sans lt, quelqu'un pour m'éclairer ?

    Merci par avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut Re: recherche dichotomique sur chaînes de carctères
    Salut,

    Citation Envoyé par contexte
    trié par les bons soins de la fonction sort du plus petit au plus grand. Dans ce fichier, "Allemagne de l'Est" se situe avant "Allemagne"
    Pourquoi? Un sort doit mettre Allemagne avant Allemagne de l'Est

    Pour la recherche tu as besoin de savoir la position qui est un nombre (enfin un index de ton tableau).

    lt c'est pour comparer des chaînes de caractères

    lt n'est pas une fonction mais un opérateur relationnel.

    lami20j
    --
    lami20j

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,

    Donc après sort Allemagne se trouve avant Allemagne de l'Est (toute à fait normal).

    Mot que tu cherches et mot que tu testes, j'ai peur de ne pas saisir ce que tu veux dire.

    Voilà un exemple (j'ai mis Allemagne de l'Est avant Allemagne)
    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
    #! /usr/bin/perl
     
    use warnings;
    use strict;
     
    my ($r,$rr);
     
    print "Entrez un pays ( le test) : ";
    chomp(my $test = <STDIN>);
    print "Entrez un pays (la recherche): ";
    chomp(my $pays = <STDIN>);
     
    while (my $p = <DATA>){
      $r = $. if $p =~/$pays/i;
      $rr = $. if $p =~/$test/i;
    }
     
    print "$pays (position $r) avant $test (postion $rr)\n" if $r < $rr;
    print "$pays (position $r) après $test (position $rr)\n" if $r > $rr;
     
     
     
    __END__
    Afghanistan
    Afrique du Sud
    Albanie
    Algérie
    Allemagne de l'Est
    Allemagne
    Andorre
    Angola
    Antigua-et-Barbuda
    Arabie saoudite
    Argentine
    Arménie
    Australie
    Autriche
    Azerbaïdjan
    Le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [lamitest@localhost corbeille]$ perl b
    Entrez un pays ( le test) : allemagne
    Entrez un pays (la recherche): allemagne de l'est
    allemagne de l'est (position 5) avant allemagne (postion 6)
    [lamitest@localhost corbeille]$ perl b
    Entrez un pays ( le test) : allemagne de l'est
    Entrez un pays (la recherche): allemagne
    allemagne (position 6) après allemagne de l'est (position 5)
    --
    lami20j

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Pour la recherche tu as besoin de savoir la position qui est un nombre (enfin un index de ton tableau).
    cela signifie que je dois utiliser un Hash plutôt qu'une liste?

    Mot que tu cherches et mot que tu testes, j'ai peur de ne pas saisir ce que tu veux dire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    elsif($forme1 lt $lexique_NP[$milieu]){ 
              $fin=$milieu-1; 
          }
    Pour le sort, cela me semble bien étrange en effet, mais je t'assure que j'ai trié mon lexique avec et que "Allemagne" "Allemagne de l'Est" n'est pas un exemple isolé...

    Merci déjà pour ces indices, je vais tenter le Hash

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Résolution du problème
    Ca y est, j'ai compris!

    Mon sort ne trie pas "Allemagne" et "Allemagne de l'Est", mais "Allemagne\n" et "Allemagne de l'Est\n", ce qui fait une grande différence.

    Merci lami20j, euh.....

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

Discussions similaires

  1. Question sur la recherche dans les chaînes de caractères
    Par Garamante dans le forum VBScript
    Réponses: 5
    Dernier message: 15/12/2008, 17h33
  2. [Requête] Recherche sur chaîne de caractères
    Par kryss_63 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/07/2007, 19h48
  3. Recherche documentation sur les arbres
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/09/2004, 01h40
  4. recherche doc sur les courbe de bézier
    Par amaury pouly dans le forum OpenGL
    Réponses: 4
    Dernier message: 29/04/2003, 22h41

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