【贪心】区间图着色 Interval-graph Coloring Problem

http://blog.sina.com.cn/s/blog_51cea4040100gpw6.html

算法导论 练习 16.1-3

假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。

(这个问题也被称为区间图着色(interval-graph coloring)问题。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的颜色均不相同,所需的最少颜色数对应于找出调度给定的所有活动所需的最少教室数。)

 

方法一:纯模拟。

贪心策略:对于活动的开始时间和结束时间点进行排序。维护两个盒子,busy_classroom_num、free_classroom_num。扫描排序的时间t,若t为一个活动的开始时间,我们从free_classroom_num--,busy_classroom_num++。如果,在free_classroom_num--之前,free_classroom_num已经为0,则新生成一个教室,直接busy_classroom_num++。若t为一个活动的结束时间,我们从busy_classroom_num--,free_classroom_num++。时间扫描完毕,free_classroom_num为最少的教室数。

简单证明:我们关心的并不是具体哪个教室去搞哪个活动,而是,在这个活动的时间段有教室让他搞。所以,只需要纯模拟就可搞定。

 

方法二:完全贪心

贪心策略:按照活动的结束时间进行排序。然后,每次选取当前可兼容并且结束时间最小的一个活动,选到选不动为止,将他们放到一个教室搞。将刚才的活动标记后,再以上面的方法,找到第二个集合放到另外一个教室。直到活动都标记完。

简单证明:抓住重点,我们不关心具体哪个教室去搞哪个活动。那么会不会出现一教室不搞这个活动,留给二,这样,二教室提前结束活动可以多搞些活动?这样的想法其实没必要,因为,一搞了留给二的那个活动就可以接着搞二还可以搞的活动,那么二虽然搞得少,但是,那些活动一教室已经帮他搞了。中心:只要活动有教室搞就行,不管哪个教室。

 

关于题目描述括号里那段。它把这题抽象出了一个模型。连边代表这两个活动有冲突。解决方法就是上文所述。

现在,扩展一下,我们反起来想,如果给出一个图,要求涂色,使得任意边所连接的两点颜色不同,问至少需要多少种颜色来涂。这样的题,我们可不可以怎么转换,然后,用上述的贪心方法?

ccy的答案是没有。

上可以用贪心来做满足了两个条件:1、冲突,2、结束时间有序。

而扩展这题,我们连接的边为冲突满足了条件1,但是,条件2并不存在,所以,我们需要去构造。

如下图:

http://photo.blog.sina.com.cn/showpic.html#blogid=51cea4040100gpw6&url=http://static14.photo.sina.com.cn/orignal/51cea404x7b4a340223fd&690

红圈里的点,无论我们怎么编号,始终不满足活动实际的冲突。

如上面的第一种编号,既然1和7都有冲突,难道5、6和7会没有冲突吗?所以,该标号法wrong掉。

第二种,4和6、7有冲突,难道5会和6、7没冲突吗?ok,继续wrong掉。

于是乎,我们轻易的得出结论,任意的一个图,是无法转换成活动调度的情景的。虽然,活动调度可以转换成这么一个图。

 

PS:这是ccy的个人见解,如果,有不同的想法,欢迎讨论。O(∩_∩)O谢谢……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值