Donc, je viens de commencer à suivre le nouveau cours d'algorithme de coursera.org. Comme le cours est en Java, et que je ne veux pas apprendre les algorithmes Java + en même temps, je suis en train de "traduire" les samples JAVA en python. Cependant, je suis un peu coincé, car les algorithmes qui devraient être plus rapides sont moins performants. Le plus étrange pour moi, c'est qu'avec une grosse entrée quand j'exécute les tests, l'algorithme le plus lent est le plus rapide, ... et je pense que cela a quelque chose d'étrange avec le tableau (ids) que j'instancie différents objets avec:Python: comportement étrange lors du passage de tableau à l'objet
import time
from utils.benchmark import *
from quickunion import *
from quickunion_weighted import *
from quickfind import *
# create only one array of id's so the comparison is fair
ids = random_tree(10)
my_trees = [QuickFindUF, QuickUnionUF,
QuickUnionWeighted, QuickUnionPathCompression]
print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
def test(classes, tree):
for e in classes:
tmp = e(arr=tree)
print tmp.id
print "%s:" % tmp.__class__.__name__
t = time.clock()
print "\tare 3 and 6 connected?: %s" % tmp.connected(3, 6)
"\tunion(3, 6): "
tmp.union(3,6)
print "\tare 3 and 6 connected?: %s" % tmp.connected(3, 6)
print "Total time: {0} ".format(time.clock()-t)
if __name__ == '__main__':
test(my_trees, ids)
Cette imprime les résultats suivants:
[1, 8, 1, 7, 4, 8, 5, 7, 8, 2]
QuickFindUF:
are 3 and 6 connected?: False
are 3 and 6 connected?: True
Total time: 2.7e-05
[1, 8, 1, 5, 4, 8, 5, 5, 8, 2]
QuickUnionUF:
are 3 and 6 connected?: True
are 3 and 6 connected?: True
Total time: 2.6e-05
[1, 8, 1, 5, 4, 8, 5, 5, 8, 2]
QuickUnionWeighted:
are 3 and 6 connected?: True
are 3 and 6 connected?: True
Total time: 2.8e-05
[1, 8, 1, 5, 4, 8, 5, 5, 8, 2]
QuickUnionPathCompression:
are 3 and 6 connected?: True
are 3 and 6 connected?: True
Total time: 2.7e-05
Pour une raison quelconque, les tableaux sont modifiés avant de se comparer à tous, mais l'instance QuickFindUF. Des idées pourquoi?
C'est le repo que j'ai créé. https://github.com/herrmendez/python-algorithms
(1) '' timeit' bat time' pour les petits repères. (2) Un algorithme étant asymptotiquement plus rapide ne signifie pas nécessairement que votre implémentation est réellement plus rapide pour de petites tailles de problèmes (et disons-le, 10 * est * minuscule, même la recherche linéaire pourrait être plus rapide pour 10 items). – delnan
Ceci est un bon exemple de pourquoi vous ne devriez jamais utiliser 'from foo import *'; C'est incroyablement agaçant d'essayer de savoir d'où viennent vos fonctions. – geoffspear