我试图找出贪婪的硬币兑换算法的时间复杂度。 (我知道动态编程方法更适合解决此问题,但我已经做到了)。我不确定如何进行while
循环,但是我确实得到了for
循环。
我有以下内容,其中D[1...m]
是有多少种面额(总是包括1),而n
是您需要进行多少找零。
这是我的算法:
CoinChangeGreedy(D[1...m], n)
numCoins = 0
for i = m to 1
while n ≥ D[i]
n -= D[i]
numCoins += 1
return numCoins
答案 0 :(得分:1)
让我们看看边缘情况。
在最坏的情况下,D
仅包含1个元素(当m=1
时),而while循环中将循环n
次->复杂度为O(n)。
如果m>>n
(m
比n
大很多,那么D
的元素很多,比n
大),那么您将循环在所有m
元素上,直到得到一个samller然后n
(大多数工作将在for循环部分)->然后为O(m)。
按钮行: O(max(m,n))
希望有帮助!
答案 1 :(得分:1)
感谢您的帮助。我改变了必须使用的算法,可以轻松计算出时间复杂度。这是我将其更改为:
CoinChangeGreedy(D[1...m], n)
numCoins = 0
for i = m to 1
if n/D[i] ≥ 1
numCoins = numCoins + (n/D[i])
n = n - [(n/D[i]) * D[i]]
return numCoins
我在其中计算出最坏情况=最好情况\in
\Theta(m)