算法导论——贪心算法:活动选择

package org.loda.greedy;

import org.junit.Test;
import org.loda.structure.MinQ;

/**
 * 
 * @ClassName: ActivitySelector
 * @Description: 活动选择
 * @author minjun
 * @date 2015年5月20日 上午7:42:22
 * 
 */
public class ActivitySelector {

	@Test
	public void select() {
		/**
		 * 利用优先队列存储所有活动集合,所有活动按照结束时间从小到大排序
		 * 
		 * 使用优先队列可以最大化的简化问题,不过这里的优先队列是我自己实现的,还得不断完善
		 * 如果你觉得麻烦,也可以用jdk自带的PriorityQueue,那个是经过千锤百炼的
		 */
		MinQ<Activity> activities = new MinQ<Activity>();
		activities.offer(new Activity(1, 4));
		activities.offer(new Activity(3, 5));
		activities.offer(new Activity(0, 6));
		activities.offer(new Activity(5, 7));
		activities.offer(new Activity(3, 9));
		activities.offer(new Activity(5, 9));
		activities.offer(new Activity(6, 10));
		activities.offer(new Activity(8, 11));
		activities.offer(new Activity(8, 12));
		activities.offer(new Activity(2, 13));
		activities.offer(new Activity(12, 14));
		
		//贪心算法选中的活动
		Activity select=new Activity(0, 0);
		
		//数组用来存储选中的活动
		Activity[] arr=new Activity[activities.size()];
		
		int i=0;
		while(!activities.isEmpty()){
			//取出优先队列的活动,并查看该活动的开始日期是不是大于等于上一个选中的活动的结束日期,如果是,那么将选中此次活动,并将该活动放到数组里面存储起来
			Activity activity=activities.poll();
			if(activity.getBegin()>=select.getEnd()){
				select=activity;
				arr[i++]=select;
			}
		}
		
		//打印所有活动
		for(int j=0;j<i;j++){
			System.out.println(arr[j]);
		}
	}

	/**
	 * 
	 * @ClassName: Activity
	 * @Description: 活动使用的时间为[start,end),就是包含开始时间,不含结束时间
	 * @author minjun
	 * @date 2015年5月20日 上午7:46:59
	 * 
	 */
	class Activity implements Comparable<Activity> {

		/** 开始时间 */
		private int begin;

		/** 结束时间 */
		private int end;

		public Activity(int begin, int end) {
			super();
			this.begin = begin;
			this.end = end;
		}

		public int getBegin() {
			return begin;
		}

		public void setBegin(int begin) {
			this.begin = begin;
		}

		public int getEnd() {
			return end;
		}

		public void setEnd(int end) {
			this.end = end;
		}

		@Override
		public int compareTo(Activity a) {
			return this.end - a.end;
		}

		@Override
		public String toString() {
			return "Activity [begin=" + begin + ", end=" + end + "]";
		}
	}
	
}


输出内容为:

Activity [begin=1, end=4]
Activity [begin=5, end=7]
Activity [begin=8, end=11]
Activity [begin=12, end=14]

上面代码中使用到的优先队列MinQ是我在该系列博客中已经放出来过的,可以参考http://my.oschina.net/u/1378920/blog/417175这个地址

转载于:https://my.oschina.net/u/1378920/blog/417176

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值