有 我今天正在解决一个问题,我使用迭代的方式来解决问题,这是我的代码,我很困惑为什么像下面这样的数字似乎无限时间运行,而其他数字(大致相同)(123456789, 787654321)运行不到一秒钟,我只是想知道我哪里做错了,有人可以帮忙吗?
y,x =123456789,987654321
def ksi(x,y):
z=1
result=0
while x>0:
if x>=y:
x=x-y
result =result+z
else:
y=y-x
z = 2*z
return result
答案 0 :(得分:1)
你有一个指数时间算法,虽然有时你很幸运,算法很快就能解决。
要查看最糟糕的情况,请输入y=1
。怎么了?每次迭代都会将x
递减1。因此,如果x
为1,000,000,000,000,那么这将运行1,000,000,000,000次迭代。那是很长很长的时间。
为什么那是指数级的?当我们衡量复杂性时,我们将运行时间视为输入大小的函数。当y=1
(输入的特殊情况)时,其运行时间为O(x)
,但x
的大小为n = log2 x
位(因此n = 2^x
)。对于某个整数O(n^k)
,多项式时间算法需要k
。但在这种情况下你所拥有的是运行时间O(2^n)
,这使得指数时间更加清晰。
旁注:由于z
,它比指数更糟糕,但现在不要再向这个方向发展了。
你在这里实现的东西让我想起了gcd计算。而不是每次减去单个值,而是每次迭代减去尽可能多的值。尽可能多的是通过除法和余数计算出来的。一旦你这样做,你将有一个多项式时间算法。阅读Knuth的半数值算法(计算机编程艺术第2卷)中的gcd计算 - 整个主题很有吸引力。