在分析算法时,我通常不会遇到for loop
的问题,而我在分析涉及while loop
的算法的运行时间时遇到问题。我将举例说明我的问题。
以下是我正在研究的coin-change algorithm
(众所周知的算法)的一部分:
counter = 0
s = 0
while(s <= n/100)
s = s+1
t1 = n- 100*s
h = 0
while(h <= t1/50)
h = h +1
t2 = t1 - 50*h
...
有人可以解释知道嵌套while循环的算法运行时间的最佳方法吗?
答案 0 :(得分:1)
while循环只是编写for循环的另一种方式,因此评估复杂性不应该有任何不同。
这里,外部while
循环在复杂度世界中运行n
次(与现实世界中的n成比例),因为每次迭代s
增加1并且它一直运行到{{1达到与s
成比例的值。
我认为你的内部循环有点困惑,运行n
次(在复杂世界中)t1
。现在你认为算法是O(n ^ 2),但t1 = n - 100s
在每次迭代中减少,因此内部循环对于每次后续迭代运行的次数更少,并且可能不是O(n ^ 2)。
t1
对于每次迭代都是不同的,因此整个迭代集将运行:t1
次。由于此系列中的项数与n成正比,因此求和将具有n平方项,并且对于报告复杂性,所有低阶项都将被忽略,因此您无需担心其余数字的总和。该算法为O(n ^ 2)。
诀窍是忽略每一步的常数和低阶项,这很容易!