贪心算法:间隔着色

时间:2016-02-16 00:15:18

标签: algorithm greedy graph-coloring

在区间调度中,算法是选择最早的完成时间。但在间隔着色中,前者不起作用。是否有一个例子或解释为什么选择最早的完成时间不适用于间隔着色?

区间着色问题是:给定一组间隔,我们想要着色 所有间隔使得给定相同颜色的间隔不相交,并且目标是尽量减少使用的颜色数量。这可以被认为是区间划分问题(如果它更有意义)

我所指的间隔调度问题是:如果你去主题公园并且有很多节目,每个节目的开始和结束时间都是一个间隔,你就是资源。你想参加尽可能多的节目。

3 个答案:

答案 0 :(得分:4)

这只是一个玩图片的案例,直到你找到一个例子。我画的第一张图片显示问题有以下分区:

A: (0, 2) (3, 7)
B: (1, 4) (5, 6)

如图所示:

-- ----
 --- -

但是,寻找最早的停止时间规则会产生以下颜色:

A: (0, 2) (5, 6)
B: (1, 4)
C: (3, 7)

这是什么分区:

--   -
 ---
   ----

因此,这个贪婪的规则在这个例子中不是最佳的。

答案 1 :(得分:2)

如果你只需要一个关于着色的贪婪算法的反例,@ btilly已经提供了一个。

我试图给出使其更直观的理由。

首先,对于调度问题,你确实可以证明贪婪算法的工作原理。这个想法是这样的:

如果我没有选择具有最早完成时间的节目,我就无法获得更好的结果,让我们看看。

如果有两个间隔A,B,其中A具有较早的完成时间,则B为

  1. 开始时间晚于A的结束时间,然后根本没有冲突,为什么不两者?
  2. 开始时间早于A的结束时间,有冲突,我只能选择A或B,但是,A提前结束,它提供更高的机会在之后选择更多的节目,不是吗?
  3. 然而,对于着色问题,它完全是另一类问题。

    您被迫选择所有间隔,而问题的答案是所有时间的最大冲突间隔#。

    尝试这样思考:有史以来最多同时进行了5次考试,你至少可以使用5个教室(颜色),对吗?

    所以我们无法通过选择最早的完成时间找到这个,时间没有告诉你任何事情。

    它可以帮助您决定是否点击此间隔(如调度问题),但无法告诉您所需的MINIMUM资源数量。它们只是不同类别的问题。

    已编辑:

    重新阅读OP的问题之后,据我所知,这里有更多关于着色问题的细节。

    定义depth始终是最大的冲突次数。从逻辑上讲,我们知道depth是下限,但我们必须证明它也是上限(通过矛盾)。

    证明

    证据需要在开始时间上升或完成时间下降时排序间隔,如下所示:

    假设区间集的depthd,答案大于d。让x成为我们处理的第一个使用资源d+1的时间间隔, 由于处理顺序按开始时间升序排序,这意味着至少有d个时间间隔在x之前开始并且与x发生冲突,那么该集合的depth至少是d+1,矛盾。所以d = depth也是答案的上限,它是区间着色的最佳答案。

    请注意,如果按开始时间降序或完成时间升序排序,则无法使用相同的推理。

    概念/目标

    现在我们知道深度就是答案,我们必须找到它。从概念上讲,如果您通过使用开始时间或结束时间,升序或降序找到它并不重要,所有选项都可以为您提供间隔集的深度。

    实施注意事项

    然而,对于实现,如果你必须在O(n lg n)中找到它,你将不得不使用GREEDY METHOD +一些数据结构,这可能需要间隔有某种排序。但这是另一个故事,它是为了实现,在概念方面,没关系,你只想找到间隔集的深度。

    TL; DR

    对于区间调度问题,贪婪方法本身已经是最优策略;而对于区间着色问题,贪婪方法只有助于证明深度才是答案,并且可以在实现中用于查找深度(但不是以@btilly的计数器示例中所示的方式)

答案 2 :(得分:0)

实际上,您可能会看到使用开始时间对输入进行排序的算法版本可能不适用于完成时间。这里的关键点是,在算法中,当有多种颜色可用时,规则是任意分配。上面的反例说明了这一点。

如果您想使用完成时间的顺序,则需要对算法进行一处更改。假设对于每个现有颜色i,在由i着色的所有区间中,最大完成时间是F_i。然后,当有多种颜色可用时,规则是使用具有最大F_i的可用颜色为间隔着色。

如果进行此更改,则算法适用于完成时间的顺序。我运行模拟,并为此写了完整的正式证明。

直觉很简单,因为排序是按照完成时间,你指定的当前间隔,你不希望它占用太多资源。尽管可能有两种颜色可供使用,但您希望使用不那么“昂贵”的颜色,以节省下一个间隔的空间,该间隔可能实际在当前间隔之前开始并在当前间隔之后结束。

让我们使用上面的例子, 答:(0,2)(5,6) B:(1,4) C:(3,7) 这不起作用,因为在分配(5,6)时,选择A,但是,如果遵循我的算法版本,我们知道A上的结尾是2,B结尾是4,所以你选择B,最大结尾。这节省了(3,7)的点,其早于(5,6)开始但稍后结束。

我们在使用开始时间订购时没有这种问题,因为由于订单是在开始时间之后,您知道在当前作业之后,没有其他工作会提前开始,因此您不需要保存该资源。

注意,尽管这可能是使完成时间顺序有效的方法,但运行时间大于原始算法的开始时间顺序。因为你必须运行所有颜色才能找到一个不仅可用但结尾最大的颜色。