生成括号的递归实现的时间复杂度分析

时间:2018-04-04 05:53:05

标签: algorithm time-complexity

当我们有一个递归函数来生成带有N个有效括号的括号时,时间复杂度就是加泰罗尼亚数字的时间复杂度。这对我来说没有意义。

我对时间复杂度的分析是,我们在递归树的每个节点都有两个操作。我们可以添加一个小括号或一个左括号。所以我们进行两次递归调用。

T(n) = 2 * T(N - 1) = O(2^N)

我得O(2^N)作为我的时间复杂度 - 而非加泰罗尼亚数字。加泰罗尼亚语的数字对我来说是如此随意 - 它没有意义。有人能解释一下吗?

1 个答案:

答案 0 :(得分:2)

在您的假设中,您将探索可由字符'('')'组成的所有案例。但是,有可能消除一些这样的情况,不是吗?例如,我们知道对于输入N = 4"))(("不是有效/平衡字符串。事实上,从我们放置该字符串的第一个字符的那一刻起,我们就知道这是真的。这是Python中的递归实现,以便我们可以更具体地讨论它。

def generate(index, N, s, depth):
    if index == N:
        print s

    if depth > 0:
        generate(index + 1, N, s + ')', depth - 1)
    if depth < N:
        generate(index + 1, N, s + '(', depth + 1)

基本上,在递归实现中,您保持当前深度的分数。每当该分数小于0时,您就会知道您的字符串变得不平衡,并且没有必要进一步探索。因此,与您的假设相反,您不会探索两个子问题。

问题,如果你考虑一下,基本上是找到N = 2 * K个不同字符的有效排列数。在第一个(最左侧)位置,您可以放置​​K个字符。 (即所有'(')在第二个位置,您可以放置​​其中一个')'字符,也可以放置剩余的K-1 '('个字符之一。通过这种方法,使用重复排列,您可以发现您提到的问题的复杂性实际上等于K th 加泰罗尼亚数字。

基本上,对于长度为2N的字符串,您有两个不同的字符,每个字符都有N个字符。使用permutation with repetition所有,此字符串的可能排列为(2N)! / (N! N!)。那么,N th 加泰罗尼亚数的公式就是那个值,除以另外的(N+1),正如您在[相关维基百科文章](https://en.wikipedia.org/wiki/Catalan_number()中所看到的那样。如果您考虑不处理上面提到的未绑定字符串的情况,您可以看到(N+1)因素是由于您不计算这两个子问题的情况。