贪婪的硬币兑换时间复杂性

时间:2018-11-13 21:26:51

标签: time-complexity greedy coin-change

我试图找出贪婪的硬币兑换算法的时间复杂度。 (我知道动态编程方法更适合解决此问题,但我已经做到了)。我不确定如何进行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

2 个答案:

答案 0 :(得分:1)

让我们看看边缘情况。

在最坏的情况下,D仅包含1个元素(当m=1时),而while循环中将循环n次->复杂度为O(n)。

如果m>>nmn大很多,那么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)