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

Algorithm 生成括号的递归实现的时间复杂度分析,algorithm,time-complexity,Algorithm,Time Complexity,当我们使用递归函数生成带有N有效括号的括号时,时间复杂度与加泰罗尼亚数相同。这对我来说毫无意义 我对时间复杂性的分析是,递归树的每个节点上都有两个操作。我们可以添加一个右括号或左括号。所以我们做了两个递归调用 T(n) = 2 * T(N - 1) = O(2^N) 我得到的O(2^N)是我的时间复杂性——而不是加泰罗尼亚数字。加泰罗尼亚数字对我来说太武断了——毫无意义。有人能进一步解释一下吗?在您的假设中,您将探索所有可以由字符'(“和”)构成的情况。然而,有可能消除其中一些病例,不是吗?例

当我们使用递归函数生成带有
N
有效括号的括号时,时间复杂度与加泰罗尼亚数相同。这对我来说毫无意义

我对时间复杂性的分析是,递归树的每个节点上都有两个操作。我们可以添加一个右括号或左括号。所以我们做了两个递归调用

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

我得到的
O(2^N)
是我的时间复杂性——而不是加泰罗尼亚数字。加泰罗尼亚数字对我来说太武断了——毫无意义。有人能进一步解释一下吗?

在您的假设中,您将探索所有可以由字符
'(“
”)构成的情况。然而,有可能消除其中一些病例,不是吗?例如,我们知道对于输入
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)
def生成(索引、N、s、深度):
如果索引==N:
印刷品
如果深度>0:
生成(索引+1,N,s+'),深度-1)
如果深度
本质上,在递归实现中,您保留当前深度的分数。只要该分数小于
0
,您就知道字符串变得不平衡,因此没有必要进一步探索。因此,与您假设的相反,您不会同时探索子问题

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


基本上,对于长度为
2N
的字符串,你有两个不同的字符,每个字符都有
N
。使用,all这个字符串可能的排列方式是
(2N)!/(N!N!)
。那么,第N个加泰罗尼亚数字的公式就是这个值除以一个额外的
(N+1)如果您考虑的是不处理上面提到的不平衡字符串的情况,您可以看到<代码>(n+1)。
因子是由于没有同时计算两个子问题的情况造成的。

Hm,它仍然不符合我的要求。我喜欢有效的置换类比。但我不能从这里转到加泰罗尼亚数字——这对我来说毫无意义。@asndondasdoasndo231213我添加了最后一段来演示重复置换如何给你带来好处一些几乎与第n个加泰罗尼亚数相同的排列。也许这可以帮助你进一步理解界。