贪心算法_活动安排问题
创始人
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) 

相关内容

热门资讯

李光洁32天走7500公里吃8... 李光洁32天走7500公里吃8城,《拿一座城市下酒》这部纪录片怎么样?我觉得这部纪录片非常好,观看的...
每我世如你果只没界喜就欢的生一... 每我世如你果只没界喜就欢的生一爱有你过在想会。把这22个字组成一句话。我想过,如果在每一生只喜欢你,...
调查校园里的植物和动物说说有哪... 调查校园里的植物和动物说说有哪些动植物?可以分成几类?兰花,梅花可人丌··植物:乔木(杨树、柳树、银...
血脂高的原因? 血脂高的原因?血脂高的原因高血脂的诱因包括原发性和继发性两种:原发性高血脂症的病因:1、遗传因素。2...
为什么孩子总是重复看同一集动画... 为什么孩子总是重复看同一集动画片?是在传递这3个信号 小孩子爱看动画片是非常普遍的,动画片带给他们动...
终极三国里 49集刘备为什么这... 终极三国里 49集刘备为什么这么做?有没有官方回答?下集自己看吧 现在不会有官方回答的哟第一:可能真...
西式糕点制作大全的内容简介 西式糕点制作大全的内容简介《西式糕点制作大全》主要介绍了制作甜点的基本知识,例如各种制作工具,制作点...
逻辑思维又是什么?就是推理吗,... 逻辑思维又是什么?就是推理吗,怎么培养!?逻辑思维是一种严格分析思维。不一定是推理。推理是逻辑思维的...
囊萤夜读有一句俗语就是出自这个... 囊萤夜读有一句俗语就是出自这个故事你知道是什么吗?囊萤映雪 ( náng yíng yìng xuě...
什么是不伦恋情? 什么是不伦恋情?什么是不伦恋情.,?男跟女年龄相差很大?还是?男的比女的小?还是老夫少妻?是近亲谈恋...
有书名带晨星的嘛? 有书名带晨星的嘛?有书名带晨星的嘛?晨星传这本书。漫画书晨星物语
如果有些事情说不出口怎么办? 如果有些事情说不出口怎么办?烦恼皆是因为自己过分的执着 即使你在这样子下去 更不就不会有好的结果 为...
有哪些类似于《非自然死亡》题材... 有哪些类似于《非自然死亡》题材的日剧推荐?非自然死亡的题材电影确实不多,电视剧的话也不好找啊。不喜欢...
素书全集的内容简介 素书全集的内容简介 本书采用了《素书》的权威原著,参照《四库全书》并加上了宋代宰相张商英的注和清代王...
【世纪花园】小区对口的学校有重... 【世纪花园】小区对口的学校有重点小学和初中吗?世纪花园东区里有未来强者幼儿园,小区南边有个华兴小区,...
东南大学现有的专业中有哪些是属... 东南大学现有的专业中有哪些是属于老东南的1928年学校改名为国立中央大学,设理、工、医、农、文、法、...
一个男人一有钱就请朋友吃饭,没... 一个男人一有钱就请朋友吃饭,没钱就又说,买东西还赊账,商店里的老板都找上门来了?像陵念前这种男人的话...
坟上栽什么草好? 坟上栽什么草好?坟地种什么草好耐旱坟上栽野蕨草、扎根不深、浅根植物、可以固土、南方雨水多、不会造成坟...
关于国富潜力基金 关于国富潜力基金我9月24日上午买的国富基金,申购价格是9月24日开盘的价格吗?还是9月28日开盘的...
我是一个高中生。想学武术。在学... 我是一个高中生。想学武术。在学校没什么时间。是练散打还是跆拳道好。我是一个高中生。想学武术。在学校没...