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

2024-03-15

我了解这两种方法的目标方法,其中最优子结构根据输入 n 计算最优解决方案,而重叠子问题则针对输入范围(例如从 1 到 n)的所有解决方案。

对于像这样的问题杆切割问题 https://www.geeksforgeeks.org/cutting-a-rod-dp-13/。在这种情况下,在寻找最佳切割时,我们是否考虑每个切割,因此可以将其视为重叠子问题并自下而上地工作。或者我们是否考虑给定输入 n 的最佳切割并自上而下地工作。

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

我尝试参考这个重叠子问题 https://www.geeksforgeeks.org/overlapping-subproblems-property-in-dynamic-programming-dp-1/, 最优子结构 https://www.geeksforgeeks.org/optimal-substructure-property-in-dynamic-programming-dp-2/ and 这个页面也是如此 https://web.archive.org/web/20200123003901/http://anandabhisheksingh.me:80/optimal-substructure-overlapping-subproblems/.

另外,这是否与制表(自上而下)和记忆化(自下而上)的解决方法有关?

这个线程 https://stackoverflow.com/questions/22067523/optimal-substructure提出了一个有效的观点,但我希望它是否可以更容易地分解。


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

我了解这两种方法的目标方法,其中最优子结构根据输入 n 计算最优解决方案,而重叠子问题则针对输入范围(例如从 1 到 n)的所有解决方案。

这是一个措辞不佳的声明。您需要熟悉动态规划的基础知识。希望以下解释能够帮助您入门。

让我们首先定义这些术语“最佳子结构”和“重叠子问题”的含义。

最优子结构:如果大小为 n 的问题的最佳解决方案 S 可以通过以下方式计算JUST查看子问题 s 的最优解,其大小 NOT ALL子问题的解决方案,AND它也会产生问题S的最优解,则该问题S被认为具有最优子结构。

示例(最短路径问题):考虑一个具有顶点 a,b,c,d,e 和边 (a,b), (a,e), (b,c), (c,d), (d,a) & (e) 的无向图,b)那么a和c之间的最短路径是a - b - c,这个问题可以分解为找到a和b之间的最短路径,然后找到b和c之间的最短路径,这将为我们提供一个有效的解决方案。请注意,我们有两种从 a 到达 b 的方法:

  • a -- b(最短路径)
  • 一个——e——b

最长路径问题没有最优子结构。 a & d 之间的最长路径是 a -- e -- b -- c -- d,但是 a & c 之间的最长路径 (a -- e -- b -- c) 和 c & d (c -- b -- e -- a -- d) 不会给我们 a 和 d 之间的有效(非重复顶点)最长路径。

重叠子问题:如果您从您共享的链接中查看此图:

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

另外,这是否与制表(自上而下)和记忆化(自下而上)的解决方法有关?

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

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

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

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

