贪心算法_活动安排问题
创始人
2024-02-20 03:54:11
0

     看了下贪心算法,直觉上以为适用于用贪心算法解决的问题好像并不多啊,不过现在先不说这个。先讨论下动态规划和贪心算法的不同之处,下面是一些本人结合书本得出的体会:

      1、动态规划通常是自底向上求解问题的(当然也可以是"带备忘"的自顶向下求解问题),每一次选择都面向多个子问题选择,只不过这些子问题的解都是基于那些已经求解的子子问题的解。从本质上说动态规划遍历了所有的可能解,只是在求解子问题时使用了“子子问题的解",从而避免了在求解重复子问题上浪费的时间(相对于分治法而言)。但是贪心算法则不然,贪心算法是自顶向下求解的,每次进行一次贪心选择后,只面向一个子问题。

      2、既然贪心算法只需要面向一个子问题,它的算法时间也只有theta(n),那么我们都用贪心算法吧,多快啊。可是我们知道既然它又这么快的速度,说明它必定只在某个特定的环境下才适用,我们要做的全部工作就是论证。论证问题适用于贪心算法。

      3、如果进行贪心算法时,我们不得不考虑多种选择,通常意味着可以改进贪心选择。使其更高效。如:在本文中,求解活动安排问题的前提时,活动的结束时间都以单调递增的顺序排列好了。如果不是这样的话,我们在一次贪心选择之后必须面向多个选择。

      SO,和动态规划有两个特性一样,贪心算法也有两个特性:贪心选择性和最优子结构特性。说实话,现在我还不理解贪心选择性,说所求问题的全局最优解可以通过一系列的局部最优(贪心)选择组成。我的疑惑就是如果已经能够证明问题具有贪心选择性,还需要最优子结构特性吗?直接进行迭代的弹性求解不就好了吗?或者可以说,是否最优子结构特性只是贪心算法问题的一个特性而已,即这个问题如果是可以贪心算法求解最优解的,那么它必定具有最优子结构特性。

      话说,贪心算法问题的主要工作就是证明问题的贪心选择性和最优子结构特性。可事实是现在我对证明还不是很清楚,只能边写边总结了。估计多写几次也就会证明了。不扯了,转入正题吧,关于活动安排问题。

      问题描述:现有一个阶梯教室,有n个活动(A1A2A3A4...An)需要申请这个教室,但是这个教室同一时间只能被一个活动使用。已知每个活动的起始时间Ts和结束时间Te。问怎样安排活动才能使尽可能多的活动使用到教室。

      问题解决:

      1、为了使得每次贪心选择后面向唯一的一个子问题,我们将活动按结束时间单调递增排序。

      2、活动安排问题的贪心算法特性证明:

      贪心选择性:由于结束时间的单调递增排序,可以知道第一次贪心选择的是A1,如果能够证明A1必属于某一个全局最优解(这里的全局最优解可能有多个),就证明了问题的贪心选择特性。怎么证明呢?设已有全局最优解Sk,其中Aj是Sk中结束时间最早的活动,讨论A1和Aj,如若给A1=Aj,则问题已证。如果A1 != Aj。因为A1.endTime <= Aj.endTime。那么即使将Aj替换成A1得到的新的Sk'应该也是相容的,因为Sk'包含的活动个数等于Sk包含的活动个数,所以Sk‘也是一个全局最优解,则特性得证,即A1必属于某个全局最优解。进而推论,每次做出的局部贪心选择都属于全局最优解中的一个子问题。

      好了,代码如下:

package com.wly.algorithmbase.greedy;import java.util.ArrayList;/*** 贪心算法解活动安排问题* 问题:现有一个阶梯教室可供活动使用,同一时间最多只有一个活动能使用该阶梯教室* 现有n个活动需要都使用该阶梯教室,先一个每个活动的开始和结束时间,求怎样安排活动才能使使用阶梯教室的活动最多。* @author wly**/
public class ActivitySelection {public static void main(String[] args) {
Activity[] activities = new Activity[5];
activities[0] = new Activity(0,0);
activities[1] = new Activity(1,2);
activities[2] = new Activity(3,7);
activities[3] = new Activity(2,9);
activities[4] = new Activity(8,10);ArrayList resultList = new ArrayList();
resultList = resolve(activities);
for(Activity a:resultList) {
System.out.println("(" + a.getStart() + "," + a.getEnd() + ") ");
}
}/*** 求解问题* @param startTimes 活动的开始时间数组* @param endTimes 活动的结束时间数组* @return*/
public static ArrayList resolve(Activity[] activityList) {
int n = activityList.length;
ArrayList result = new ArrayList();int k = 1;
result.add(activityList[1]);
for(int m=2;m= activityList[k].getEnd()) {
result.add(activityList[m]);
k = m;
}
}
return result;
}
}class Activity {
int start;
int end;public Activity(int start, int end) {
super();
this.start = start;
this.end = end;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
}

      运行结果:

(1,2) (3,7) (8,10) 

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...