Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要解释一下为什么这条线会使我的斐波那契计算器中的一切都变快。(Python)_Python_Dynamic Programming_Fibonacci - Fatal编程技术网

需要解释一下为什么这条线会使我的斐波那契计算器中的一切都变快。(Python)

需要解释一下为什么这条线会使我的斐波那契计算器中的一切都变快。(Python),python,dynamic-programming,fibonacci,Python,Dynamic Programming,Fibonacci,有人能解释为什么这一行fibValue[n]=结果让一切都变得更快吗? 只要去掉那条线,30岁以上的人都需要很长时间才能加载。 提前谢谢 fibValue = { 0: 0, 1: 1} def fib(n): if n in fibValue.keys(): return fibValue[n] else: result = fib(n-1) + fib(n-2) fibValue[n] = result ret

有人能解释为什么这一行fibValue[n]=结果让一切都变得更快吗? 只要去掉那条线,30岁以上的人都需要很长时间才能加载。 提前谢谢

fibValue = { 0: 0, 1: 1}

def fib(n):
    if n in fibValue.keys():
        return fibValue[n]
    else:
        result = fib(n-1) + fib(n-2)
        fibValue[n] = result
        return result

result = fib(int(input("Enter number: ")))
print(result)

这就是所谓的aka技术。存储和重用计算结果。这使得以后的查找和计算速度大大加快

当您删除fibValue[n]=result时,您不存储结果,并且通过不存储结果,您需要重新计算该特定数字n的fibonacci

考虑计算fib6。在第一次函数调用中,您将得到

fib(6) = fib(5) + fib(4)
通过递归,这给出了

fib(6) =                       fib(4)               +            fib(3)        +             fib(3)       +     fib(2)

fib(6) =            fib(3)        +     fib(2)      +     fib(2)      + fib(1) +      fib(2)     + fib(1) + fib(1) + fib(0)

fib(6) =      fib(2)     + fib(1) + fib(1) + fib(0) + fib(1) + fib(0) + fib(1) + fib(1) + fib(0) + fib(1) + fib(1) + fib(0)

fib(6) = fib(1) + fib(0) + fib(1) + fib(1) + fib(0) + fib(1) + fib(0) + fib(1) + fib(1) + fib(0) + fib(1) + fib(1) + fib(0)

fib(6) =    1   +    1   +    1   +    1   +    1   +    1   +    1   +    1   +   1   +    1   +    1   +    1   +    1

fib(6) =    13
您可以看到fib3和fib2的计算次数至少各为3次。现在考虑一下,如果你的输入大得多,比如说1000。你会反复计算fib3,fib100,fib200等等。这浪费了大量的时间。因此,为了节省时间,因为我们是程序员,我们非常渴望时间,我们交换空间,即内存来缓存以前的计算,因此。。。通过在缓存上执行查找来节省时间


在Python字典上执行查找的时间复杂度平均为O1,这需要固定的时间,这是程序员可能希望在算法中得到的最好结果。与从头开始计算fibn的笨拙时间复杂度相比。请注意,正如所述,您的函数当前通过迭代dict.keys对象来执行查找,这将导致查找的时间复杂度降低。只需将if n in fibValue.key更改为if n in fibValue可能会加快计算速度


正如所建议的,如果你只找到一个fibonacci值,你可以通过只存储两个值,即最新的fib值,而不是缓存每个结果,使你的fibonacci计算器在时间和空间上更加高效。

你在这里用来计算fibonacci数列的技术叫做动态规划方法

动态规划方法将问题分解为子问题,求解每个子问题并保存每个子问题的结果


这些结果可用于解决其他子问题。因此,它使算法更快。

为两个版本绘制一个堆栈树,并找出您认为该行的作用是什么?您正在缓存早期的结果。您将内存与运行时进行交换,这通常是您做出的选择。。。顺便说一句,你存储的太多了,你只需要为你的小程序存储2个数字我不知道那行是干什么的,我试着在练习时把它取出来,因为我认为它做的不多,但它只是让一切都变慢了。请注意,fibValue中的if n.keys:测试效率很低。它构建了一个键序列并进行顺序查找-这是0n-你应该使用fibValues中的if n:而不是使用n的散列来进行01查找。但是它做得很糟糕-你只需要存储2个数字... 不是所有的。如果你只计算一个值就可以了。但是,如果您要进行多个查询,程序不会这样做——如果您进行了查询,则可能需要将它们保留一段时间time@PatrickArtner这对你们两个都很有帮助。Patrick,我将查看您链接的内容。在Python字典上执行查找的时间复杂度平均为O1,=>如果在dict中键入关键字,则正确执行查找时:-而不是在操作片段中在dict.keys上查找关键字时,即0n