继续一道贪心算法的问题

ksharp2008 2008-03-25 08:09:35
有N个学生,每个学生在(Si,Ei)时间段内有任务,我们想从中选K个学生,使得这K个学生可以观察其他N-K个学生的工作。例如有三个学生(1,5)(2,3)(4,6),那么就选择(1,5),可以监视(2,3) (4,6)
...全文
155 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
这么一来应该是没问题了,贪心算法的正确性证明:
还是按照每个学生的任务结束时间升序排列:S={1,2,3,...,n}
假设用这种贪心算法得到的监视学生为i[1],i[2],...,i[k],这里1<=i[1]<i[2]<……<i[k]<=n

1.第一步,先来证明总存在一个以i[1]开头的最优解.
假设A为S的一个子集,同时A是一个最优解,假设A={j[1],j[2],...,j[t]},这里1<=j[1]<j[2]<……<j[t]<=n
首先必须满足j[1]<=i[1]。否则的话,根据贪心算法过程就可以推断出来,学生1没有被监视到。
如果i[1]==j[1],那么一切好说;
如果i[1]>j[1],就在集合A中把j[1]替换成i[1]。
凡是m<=i[1],学生m都能被学生i[1]监视到。又因为i[1]的结束时间大于m的结束时间,所以凡是m能监视到的学生,i[1]都能监视到(分m与1相交和不相交两种情况来讨论比较容易理解)。也就是说j[1]能干的活,i[1]都能包了,因此用i[1]来替换j[1]还是能监视其余所有的学生。
因此A-{j[1]}+{i[1]}仍然是一个最优解。
【实际上这里还有一个小问题要澄清,那就是j[2],...j[t]中会不会出现与i[1]重复的值?答案是不会的。
因为前面已经提到了凡是m<=i[1],m能监视的学生i[1]都能监视到,因此我们担心的情况与A是最优解相矛盾,不会出现】
2.第二步,来证明A-{i[1]}=={j[2],...,j[t]}就是“i[1]无法监视到的学生”的一个最优解。
这一步用反证法来说明:如果存在一个比集合A-{i[1]}更少的方案就能监视到所有“i[1]无法监视到的学生”,那么这个方案再加上i[1],就能监视到所有的学生,这与A是最优解是矛盾的.
以上2步合起来就能说明,每进行一次贪心选择就可以得到一个最优解。
回复
tailzhou 2008-03-27
1)对结束时间最早的学生a1,求跟其有时间交叉,且结束时间最大的学生aj;
2)对aj无法监视的学生中结束时间最早的学生a1' ,求跟其有时间交叉,且结束时间最大的学生aj';
直到所有学生都被监视或选中,否则继续2);
回复
tailzhou 2008-03-27
确实有问题;
“剔除aj能监视到的学生”
修改为:
“剔除结束时间早于aj的结束时间的学生,也就是在j之后的学生继续第一步;”
回复
欢迎楼上破处。

感觉tailzhou的方法有问题,举个反例:
(1,3)、(4,5)、(6,7)、(2,10)、(8,11)、(12,13)、(14,15)、(9,16)
很明显,(2,10)和(9,16)就能监视其它的所有学生。
如果按照你的方法,出来的结果会是(2,10)、(12,13)、(14,15)

“剔除aj能监视到的学生”,这里太粗暴了。
回复
hogfish 2008-03-27
处女贴
回复
没有其它要求吗?
从你的描述来看,似乎是任务时间上有重叠的学生就可以互相监视。
那么又成了一个典型的“会场分配/活动选择”问题:根据贪心算法找出最多的不相交时间段,这就是那K个学生。

这个题如果是求最小的K,和你前面那个问题就是一回事了。
回复
tailzhou 2008-03-26
按照结束时间排序;

1)对结束时间最早的学生a1,求跟其有时间交叉,且结束时间最大的学生aj,提出aj能监视到的学生;
2)在剩下的学生中继续1),直到没剩下任何学生;

证明:
a1要么被选中,要么被选中的某个学生监视;,
1)如果a1被中,那么a1能监视到跟a1有交叉的学生;
2)如果a1没被选中,那么必定选中跟a1有交叉的学生之一;由于,a1是结束时间最早的学生,所以所有跟a1有交叉的学生的时间段必定包含有a1的结束时间;所以选其中的任何一个都可以监视到所有跟跟a1有交叉的学生;且被选中的学生能监视到开始时间早于其结束时间的所有学生;而aj是跟a1有交叉的学生中结束时间最晚的,所以aj能监视到所有开始时间早于aj的结束时间的所有学生;

证毕!
回复
ksharp2008 2008-03-26
在贪心算法的那张出现的啊,是贪心吧
回复
ksharp2008 2008-03-26
mathe也来了啊,看了mathe的很多帖子了,高人啊。顺便问句问什么老外的离散数学那么的厚啊,国内作者薄薄的离散数学写的好么?想学习,感觉太厚了,题做不完啊
回复
ksharp2008 2008-03-26
也有可能最优啊,如最小生成树,最短路径,最大相容任务等等。我再想想贪心能搞出最优的不,动态规划的效率我觉得不如贪心高啊。才学算法,在下的愚见,不对别见笑,呵呵
回复
shark003 2008-03-26
不是贪心,是DP吧.
回复
mathe 2008-03-26
贪心算法得出结果不一定最优的吧。
你贴出的两道题目怎么看都应该用DP来求最优解。
回复
ksharp2008 2008-03-26
恩,是选一个最小的K,这些K是当干部的,所以要少。呵呵
回复
(1,5)可以监视(2,3)(4,6),
(2,3)(4,6)也可以监视(1,5),
这两种方案都能满足监视要求。

原题中要求一定是最小的k吗?
回复
ksharp2008 2008-03-26
(1,5)(2,3)(4,6)前边我说的那题以前没说明白,是找最小时间段集合,既集合中包含的时间段最小。那么前题的答案是(2,3)(4,4)既(2,4)。放到这题就该是(1,5)。但大王所说的根据贪心算法找出最多的不相交时间段,这就是那K个学生应该为(2,3)(4,6)啊,不大理解大王的思想。大王再讲讲好么
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-25 08:09
社区公告
暂无公告