在进行迭代时,为什么某些特定数字需要这么长时间

时间:2017-04-09 16:24:42

标签: python algorithm

有 我今天正在解决一个问题,我使用迭代的方式来解决问题,这是我的代码,我很困惑为什么像下面这样的数字似乎无限时间运行,而其他数字(大致相同)(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

1 个答案:

答案 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计算 - 整个主题很有吸引力。