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

如何证明贪心算法进行数字划分?

何勇
2023-03-14

划分问题(或number partitioning1)是一个任务,它决定一个给定的正整数多集S是否可以划分为两个子集S1和S2,使得S1中的数之和等于S2中的数之和。

这个问题有一个贪婪的算法:

解决这个问题的一种方法是贪婪算法,它模仿孩子们为游戏选择队伍的方式,将数字按降序进行迭代,将每个数字分配到和较小的子集中。这种方法的运行时间为O(n log n)。当集合中的数字大小与其基数大小差不多或更小时,这种启发式在实践中很好地工作,但不能保证产生尽可能好的分区。例如,给定集合S={4,5,6,7,8}作为输入,该贪婪算法将S划分为子集{4,5,8}和{6,7};但是,S有一个完全平衡的分区,分为子集{7,8}和{4,5,6}。

但是,我不知道如何证明这个启发式在实践中很好地工作,当集合中的数字大小与基数大小差不多或更小时。有人能帮忙吗?

共有1个答案

叶建柏
2023-03-14

这一主张并不确切;这只是说,如果多集的元素不比它的基数大多少,那么启发式通常会给出正确的答案,除非你注意找出它不知道的情况。所以这一说法不能被真实地“证明”。

此外,有许多不同的方法可以使索赔精确;并不是所有这些方法都必然导致一个真正的主张。所以你不能只做精确的陈述然后再证明。

然而,如果你读一下你引用的那一段之后的段落,它提供了一个相关的主张,这个主张是精确的,而且(根据文章)是正确的,即如果多集S可以被划分为两个和都≤OPT,那么这个贪婪算法将把它划分为两个和都≤/OPT,的多集。但是,这一索赔与原索赔并不相同;它为启发式的错误程度设定了一个上限,但它并不保证它永远都是正确的,它也没有提到元素的值。

 类似资料:
  • 主要内容:贪心算法的实际应用《 算法是什么》一节讲到,算法规定了解决问题的具体步骤,即先做什么、再做什么、最后做什么。贪心算法是所有算法中最简单,最易实现的算法,该算法之所以“贪心”,是因为算法中的每一步都追求最优的解决方案。 举个例子,假设有 1、2、5、10 这 4 种面值的纸币,要求在不限制各种纸币使用数量的情况下,用尽可能少的纸币拼凑出的总面值为 18。贪心算法的解决方案如下: 率先选择一张面值为 10 的纸币,可以

  • 贪心算法 建议观看MIT算法导论-贪心算法中的课程。

  • 本文向大家介绍python 贪心算法的实现,包括了python 贪心算法的实现的使用技巧和注意事项,需要的朋友参考一下 贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不

  • 我试图用Python 3.x中的贪婪算法解决背包问题。下面是我的代码,以及我用来测试它的示例案例。每个示例案例的形式为行[0]=最大权重,行[1:]的形式为(权重,值。) 成功案例1: 上一次我在重写程序之前出现这样的错误,是在与int类型进行斗争。这一次似乎是在断绝关系,但我不确定如何修复它。非常感谢任何帮助。我只知道当我看到它的时候这会是一个简单的解决方案... 编辑:这必须与我的列表如何排序

  • 10.4 贪心法 考虑一个应用问题:假设需要在油库 A 和加油站 B、C、D、E、F、G、H 之间修建输 油管道,油库和各加油站的位置如图 10.6 所示,图中的虚线表示可能的管道铺设路线,虚 线旁标注的数值表示所需铺设的管道的长度(千米)②。例如油库 A 与加油站 B 之间需要铺 设 35 千米的管道。 [图片丢失] 图 10.6 油库及加油站位置示意图 显然没有必要在所有可能路线上铺设管道,而

  • 本文向大家介绍Python贪心算法实例小结,包括了Python贪心算法实例小结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python贪心算法。分享给大家供大家参考,具体如下: 1. 找零钱问题:假设只有 1 分、 2 分、五分、 1 角、二角、 五角、 1元的硬币。在超市结账 时,如果 需要找零钱, 收银员希望将最少的硬币数找给顾客。那么,给定 需要找的零钱数目,如何求得最少的硬币数