Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
dichotomie [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


dichotomie

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Dernière révision Les deux révisions suivantes
dichotomie [2009/04/20 08:36]
tyrtamos
dichotomie [2009/04/20 09:05]
tyrtamos
Ligne 247: Ligne 247:
 import time import time
  
-def creafic(fichier, lg, lge, i1i2):+def creafic(fichier, lg, lge, I1I2):
     # fabrication de la liste à enregistrer     # fabrication de la liste à enregistrer
-    L = [random.randint(i1i2) for i in xrange(0,lg)]+    L = [random.randint(I1I2) for i in xrange(0,lg)]
  
     # tri de la liste     # tri de la liste
Ligne 266: Ligne 266:
 lg = 1000000 lg = 1000000
 lge = 5 lge = 5
-i1 = 1000 +I1 = 1000 
-i2 = 9999 +I2 = 9999 
-creafic(fichier, lg, lge, i1i2+ 
-print u"fichier créé:", fichier, lg, lge, i1i2+t = time.clock() 
 +creafic(fichier, lg, lge, I1I2) 
 +t = time.clock()-t 
 +print u"création du fichier:", fichier, lg, lge, I1I2, "en", t, "secondes"
 </code> </code>
  
-Par exemple, avec creafic("datas.fad", 1000000, 5, 1000, 9999), on crée un fichier d'environ 5 Mo qui contiendra 1000000 d'entiers triés compris entre 1000 et 9999, placés dans des enregistrements de 5 octets.+Par exemple, avec creafic("datas.fad", 1000000, 5, 1000, 9999), on crée un fichier d'environ 5 Mo qui contiendra 1000000 d'entiers triés compris entre 1000 et 9999, placés dans des enregistrements de 5 octets. Cette création prend environ 20 secondes.
  
-On va maintenant créer une fonction de lecture d'un enregistrement connaissant son indice, ainsi qu'une liste des indices croissants:+On va maintenant créer une fonction de lecture d'un enregistrement connaissant son indice, ainsi qu'une liste des indices croissants tel que I[i]=i:
  
 <code python> <code python>
Ligne 285: Ligne 288:
 </code> </code>
  
-On a toujours la fonction de recherche séquentielle utilisée comme référence (fonction seq(): voir le test précédent)+Vous pouvez vérifier la validité du fichier sur disque comme suit. Mais ne le faites pas pour le fichier d'1000000 de valeurs: cela demanderait trop de temps d'affichage. 
 + 
 +<code python> 
 +# verification 
 +f = open(fichier, 'rb'
 +for i in I: 
 +    print litdata(i) 
 +print 
 +f.close() 
 +</code> 
 + 
 +On va utiliser maintenant les fonctions de recherche précédentesdichot() pour la recherche dichotomique et seq(pour les recherches séquentielles.
  
 Et voilà le code d'essai, qui va calculer une valeur au hasard, va la trouver par les 2 méthodes (dichot et seq), et va comparer les temps de réponse. Le programme est prévu pour s'exécuter en boucle afin de stabiliser les résultats. Il doit donc être arrêté avec Ctle-C: Et voilà le code d'essai, qui va calculer une valeur au hasard, va la trouver par les 2 méthodes (dichot et seq), et va comparer les temps de réponse. Le programme est prévu pour s'exécuter en boucle afin de stabiliser les résultats. Il doit donc être arrêté avec Ctle-C:
Ligne 297: Ligne 311:
     try:     try:
         c += 1          c += 1 
-        x = random.randint(i1-1, i2+1)+        x = random.randint(I1-1, I2+1)
  
         t = time.clock()         t = time.clock()
-        r,= dichot(x, I, key=litdata)+        r1,i1 = dichot(x, I, key=litdata)
         t1 += time.clock()-t         t1 += time.clock()-t
            
         t = time.clock()         t = time.clock()
-        r,= seq(x, I, key=litdata)+        r2,i2 = seq(x, I, key=litdata)
         t2 += time.clock()-t         t2 += time.clock()-t
  
-        print [ri], litdata(i), t2/t1, t1/c+        print x, [r1i1], [r2, i2], litdata(i1), litdata(i2), t2/t1, t1/c
     except:     except:
         break         break
 f.close() f.close()
 +</code>
 +
 +Ce qui affiche, par exemple:
 +
 +<code>
 +9097 [0, 900121] [0, 900121] 9097 9097 17305.7813651 0.000167109172573
 +4026 [0, 337762] [0, 337762] 4026 4026 17271.2771325 0.000167086643643
 +5159 [0, 463844] [0, 463844] 5159 5159 17267.2479243 0.000167060928584
 +8676 [0, 853399] [0, 853399] 8676 8676 17356.9558071 0.000167023901043
 </code> </code>
  
Ligne 385: Ligne 408:
 </code> </code>
  
-Voilà. Maintenant, tout est en place pour la recherche par dichotomie:+On va utiliser maintenant les fonctions de recherche précédentes: dichot() pour la recherche dichotomique et seq() pour les recherches séquentielles.
  
 <code python> <code python>
dichotomie.txt · Dernière modification: 2009/04/20 09:06 de tyrtamos