【发布时间】:2017-07-29 22:09:04
【问题描述】:
从 Fuss-Catalan 系列 C{4}_n(请参阅整数序列在线百科全书OEIS A002293),我想使用记忆法计算第 n 项。我在下面编写的代码有效,但在我的笔记本电脑上 n=200 时需要大约 43 秒。有没有办法进一步加快速度?
numterms = 20
C4 = Array{BigInt}(numterms+1) # memoization dictionary
fill!(C4,-1) # -1 implies not yet computed
C4[1] = 1 # Base case for n=0, C[n+1] provides nth term
function catalan4(n,C)
C[n+1] == -1 || return C[n+1]
sum1 = convert(BigInt,0)
for i in 1:n
sum2 = convert(BigInt,0)
for j in 1:(n-i+1)
sum3 = convert(BigInt,0)
for k in 1:(n-i-j+2)
sum3+= catalan4(k-1,C)*catalan4(n-i-j-k+2,C)
end
sum2 += catalan4(j-1,C)*sum3
end
sum1 += catalan4(i-1,C)*sum2
end
C[n+1] = sum1
return sum1
end
for i in 1:numterms
println(i,"\t",catalan4(i,C4))
end
这按预期提供:
1 1
2 4
3 22
4 140
5 969
6 7084
7 53820
8 420732
9 3362260
10 27343888
11 225568798
12 1882933364
13 15875338990
14 134993766600
15 1156393243320
16 9969937491420
17 86445222719724
18 753310723010608
19 6594154339031800
20 57956002331347120
谢谢!
【问题讨论】:
-
虽然我没有对你的代码进行基准测试,但我猜最重要的是将
C声明为const。避免使用可变的全局变量。 -
我在 C 之前添加了 const 关键字 - 不幸的是并没有什么不同。
-
啊,我明白了,它是作为参数传递的。
-
这些数字似乎有明确的公式?
-
是的,确实有一个公式可以计算树无限长时的节点排列数。然而,当树被限制在给定的深度时,稍微复杂一点的递归就成立了,它似乎没有封闭的形式。我正在尝试使用这个更简单的示例来学习如何加快受限树案例的记忆。
标签: algorithm julia memoization