Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 记忆存储器_Algorithm_Dynamic Programming_Memoization - Fatal编程技术网

Algorithm 记忆存储器

Algorithm 记忆存储器,algorithm,dynamic-programming,memoization,Algorithm,Dynamic Programming,Memoization,记忆无疑是一种强大的技术 但是动态编程在IMO中稍微好一点,因为它不涉及内存紧张(在递归程序中,参数占用内存,并且随着我们深入递归,内存会增加)。但就速度而言,两者相当 但肯定的是,记忆化比动态编程要简单得多 我的问题是:在没有内存限制的情况下使用回忆录是否可能?您可以将DP视为一种回忆录形式,它得益于对访问模式的严格保证。记忆化是一种“拉”模型,最终答案请求其子部分,这些请求(间接)导致调用的计算粒度最小。DP是一种“推送”模型,其中预测了每次计算所需的数据 可以将任何DP算法重新格式化为使用

记忆无疑是一种强大的技术

但是动态编程在IMO中稍微好一点,因为它不涉及内存紧张(在递归程序中,参数占用内存,并且随着我们深入递归,内存会增加)。但就速度而言,两者相当

但肯定的是,记忆化比动态编程要简单得多


我的问题是:在没有内存限制的情况下使用回忆录是否可能?

您可以将DP视为一种回忆录形式,它得益于对访问模式的严格保证。记忆化是一种“拉”模型,最终答案请求其子部分,这些请求(间接)导致调用的计算粒度最小。DP是一种“推送”模型,其中预测了每次计算所需的数据


可以将任何DP算法重新格式化为使用惰性计算和记忆而不是表,有时甚至可以使生成的实现在时间和空间复杂度上与DP匹配。然而,第二个技巧通常可以归结为牢记DP实现,并强制备忘录实现“偶然发现”相同的访问模式。这是一个聚会技巧,不是一个有用的转换。

(在递归程序中,参数占用内存,并且随着我们深入递归,内存会增加)
这是一个常数。递归不可能比| Table |更大(其中Table是等效DP解决方案中使用的表),因此它可能只会因为常量而更差,就大O而言,它们是相同的。此外,记忆对于稀疏矩阵更有用,因为你只创建“你需要的”,而不是自下而上的DP,在那里你创建所有东西。因此,DP“稍微好一点”的说法基本上是错误的。每个解决方案都有其优缺点,每个解决方案(自下而上或自上而下)都会在其他地方发挥作用。内存化还有一个优点,即计算值在计算后仍保留在内存中。这就是你的意思吗?此外,我认为这个问题更适合于。是的,但是DP的优点是什么?\@假设者每次访问内存都要快得多(记忆通常使用基于哈希的映射,平均为O(1),但比数组访问慢)。这一事实使得对于密集数据,自下而上的DP比自上而下的DP更好——一个常数,但一个高常数因子。