当前位置: 首页 > 知识库问答 >
问题:

重叠子问题和最优子结构有什么区别?

蒋泰
2023-03-14

我理解这两种方法的目标方法,其中最优子结构基于输入n计算最优解,而重叠子问题针对输入范围从1到n的所有解。

对于像棒切割问题这样的问题。在这种情况下,在寻找最佳切割时,我们是否考虑每个切割,因此可以将其视为重叠子问题,并自下而上进行工作。或者,我们考虑给定输入n的最优切割,并自上而下地工作。

因此,虽然它们最终处理的是最优性,但这两种方法之间的确切区别是什么。

我试着参考这个重叠的子问题,最优子结构和这一页。

另外,这与制表(自上而下)和记忆(自下而上)的求解方法有关吗?

这条线索说明了一个有效的观点,但我希望它能更容易地被分解。

共有1个答案

柳涵意
2023-03-14

为了回答你的主要问题:重叠子问题和最优子结构都是不同的概念/属性,一个同时满足这些属性或条件的问题可以通过动态规划来解决。要理解它们之间的区别,你实际上需要理解这些术语在动态规划方面的含义。

我理解这两种方法的目标方法,其中最优子结构基于输入n计算最优解,而重叠子问题针对输入范围从1到n的所有解。

这是一个措辞不当的声明。您需要熟悉动态编程的基础知识。希望下面的解释能帮助你开始。

让我们从定义这些术语中的每一个开始,最优子结构

最优子结构:如果一个问题的最优解,大小为n,可以通过查看子问题的最优解来计算,大小为s

示例(最短路径问题):考虑一个无向图,其顶点为 a,b,c,d,e 和边 (a,b)、(a,e)、(b,c)、(c,d)、(d,a)

  • a -- b (最短路径)
  • a -- e -- b

最长路径问题没有最优子结构。之间的最长路径

重叠的子问题:如果你从你分享的链接看这个图:

您可以看到子问题fib(1)是跨多个分支的“重叠”,因此fib(5)具有重叠的子问题(fib(1)、fib(2)等)。

另外,这与制表(自上而下)和记忆(自下而上)的求解方法有关吗?

这又是一个措辞拙劣的问题。自上而下(递归)和自下而上(迭代)方法是使用记忆解决DP问题的不同方法。摘自维基百科关于记忆的文章:

在计算中,记忆或记忆是一种优化技术,主要用于通过存储昂贵的函数调用的结果并在再次出现相同的输入时返回缓存结果来加速计算机程序。

对于给定的斐波那契示例,如果我们在第一次遇到 fib(1) 后将其存储在表中,则下次看到它时不需要再次重新计算它。我们可以重用存储的结果,从而节省大量的计算。

当我们实现迭代解决方案时,“表”通常是一个数组(或数组的数组),当我们实现递归解决方案时,“表”通常是一个动态数据结构,一个hashmap(字典)。

您可以进一步阅读此链接,以便更好地理解这两种方法。

 类似资料:
  • 我试图更全面地了解动态规划中最优子结构属性的使用,但我对为什么我们必须证明问题的任何最优解都包含子问题的最优解视而不见。 难道仅仅证明问题的某些最优解决方案具有这个属性,然后用它来论证由于我们的递归算法构建的解决方案至少与最优解决方案一样好,它本身将是最优的,这还不够吗?换句话说,我未能发现在我们的算法的正确性参数中,我们需要所有最优解都包含子问题的最优解。 要澄清: 最佳子结构的CLRS定义说,

  • 据我了解,您需要一个问题才能有一个适用于动态规划的最佳子结构。 我不明白的是。 采用以下数组 A=[1,6,-3,1,5,-1] 根据维基百科: 在计算机科学中,如果一个问题的最优解可以由其子问题的最优解构造出来,则称该问题具有最优子结构。此属性用于确定动态规划和贪婪算法对某个问题的有用性。 这就是我的困惑所在。 如果让我在上面给出的数组中找到大小为 3 的最大子数组,答案将是 1、5、-1(总和

  • 我无法弄清楚重叠子问题的DP第一属性在哪里适合子集和问题。然而,我理解最优子结构部分。在执行包含和排除元素的递归解决方案时,问题在哪里重叠 是不是因为这是一个NP问题,所以没有DP的两个性质 问题的链接是http://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem/ 有人能帮助我理解这一点吗。

  • 问题链接如下: https://www.geeksforgeeks.org/dynamic-programming-subset-sum-problem/ 我没有看到重叠的子问题属性在问题中得到满足,至少在输入情况下是如此。例如,在下面的链接中,递归树没有任何重叠的子问题 http://www.zrzahid.com/subset-sum-problem-dynamic-programming/

  • 这是uva问题的根源。在线法官。组织机构 这个问题基本上是说: 给定N笔必须给的钱!!我们需要找出我们能给多少最低硬币,以及这些硬币的总价值,这样使用n个给定面额给的额外金额就最小了! 例如: 我的问题是: 这里的重叠子问题是什么? 我的意思是: 有重叠的子问题吗<因为我找不到任何。。。

  • 这里也有类似的问题,但它们与特定的编程语言有关,我正在寻找概念层面的答案。 据我所知,functor本质上是不可变的容器,它公开了派生另一个functor的map()API。哪种加法可以将特定的函子称为单子? 据我所知,每个仿函数都是仿函数,但不是每个仿函数都是单子。