我们有N
任务需要安排处理。每个任务由两部分组成,需要按顺序执行。第一个任务由互斥锁保护,因此一次只能执行一个任务。第二部分没有这样的约束,任何数量的任务都可以同时执行。对于任务i
,我们知道它需要在每个部分花费多少时间,即mi用于受保护的部分,ai用于可以并行执行的部分。
问题是找到任务的排列,以便最小化执行所有任务所需的时间。
我的直觉告诉我,这可以通过贪婪算法来解决,方法是按i的降序安排任务。
例如,给定以下任务:
m1=3,a1=9
m2=2,a2=7
m3=6,a3=10
最佳解决方案是排列3、1、2,其中任务重叠如下(加号是第一部分花费的时间,减号是第二部分花费的时间):
3 ++++++---------- (6, 10)
1 +++--------- (3,9)
2 ++------- (2,7)
Total time needed: 6+3+2+7: 18
任何其他排列都会产生更高的所需总时间,例如:
1 +++--------- (3,9)
2 ++------- (2,7)
3 ++++++---------- (6, 10)
Total time needed: 3+2+6+10: 21
然而,我很难证明贪婪的解决方案是最优的。有什么办法吗?
对于这个问题,我得到了一个非常聪明的答案,用矛盾的方式证明了答案。斯塔克交换。
为了解决这个问题,让我们先写一个方程式来计算N个任务所需的总时间。
这个方程是:t=m1a1max((a2m2-a1),(a3m3-a2),…)。
这个等式的第一部分(m1m2...)是第一个任务所需的时间
等式的第二部分更复杂。简单地说,max()计算与第一个任务不重叠的最大任务时间(在您的示例中,这个最大时间是9)。
现在让我们通过归纳来证明最优解。假设n个任务的最佳答案是按ai降序排列。然后,如果我们引入另一个an1和mn1并且an1是ai的最小值(我们可以通过归纳假设来假设),an1应该位于列表的底部。
为了证明这一点,假设an1去了任何其他位置,比如i。那么ai1mi1-an的值将明显大于之前的值(甚至大于anmn-ai-1)。因此,max()函数将返回一个大于或等于其上一个值的值。
现在我们必须证明n=2的归纳假设。假设我们有一个1和一个2。
等式t=m1a1a2m2-a1的值,简化为t=m1a2m2。
很容易看出,a2必须是这个等式要最小化的较小值。因此,归纳假设已被证明。
贪婪 vs 不贪婪 当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 #!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.
本文向大家介绍贪婪算法相关面试题,主要包含被问及贪婪算法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策
有人有线索为什么它对案件2不起作用吗?非常感谢你的帮助。编辑:案例2的预期结果是6130美元。我好像得到了6090美元。
我正在做一个需要调用其他任务的任务。 我尝试通过添加build.dependson clean来修复原始目标,但这似乎没有影响。 感谢任何帮助。
以下是我需要咨询以寻求帮助的问题: 编写一个贪婪算法,使用贪婪算法以尽可能少的硬币进行兑换。您将获得一个硬币值数组和一个金额:。返回一个包含每个硬币计数的数组。 例如:应该返回数组,该数组指示每枚硬币的数量:2枚50美分硬币,1枚25美分硬币,1枚10美分硬币),没有镍币(5美分),和2便士(1美分),加起来是137美分。 从computeChange返回的数组应该与第一个参数(硬币)的长度相同。
贪心量词指示搜索引擎搜索整个字符串并检查它是否与给定的正则表达式匹配。 以下是在java中使用正则表达式的Greedy Quantifiers的各种示例。 Sr.No 构造和匹配 1 X? X,曾经或根本没有。 2 X* X,零次或多次 3 X+ X,一次或多次。 4 X{n} X,正好是n次。 5 X{n,} X,至少n次。 6 X{n,m} X,至少n但不超过m次