贪心策略 活动安排 会场安排

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

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

分析:先找出合适的贪心策略,活动按结束时间进行从小到大排序,在保证兼容的情况下,先进入会场的活动结束时间越早越好。依次先从结束时间早的分配会场,没有兼容的会场则开辟新的会场,不要忘记,开辟会场sumRoom+1,每个活动都要遍历所有的会场。使用 贪心策略,只遍历一次所有活动就行。

关键在于:找到合适的贪心策略,因为贪心简化了动规的子问题,但是不是所有的贪心都能得到正确的答案。

/**   贪心算法,解决活动选择问题。。
	 * 也是一种动规,只是他将不符合条件的子问题都舍弃了
	 *   这里 活动已经 按结束时间排好序
	 * @param s:活动的开始时间  采用递归的方法时,要加入一个虚拟活动a0
	 * @param f:活动的结束时间
	 * @param k n:活动的规模
	 */
	public void recursiveActivitySelect(int s[],int f[],int k,int n)
	{
		int m=k+1;
		while(m<=n&&s[m]<f[k])
           m++;
		if(m<=n)
		{
			System.out.print("a"+m+" ");
			recursiveActivitySelect(s, f, m, n);
		}
	}
	/**
	 * @param s
	 * @param f
	 * 贪心的非递归实现 迭代算法
	 */
	public void recursiveActivitySelect(int s[],int f[])
	{
		int n=s.length;
		int k=1;
		System.out.print("a"+k+" ");
		for(int m=2;m<n;m++)
			if(s[m]>=f[k])
			{
				k=m;
				System.out.print("a"+m+" ");
			}
	}
	/*按最晚开始时间进行贪心算法,首先参数为一个按照开始时间拍好的序的活动 
	 *开始时间从大到小排序
	 */
	public void recursiveActivitySelect2(int s[],int f[],int k,int n)
	{
		int m=k+1;
		while(m<=n&&s[k]<f[m])
			m++;
		if(m<=n)
		{
			recursiveActivitySelect2(s, f, m, n);
			System.out.print("a"+m+" ");
		}
	}




 /**   会场选择问题    :先要对活动按结束时间进行排序  为了使一个将会场能
	 *                     有更大的兼容活动,从而使用较少的会场
	 * 没有 会场安排下他 ,就开辟新的会场
	 * @param s
	 * @param f
	 * 返回每个会场兼容的情况下,最小使用的会场数,类似于区间图着色问题
	 * 只是再加入一个集合时,判断是否与集合中的点相邻,
	 * 会场问题是判断要加入的活动开始时间是否大于会场的最晚结束时间
	 */
	public int selectRoom(int s[],int f[])
	{
		int n=s.length;
		int time[]=new int [n];
		int sumRoom=1;//先开辟一个新的会场 ,把最早结束的活动放进去,开始时的会场总数
		time[0]=f[0];//记录会场的最晚结束时间、
		for(int i=1;i<n;i++)//遍历所有节点为所有的节点安排会场
		{
			int flag=0;//此活动刚开始未安排进入会场
			for(int j=0;j<sumRoom;j++)
			{
				if(time[j]<=s[i])
				{
					flag=1;
					time[j]=f[i];//若加入的次会场,更新此会场的最晚结束时间
				}
			}
		    if(flag==0)//没有会场装下它,开辟新的会场
			{
		       time[sumRoom]=f[i];//更新时间
			   sumRoom++;
			}
		}
		return sumRoom;
	}</span>

总结:上述两种问题: 先前的排序很重要,最早结束时间,优先选择最早结束时间的活多不能够,使兼容的子序列最多,使用的会场最少。会场安排其实就是



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。
程序猿可能都知道 数据结构 + 算法 = 程序 ,慧眼识金的人懂得下下载这本算法导论的想必也知道它的经典,这是本清晰度还不错的pdf版本,外面好多资源,但都有内容不全的问题,这本是难得的全书,不用费力下载part 1234...了,分享给大家 《算法导论》((美国)Cormen)[PDF] 第二版,2006年出版的 目录: 第一部分 基础知识 引言 第1章 算法在计算中的作用 1.1 算法 1.2 作为一种技术的算法 第2章 算法入门 2.1 插入排序 2.2 算法分析 2.3 算法设计 2.3.1 分治法 2.3.2 分治法分析 第3章 函数的增长 3.1 渐近记号 3.2 标准记号和常用函数 第4章 传归式 4.1 代换法 4.2 递归树方法 4.3 主方法 4.4 主定理的证明 4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整函数 第5章 概率分析和随机算法 5.1 雇用问题 5.2 指示器随机变量 5.3 随机算法 5.4 概率分析和指示器随机变量的进一步使用 5.4.1 生日悖论 5.4.2 球与盒子 5.4.3 序列 …… 第二部分 排序和统计学 引言 第6章 堆排序 第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第15章 动态规划 第16章 贪心算法 第17章 平摊分析 第五部分 高级数据结构 概述 第18章 B树 第19章 二项堆 第20章 斐波那契堆 第21章 用于不相交集合的数据结构 第六部分 图算法 引言 第22章 图的基本算法 第23章 最小生成树 第24章 单源最短路径 第25章 每对项点间的最短路径 第26章 最大流 第七部分 算法研究问题选编 引言 第27章 排序网络 第28章 矩阵运算 第29章 线性规划 第30章 多项式与快速傅里叶变换 第31章 有关数论的算法 第32章 字符串匹配 第33章 计算几何学 第34章 NP完全性 第35章 近似算法 第八部分 附录:数学基础知识 引言 A 求和 B 集合等离散数学结构 C 计数和概率 参考文献 索引

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值