动态算法与贪婪算法:关于 Neil G 对同一主题的回答的争论

2024-04-06

我试图理解动态算法和贪婪算法之间的区别,并且这个答案由Neil G很有帮助 https://stackoverflow.com/a/13713735/2715083但是,他的一句话却引起了评论区的热议。

动态规划和贪心算法之间的区别在于,动态规划的子问题是重叠的。这意味着通过“记住”某些子问题的解决方案,您可以更快地解决其他子问题。

评论不是解决疑问的最佳场所,所以我创建了这篇文章。我的问题是:

  • 最小生成树具有最优子结构以及重叠子问题。此外,在 MST 中,局部最优选择就是全局最优。因此,动态属性和贪婪属性都成立,对吗?上面引用的部分如何证明这一点?
  • 最优子结构的性质与“局部最优然后全局最优”的性质有何不同?我的头在转:如果某物具有最优子结构,那么所有局部最优选择也一定是全局最优的,对吗?有人可以解释一下我哪里出了问题吗?
  • 英语不是我的母语,所以请随时纠正任何语言错误。


    我认为对贪婪解决方案和动态解决方案之间差异的解释不好。贪婪的解决方案仅使用本地信息(即当前位置看起来最好的信息)进行选择。因此,贪婪的解决方案可能会“陷入”局部最优而不是全局最优。动态规划是一种将单个更复杂的问题分解为更简单的子问题的技术,然后组合子问题的结果以获得初始问题的结果。解决方案可以是both贪婪且动态。看看我对原始线程的回答。

    然而你的这个声明:

    If something has an optimal substructure, then all locally optimal
    choices must also be globally optimal right?
    

    是错的。以 0,1 背包为例:你是一个小偷,一天晚上闯入了一家商店。你有一个背包,它有固定的承重能力。该商店有一些产品,每种产品都有相关的价格和重量。窃取尽可能最高的价格。

    现在以容量为 50 的背包为例,产品的价格和重量分别为 (21, 20)、(30, 22)、(22, 21) 和 (9, 9)。如果您做出局部最优的选择(即每次选择价格/重量比最大的商品),您将选择产品 (30, 22) 和 (21, 20),而该解决方案不是最优的。最佳解决方案是采用 (21, 20)、(22, 21) 和 (9,9),导致利润大 2。

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

    动态算法与贪婪算法:关于 Neil G 对同一主题的回答的争论 的相关文章

    • 4 x 3 锁图案

      我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不
    • 我想优化这个短循环

      我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
    • 如何设置K-means openCV c++的初始中心

      我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
    • 如何计算两个ip之间的主机数量? C#

      我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
    • 如何在Scala中实现尾递归快速排序

      我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
    • 搜索/排序算法 - 是否有类似 GoF 的列表?

      我是一名自学成才的开发人员 坦率地说 我不太擅长找出在任何特定情况下使用哪种搜索或排序算法 我只是想知道是否有设计模式 esque 列出了以太坊中可用的常见算法 供我添加书签 就像是 算法名称 带有别名 如果有的话 它解决的问题 大O成本
    • 用 Java 创建迷宫求解算法

      我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
    • 如何在给定目标索引数组的情况下对数组进行就地排序?

      你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
    • 使用C标准数学库精确计算标准正态分布的CDF

      标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
    • 通过分布式数据库聚合作业优化网络带宽

      我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
    • 确定解决迷宫问题的最小线段数

      我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
    • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

      我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
    • 将字符串中的“奇怪”字符转换为罗马字符

      我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
    • 关于在字典中查找所有有效单词的算法问题

      给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
    • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

      我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
    • 带路径压缩算法的加权 Quick-Union

      有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
    • 生成所有多集大小为 n 的分区的算法

      我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
    • 用 C++ 生成 AST

      我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
    • 使用多级解决方案计算二维网格中的最近邻

      我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
    • 在常数空间中创建 1..N 的随机排列

      我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机

    随机推荐