それで、私は coursera.org の新しいアルゴリズム コースをたどり始めたところです。コースは Java で行われ、Java とアルゴリズムを同時に学びたくないので、JAVA サンプルを Python に「翻訳」しています。ただし、高速であるはずのアルゴリズムのパフォーマンスが低下しているため、少し立ち往生しています。私にとって奇妙な点は、テストを実行するときに大きな入力があると、遅いアルゴリズムが最速であるということです...これは、インスタンス化する配列(ID)で起こっている奇妙なことに関係していると思います異なるオブジェクト:
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)
これにより、次の結果が出力されます。
[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
何らかの理由で、QuickFindUF インスタンス以外のすべてで、比較の前に配列が変更されています。理由はありますか?
これは私が作成したリポジトリです: https://github.com/herrmendez/python-algorithms