【问题标题】:Determining time complexity of recursive function确定递归函数的时间复杂度
【发布时间】: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) 如果遵循前两个分支中的任何一个。

标签: python recursion catalan


【解决方案1】:

不确定这是否是您想要的,但根据该页面,您可以编写函数来计算 O(n) 中的加泰罗尼亚数,如下所示:

def catalan(n):
    num, div = 1, 1
    for x in range(n + 2, 2*n + 1):
        num *= x
    for x in range(2, n + 1):
        div *= x
    return num / div

【讨论】:

    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 2018-05-29
    • 2018-08-18
    相关资源
    最近更新 更多