algorithm - T(N) = 2T(N − 1) + N, T(1) = 2 的大 O

标签 algorithm recursion big-o

如何为此获得 big-O

T(N) = 2T(N − 1) + N, T(1) = 2

我得到了两种答案 O(2^N)O(N^ 2),但我不知道如何正确解决

最佳答案

T(N) 除以 2^N 并命名结果:

S(N) = T(N)/2^N

根据T(N)的定义我们得到

S(N) = S(N-1) + N/2^N                                  (eq.1)

意味着 S(N) 增加,但很快收敛到一个常数(因为 N/2^N -> 0)。所以,

T(N)/2^N -> constant

T(N) = O(2^N)

详细证明

在下面的评论中,Paul Hankin 建议如何完成证明。取 eq.1 并从 N=2 求和到 N=M

sum_{N=2}^M S(N) = sum_{N=2}^M S(N-1) + sum_{N=2}^M N/2^N
                 = sum_{N=1}{M-1} S(N) + sum_{N=1}^{M-1} (N-1)/2^{N-1}

因此,在取消索引为 N = 23、...、M-1 的项后,我们得到

S(M) = S(1) + sum_{N=1}^M N/2^N - M/2^M

并且由于右侧的级数收敛(因为它的项以 1/N^2 为界,N>>1 已知会收敛),S(M) 收敛于一个有限常数。

关于algorithm - T(N) = 2T(N − 1) + N, T(1) = 2 的大 O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49115329/

相关文章:

c - 反转输入字符串

algorithm - 在多边形中找到成本最低的路径

algorithm - 有没有一种算法可以找到最近的只有小因子的数字?

algorithm - 这个算法的时间复杂度是多少?

java - 为 A* 搜索计算 f_score[neighbor]

python - 在 Python(噩梦般的 JSON 结构)中展平未知深度的字典列表(等)

c - C 递归中的魔法?谁能解释一下?

go - 使用 golang 的四叉树递归并发

algorithm - 如何模拟算法的执行时间?

algorithm - 在受限空间内的随机位置生成 100 个球(有半径且无重叠)