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

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这个地址

你可能感兴趣的:(算法导论,贪心算法,活动选择)