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

Python Discussion :

recherche dichotomie dans un fichier trié


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 4
    Par défaut recherche dichotomie dans un fichier trié
    bonjour tous le monde


    je suis entrain de faire un script Python qui va rechercher dans un fichier texte trié pour retrouver une information. si il trouve l'info il doit me retourné toutes les lignes contenant cette info dans le file.

    j'ai pu aboutis à un résultat mais il n'est pas complet; voici mon script:


    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
    def Binarysearch(filename,ch):
        lo=0
        fs = open(filename, 'r')
        log=0
    #nbr lines:
        while(fs.readline()):
            log=log+1
        fs.close()
        hi=log
        fs = open(filename, 'r')
        while(1):
           	mid= int((lo+hi)/2) 
            avanc=mid
            fss = open(filename, 'r')
            # sauter les ligne jusqu'au milieu.
            while(avanc>1):
                  rec= fss.readline()
                  avanc=avanc-1
             rec=fss.readline()
             rec.strip()
            if(hi==lo):
                  fss.close()
                  return rec
            if ch in rec:
                  hi=mid
                  print rec
            else:
                  lo=mid+1
             fs.close()
    déjas je pense que les 2 lignes en rouge sont pas bien. je ne sais pas comment aller à la moitié de la première partie du fichier ( c'est ça l'algo de dichotomie).


    mon script ne me retourne pas toutes les lignes.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    1. Tout d'abord, ton probleme vient du test
    qui doit en fait être un test d'ordre
    2. fais attention aux ouverture de fichiers, fss n'est pas toujours fermé.

    3. ton strip n'a pas d'effet, il faut faire rec=rec.strip()

    4. Je te conseille de faire plus de fonctions (def numline(filename), etc.), cela rendra ton code plus compact donc plus lisible

    5. D'un point de vue performance tu es en log(n)*n. Il suffirait de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def mysearch(filename,ch):
        for i in file(filename):
            if ch in i:
                return i.strip()
        return None
    Pourquoi voulais tu faire une dichotomie?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut J'ai du mal à comprendre
    Tu compliques un problème que les puissantes possibilités de Python rendent fastoche


    - remarque en passant: appeler une variable log, c'est pas top, je trouve. Il y a une fonction mathématique qui a ce nom là

    - inutile de définir lo = 0 et mid avant d'arriver a avanc !
    Il faut calculer directement avanc = int(lhi/2)
    pourquoi se compliquer ?

    - par contre le
    while(fs.readline()):
    pour détecter la fin d'un fichier, c'est malin.
    J'écrivais while fs.readline() != '':
    Mais je ne vois pas pourquoi il faut mettre entre parenthèses
    while fs.readline(): c'est bon, non ?
    pareil plus loin pour while(1):

    - tu ne connais apparemment pas les fonctions tell() et seek()
    Comme tu es malin, je suis sûr qu'avec ces deux fonctions, tu vas maintenant faire ton programme en 3 minutes, et ça sera simple.
    Mais perso, je n'arrive pas à comprendre à partir de ton code à quoi tu veux aboutir.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2009, 17h49
  2. Recherche/Replace dans un fichier RTF (VB2005)
    Par npenel dans le forum Windows
    Réponses: 3
    Dernier message: 27/11/2007, 10h39
  3. Recherche chaine dans un fichier
    Par matt8-5 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2006, 16h07
  4. Réponses: 23
    Dernier message: 10/01/2006, 13h33
  5. Réponses: 6
    Dernier message: 05/01/2006, 14h23

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