贪心换币时间复杂度
Greedy Coin Change Time Complexity
我正在尝试计算贪婪硬币兑换算法的时间复杂度。 (我知道动态编程方法更适合这个问题,但我已经这样做了)。我不确定如何进行 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
让我们看看边缘情况。
在最坏的情况下 D
仅包含 1 个元素(当 m=1
时),那么您将在 while 循环中循环 n
次 -> 复杂度为 O(n)。
如果m>>n
(m
比n
大很多,所以D
有很多比n
大的元素)那么你将循环所有 m
元素,直到你得到更小的一个然后 n
(大部分工作将在 for 循环部分)-> 然后它 O(m)。
按钮行:O(max(m,n))
希望对您有所帮助!
感谢您的帮助。我改变了我必须的算法,我可以很容易地计算出它的时间复杂度。这是我将其更改为:
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)
我正在尝试计算贪婪硬币兑换算法的时间复杂度。 (我知道动态编程方法更适合这个问题,但我已经这样做了)。我不确定如何进行 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
让我们看看边缘情况。
在最坏的情况下 D
仅包含 1 个元素(当 m=1
时),那么您将在 while 循环中循环 n
次 -> 复杂度为 O(n)。
如果m>>n
(m
比n
大很多,所以D
有很多比n
大的元素)那么你将循环所有 m
元素,直到你得到更小的一个然后 n
(大部分工作将在 for 循环部分)-> 然后它 O(m)。
按钮行:O(max(m,n))
希望对您有所帮助!
感谢您的帮助。我改变了我必须的算法,我可以很容易地计算出它的时间复杂度。这是我将其更改为:
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)