我们正在做一个经典的问题,即确定我们可以通过一组硬币进行更改的方式数量达到Z.
例如,Amount = 5,Coins = {1,2,3}。我们可以做出5的一种方法是{2,3}。
天真的递归解决方案具有阶乘时间的时间复杂度。
f(n)= n * f(n-1)= n!
我的教授认为它实际上具有O(2^n)
的时间复杂度,因为我们只选择使用硬币。这在直觉上是有道理的。然而,为什么我的复发无法成为O(2^n)
?
修改
我的再现如下:
f(5, {1, 2, 3})
/ \ .....
f(4, {2, 3}) f(3, {1, 3}) .....
注意每一步的分支因子如何减少1。
形式上。
T(n)= n * F(n-1)= n!
答案 0 :(得分:0)
重复并不会达到预期的效果,因为它并不能反映算法所做的操作次数。
如果算法决定每个硬币是否输出,那么您可以使用T(n) = 2*T(n-1) + O(1)
的重复T(1)=O(1)
来模拟其时间复杂度;直觉是,对于每枚硬币,你有两种选择 - 输出硬币与否;这显然解决了T(n)=O(2^n)
。