![](/img/trans.png)
[英]What's time complexity of this Algorithm for breaking words? (Dynamic Programming)
[英]What is the time complexity of this dynamic programming algorithm?
我正在从一本书中学习动态编程解决方案。 我理解问题的解决方案,但我不确定解决方案的时间复杂性,本书没有提供。
我的问题:
给定无限数量的季度(25美分),硬币(10美分),镍币(5美分)和便士(1美分),编写代码来计算代表n美分的方式的数量。
我的分析:
每个输入必须经过4个“级别”,即25,10,5,1。 在第一级中,循环将执行n / 25次,在第二级中循环将执行最多(n / 25) (n / 10)次,第三级最多执行(n / 25) (n / 10) (n / 5),最后一级最多执行(n / 25) (n / 10)*(n / 5) n。 因此总运行时间为(n / 25) (n / 10)*(n / 5) n +(n / 25) (n / 10) (n / 5)+(n / 25) (n / 10) + n / 25,即O(N ^ 4)。 首先,我不确定我的归纳是否正确。 其次,如果我是对的,我想知道是否有更紧密的联系,因为在每个级别我只计算了最大时间而不是平均时间。
解决方案如下:
int makeChange(int n) {
int[] denoms = {25, 10, 5, l};
int[][] map = new int[n + l][denoms.length]; // precomputed
vals
return makeChange(n, denoms, 0, map);
}
int makeChange(int amount, int[] denoms, int index, int[][] map) {
if (map[amount][index] > 0) {//retrieve value
return map[amount][index];
}
if (index >= denoms.length - 1) return 1; // one denom remaining
int denomAmount denoms[index];
int ways = 0;
for (int i= 0; i * denomAmount <= amount; i++) {
//go to next denom, assuming i coins of denomAmount
int amountRemaining = amount - i * denomAmount;
ways += makeChange(amountRemaining, denoms, index + 1,
map);
}
map[amount][index] = ways;
return ways;
}
写入的算法是O(n 2 )。 分析递归函数时,可以将它们分成两部分:
那么这只是将这两个数字相乘的问题。 因为函数结果在这里被缓存,所以缓存中每个值的工作最多只能完成一次。 由于缓存大小为O(n),因此需要花费O(n)时间来填充。
对于在每个函数中完成的工作,有一个循环经历O(n)次迭代。 将这些相乘得出O(n 2 )的估计值,这是通过粗略估计而产生的(输入值加倍导致所花费的时间大约翻了四倍)。
只需递归思考计算复杂性。 要做到这一点,只需考虑25个硬币的数量,然后考虑其他硬币的数量。 如果T(n,i)
显示用最后i
个denoms
表示n
的方式的数量,我们将得到T(n,4) = T(n-25, 3) + T(n - 2 * 25, 3) + ... + T(n - n//25 * 25, 3)
denoms
T(n,4) = T(n-25, 3) + T(n - 2 * 25, 3) + ... + T(n - n//25 * 25, 3)
n//25
表示的整数除法n
)。 现在,我们可以重复这一过程, 10
, 5
,和1
分别。
因此,寻找紧密结合的复杂性,你可以假设n
是整除25
, 10
,和5
多次获得最坏的情况和严格的分析。
因此,严格的分析是:
T(n,4) = sum_{i=1}^{n/25} T(n-i*25, 3)
T(n,3) = sum_{i=1}^{n/10} T(n-i*10, 2)
T(n,2) = sum_{i=1}^{n/5} T(n-i*5, 1)
T(n,1) = 1
现在,我们可以从下到上进行计算。 T(n,2) = Theta(n/5)
, T(n,3) = Theta(n/10 * n/5)
, T(n,4) = Theta(n/25 * n/10 * n/5) = Theta(n^3)
。 正如可以看到的最终结果是Theta(n^3)
和不depned上的精确值的渐进的分析DEOS n
或通过整除5
, 10
或25
。
此外,您的计算错误,因为您没有在代码中考虑以下条件:
if (index >= denoms.length - 1) return 1; // one denom remaining
n
的最后一次是不正确的,它是1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.