Algorithm 贪婪算法:区间着色
在区间调度中,算法是选取最早的完成时间。但在间歇着色中,前者不起作用。有没有关于为什么选择最早完成时间不适用于间隔着色的示例或解释 间隔着色问题是: 鉴于 A. 设置 属于 间隔, 我们 希望 到 颜色 全部的 间隔 所以 那个 间隔 鉴于 这个 相同的 颜色 做 不 横断 及 这个 目标 是 到 尝试 到 减少 这个 数 属于 颜色 用过。这可以被认为是区间划分问题(如果它更有意义的话)Algorithm 贪婪算法:区间着色,algorithm,greedy,graph-coloring,Algorithm,Greedy,Graph Coloring,在区间调度中,算法是选取最早的完成时间。但在间歇着色中,前者不起作用。有没有关于为什么选择最早完成时间不适用于间隔着色的示例或解释 间隔着色问题是: 鉴于 A. 设置 属于 间隔, 我们 希望 到 颜色 全部的 间隔 所以 那个 间隔 鉴于 这个 相同的 颜色 做 不 横断 及 这个 目标 是 到 尝试 到 减少 这个 数 属于 颜色 用过。这可以被认为是区间划分问题(如果它更有意义的话) 我所指的时间间隔安排问题是:如果你去主题公园,有很多节目,每个节目的开始和结束时间
我所指的时间间隔安排问题是:如果你去主题公园,有很多节目,每个节目的开始和结束时间都是一个时间间隔,你就是资源。你想参加尽可能多的演出。这只是一个玩弄图片的例子,直到你找到一个例子。我绘制的第一张图片显示问题有以下分区:
A: (0, 2) (3, 7)
B: (1, 4) (5, 6)
-- -
---
----
如下图所示:
-- ----
--- -
但查找最早停止时间规则会产生以下颜色:
A: (0, 2) (5, 6)
B: (1, 4)
C: (3, 7)
这是哪个分区:
A: (0, 2) (3, 7)
B: (1, 4) (5, 6)
-- -
---
----
所以这个贪婪规则在这个例子中并不是最优的。如果你只需要一个着色贪婪算法的反例,@btilly已经提供了一个 我试图给出理由,让它更直观 首先,对于调度问题,您确实可以证明贪婪算法是有效的。这个想法是这样的:
-- ----
--- -
如果我不选择最早结束时间的节目,我就无法获得更好的结果,让我们看看
如果有两个间隔A、B,且A的完成时间较早,则B为
深度
始终为冲突的最大值。逻辑上我们知道深度是下界,但我们必须证明它也是上界(通过矛盾)
证明
证明需要按开始时间升序排序间隔,或按结束时间降序排序间隔,如下所示:
假设间隔集的深度
为d
,且答案大于d
。让x
成为我们使用资源d+1
处理的第一个时间间隔,
由于处理顺序按开始时间升序排序,这意味着至少有d
间隔在x
之前开始,并且与x冲突,那么集合的深度
至少是d+1
,矛盾。所以d
=depth
也是答案的上界,它是区间着色的最佳答案
请注意,如果按开始时间递减或完成时间递增排序,则不能使用相同的推理
概念/目标
现在我们知道深度是答案,我们必须找到它。从概念上讲,无论您使用开始时间还是结束时间、升序还是降序,所有选项都可以为您提供间隔集的深度
实施考虑
然而,对于实现,如果必须在O(nlgn)中找到它,则必须使用贪婪方法+一些数据结构,这可能需要区间具有某种排序。但这是另一个故事,它是为了实现,从概念上讲,这并不重要,你只想找到间隔集的深度
TL;博士
对于区间调度问题,贪婪方法本身已经是最优策略;而对于区间着色问题,贪婪方法只能帮助证明深度是答案,并且可以在实现中使用它来查找深度(但不是以@btilly的反例所示的方式)实际上,您可能看到的算法版本在完成时间内可能无法对输入进行排序。这里的关键点是,在算法中,当多个颜色可用时,规则是任意分配。上面的反例说明了这一点 如果要使用完成时间的顺序,则需要对算法进行一次更改。让我们假设对于每个现有的颜色i,在由i着色的所有间隔中,最大的完成时间是F_i。然后,当多个颜色可用时,规则是使用具有最大F_i的可用颜色对间隔进行着色 如果进行此更改,则该算法适用于完成时间内的订单。我运行模拟,并为此编写了正式的证明 直觉很简单,因为排序是按完成时间进行的,即您分配的当前间隔,您不希望占用太多资源。虽然可能有两种颜色可用,但您希望使用“价格较低”的颜色,以便为下一个间隔节省空间,下一个间隔可能在当前间隔之前开始,并且