私はProject Eulerの問題(number 15, lattice paths)に取り組んでいます。私は別の方法で問題を解決しましたが、私は最初に問題を解決しようとしたアルゴリズムを最適化する方法について興味があります。なぜなら、非常に迅速に成長し、実際にどれくらい時間がかかるかに驚いているからです。だから私はアルゴリズムを分析し、アルゴリズムを最適化する方法を学びたいと思っています。このアルゴリズムは最適化されていますか?それ以外はどのように使用されますか?
このアルゴリズムの手法は、左上に(0,0)
、右下に(2,2)
、角として2x2グリッドを使用します。上の点からは、パスはx+1
またはy+1
になります。だから私は、グリッド内の点のスペースに次の許容される移動が存在するかどうかをチェックすることによって、これらのパスをほぼ繰り返し作成します。
最初は左上(x+1, y+1)
から始めましたが、下から後方に移動し、いくつかの冗長性を取り除き、貴重なデータだけをメモリに格納することが効率的であることがわかりました。それで私は今どこにいるのですか。これ以上最適化することはできますか?これにはどんな種類のアプリケーションがありますか?
givenPoints
は、グリッド内のすべての点のリストであり、文字列として格納されます。つまり、'0202'
です。アルゴリズムは、経路全体ではなく固有経路の最新の点を記憶し、最後にリスト内の項目の数は一意の経路の数に等しい。
def calcPaths4(givenPoints):
paths = []
paths.append(givenPoints[-1])
dims = int(math.sqrt(len(givenPoints))) - 1
numMoves = 2*dims
numPaths = 0
for x in range(0,numMoves):
t0= time.clock()
newPaths = []
for i in paths:
origin = int(i)
dest1 = origin - 1
dest3 = origin - 100
if ('%04d' % dest1) in givenPoints:
newPaths.append(('%04d' % dest1))
numPaths +=1
if ('%04d' % dest3) in givenPoints:
newPaths.append(('%04d' % dest3))
numPaths +=1
t= time.clock() - t0
paths = newPaths
print(str(x)+": " +str(t)+": " +str(len(paths)))
return(paths)
http://codereview.stackexchange.com/ – Evert
右下のほうが好きですか? –
私はこのアルゴリズムを改善した答えを編集しました。すべての単一のパスを作成してそれらをすべて数えるのではなく、各座標のパス数を追跡し、 '(x + 1、y)のカウントを使ってパススルー座標'(x、y) ) 'と'(x、y + 1) 'である。これは動的プログラミングと呼ばれます。 – Bakuriu