【发布时间】:2015-08-27 05:25:29
【问题描述】:
我编写了一个计算Catalan Numbers 的递归函数。 递归公式为。
我的代码:
def catalan(n): # We call this function. To my opinion it is more elegant.
d = dict()
return catalan_rec(n,d)
def catalan_rec(n,d):
if n == 0:
result = 1
elif n in d: return d[n]
else:
result = 0
for i in range(n):
result += catalan_rec(i,d)*catalan_rec(n-i-1,d)
d[n] = result
return result
现在,很明显递归深度是 O(n)。我不确定这个算法的时间复杂度是多少。递归树有 O(n) 个节点,在任何节点(叶子除外)中我们进行两次调用。任何调用都是 O(1),因为我们只检查字典中是否已经有结果,因此时间复杂度是 O(n)。
我的推理正确吗?
顺便问一下,有没有一个选项可以编写时间复杂度比 O(n^2) 更好的非递归算法?
谢谢!
【问题讨论】:
-
Python 可能不是实现递归算法的最佳语言,因为它没有适当的递归支持。我相信,在理想情况下,您的推理是正确的,但如果您使用 Python,您的实际运行时间可能无法反映这一点。我建议你看看 Haskell 或 R。
-
Kwarrtz,我知道 python 的缺点,但我正在大学学习一门课程,他们决定教 python。这是我试图解决的一个测试问题。顺便说一句,in 运行速度很快,比 Haskell 慢不了多少。
-
@Galc127 没有任何电话是
O(1)。请注意,您在这里有for i in range(n)。这不可能在恒定时间内起作用:) -
我的建议并不是出于对性能的考虑(尽管我必须看到一个基准才能相信你的说法),而是为了 Python 适合运行递归算法。但是,如果大学课程是 Python 的,你就别无选择了。
-
@Galc127 时间是
O(1)如果遵循前两个分支中的任何一个。