【发布时间】:2020-10-07 18:04:07
【问题描述】:
算法 B 将问题划分为 2 个大小为 n-1 的子问题,递归求解,然后在恒定时间内组合它们。
算法B的时间复杂度是多少?
【问题讨论】:
标签: algorithm time-complexity divide-and-conquer
算法 B 将问题划分为 2 个大小为 n-1 的子问题,递归求解,然后在恒定时间内组合它们。
算法B的时间复杂度是多少?
【问题讨论】:
标签: algorithm time-complexity divide-and-conquer
尝试将调用映射为树的节点:
它是一棵树(二叉树),其中两个分支的高度均为n-1(因为递归调用的大小为n-1),因此根节点将有一个高度为n-1 的左分支和一个右分支高度为n-1 的分支。
现在你有 2 个完整的树,每个“路径”都长 n-1,所以你有 2 个高度为 n-1 的树,它们将有 2^(n-1) 节点,所以调用的总数是:
2^(n-1) + 2^(n-1) + 1
left branch right branch root node
= 2 * 2^(n-1) + 1
= 2^n (the +1 is negligible)
【讨论】:
在我看来基本上是这样的:
n layer 0
/ \
/ \
(n-1) (n-1) layer 1
/ \ / \
(n-2) (n-2) (n-2) (n-2) layer 2
/ \ / \ / \ / \
.............................. ...
| | | | .............. | | | |
1 1 1 1 1 1 1 1 layer n - 1
高度(水平层数)为n,每一层i进行2^i操作,所以复杂度为:
2^0 + 2^1 + ... + 2^(n - 1) =
∑ 2^i [i = 0, ..., n - 1] =
2^n - 1
所以O(2^n - 1) = O(2^n)。
【讨论】:
n 的输入,并将其递归地分成两个大小为 n - 1 的输入。第一层接收大小为n 的输入,并将其分成两个大小为n - 1 的输入。然后,第二层将处理这 2 个大小为 n - 1 的输入,并将它们分成 2 个大小为 n - 2 的输入(总共 4 个大小为 n - 2 的输入),依此类推。