您可以进一步阅读this https://stackoverflow.com/questions/1065433/what-is-dynamic-programming链接以更好地理解这两种方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重叠子问题和最优子结构有什么区别? 的相关文章

  • 使用动态规划背包的硬币找零程序,允许重复

    我编写了下面的代码来实现硬币找零问题 给你 n 种面额的硬币 其值 v 1 我通过将每个硬币的所有值设置为 1 来修改背包的重复允许问题 然后 程序应返回最大值 使得所需硬币 面额 的重量加起来等于大小变量 所需找零 我不知道我哪里出了问题
  • 可以从 (a,b) 移动到 (c,d)

    问题是输出是否可以从给定点移动 a b 达到目标 c d 我们仅限于正坐标 可以进行以下两种动作 a b gt a b b a b gt a b a 例如 1 1 to 5 4 is True您可以执行以下操作 使用第 2 步 3 次 1
  • 求子集的个数,剩余数异或等于0

    给定n个数 找到最小子集数 其中剩余数等于0 例如 1 1 3 4 5 结果等于 3 因为我们可以删除子集 1 3 有两种方式 或 3 4 5 我正在寻找比 O 2 n 蛮力更快的东西 让我们考虑一个大小为 n m 的动态规划表 其中 m
  • 高效的最长公共子序列算法库?

    我正在寻找一种 空间 高效的 LCS 算法实现 以便在 C 程序中使用 输入是两个随机访问整数序列 我目前正在使用关于 LCS 的维基百科页面上的动态编程方法 然而 这在内存和时间上有 O mn 的行为 并且对于较大的输入来说会因为内存不足
  • 字符串切割的动态规划练习

    我一直在研究以下问题book http www cs berkeley edu vazirani algorithms chap6 pdf 某种字符串处理语言提供了将字符串分成两部分的原始操作 由于此操作涉及复制原始字符串 因此无论剪切位置
  • 如何理解线性划分中的动态规划解法?

    我正在努力理解线性分区问题的动态规划解决方案 我正在读 算法设计手册 http www algorist com 问题在 8 5 节中描述 我已经读过该部分无数次 但我就是不明白 我认为这是一个糟糕的解释 到目前为止我读到的内容要好得多 但
  • 背包0-1路径重建(拿哪些物品)[重复]

    这个问题在这里已经有答案了 我知道如何用动态规划方法解决背包 0 1 问题 但我很难弄清楚要拿哪些物品而不影响 O N C N 个物品 C 容量 的复杂性 有什么想法 我更喜欢自下而上的方法 假设现在您将结果存储在数组中bool a whe
  • 了解自下而上的杆切割实施

    In 算法导论 CLRS https rads stackoverflow com amzn click com 0262033844 科门等人 下面谈谈解决切棒问题 第369页 EXTENDED BOTTOM UP CUT ROD p n
  • 给定一组 0-9 的整数,在用完某个整数之前我能写的最后一个数字是多少?

    正如标题所说 给定一组整数 0 9 在用完某个整数之前我能写的最后一个数字是多少 因此 如果给我一个库存 比如从 0 到 9 的每个数字都有 10 个 那么在用完某个数字之前我可以写的最后一个数字是多少 例如 如果库存为 2 我可以写数字
  • 动态规划:城市遍历

    我遇到了这个问题 有两个人 有 n 个城市的有序序列 并且每对城市之间的距离是给定的 您必须将城市划分为两个子序列 不一定是连续的 使得人 A 访问第一个子序列中的所有城市 按顺序 人 B 访问第二个子序列中的所有城市 按顺序 并且使得A
  • 矩形内最大的空矩形

    我的数学不太好 所以我很难将公式转换为代码 而且我在谷歌上找不到任何现成的东西 我有一个包含很多小矩形的大矩形 我需要做的就是计算最大的空矩形 任何人都可以帮助我吗 这就是我想出的 没什么可说的 这是一个很大的失败 Rect result
  • 字符串中回文子序列的总数

    问题是这样的 对于作为输入给出的每个字符串 您需要告诉它的回文子序列的数量 不一定是不同的 请注意 空字符串不是回文 例如 aab 的回文子序列是 a a b aa 该方法返回 4 我心中有寻找最长回文子序列的动态规划解决方案 因此尝试从中
  • 编辑距离算法解释

    根据维基百科 计算两个字符串 a 和 b 之间的编辑距离的递归公式的定义如下 我不明白为什么我们不考虑删除的情况a j 或者我们插入b i 另外 如果我错了 请纠正我 插入的情况和删除的情况不一样吗 我的意思是 我们可以在第二个字符串中插入
  • 使用动态规划解决背包问题的一个版本

    我正在 OpenCourseWare 上完成 MIT6 0002 https ocw mit edu courses electrical engineering and computer science 6 0002 introducti
  • 动态算法与贪婪算法:关于 Neil G 对同一主题的回答的争论

    我试图理解动态算法和贪婪算法之间的区别 并且这个答案由Neil G很有帮助 https stackoverflow com a 13713735 2715083但是 他的一句话却引起了评论区的热议 动态规划和贪心算法之间的区别在于 动态规划
  • 背包多重约束

    我有一个动态规划问题 我花了几个小时研究但没有结果 第一部分很简单 你有一背包物品 你必须最大化这些物品的价值 同时将它们保持在一定的重量以下 问题的第二部分是相同的 只是现在也有一个项目限制 例如 您可以放入袋子中的物品的最大价值是多少
  • 最长 K 顺序递增子序列

    为什么我创建了一个重复的线程 阅读后我创建了这个线程允许有 K 个例外的最长递增子序列 https stackoverflow com questions 56155854 longest increasing subsequence wi
  • 使用动态编程理解正则表达式字符串匹配

    我遇到了这个问题 要求您实现一个支持 的正则表达式匹配器 和 其中 匹配任何单个字符 匹配零个或多个前面的元素 isMatch aa a false isMatch aa aa true isMatch aaa aa false isMat
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • 在 C# 中实现动态代理的最佳方法是什么?

    我需要在 C 中创建动态代理 我希望这个类包装另一个类 并采用它的公共接口 转发对这些函数的调用 class MyRootClass public virtual void Foo Console Out WriteLine Foo int

随机推荐