间隔问题2 [No. 57]

原创 2012年03月28日 12:59:29

问题:

给一组间隔,把这些间隔合并,使得间隔之间不会有重合。比如:[1, 5], [3, 8], [10, 20], [7, 9] 合并后变成 [1, 9], [10, 20]。

分析:

首先,因为我们需要判断是否两个间隔是否重合,这样才能合并,检查两个间隔是否重合的代码是:

	/*
	 * s1: start point of interval 1
	 * e1: end point of interval 1
	 * s2: start point of interval 2
	 * e2: end point of interval 2
	 */
	public boolean overlap(int s1, int e1, int s2, int e2) {
		return Math.max(s1, s2) < Math.min(e1, e2);
	}

然后,我们把间隔按照开始值排序,这样,从头开始检查,如果当前间隔和前一个间隔重合,就合并。否则,直接把它加入到list里面。

代码如下:

public class Test {
	//check whether the two intervals intersect
	public boolean overlap(Interval i1, Interval i2) {
		return Math.max(i1.start, i2.start) < Math.min(i1.end, i2.end);
	}
	
	//merge the intervals and return a new interval list without overlapping
	public void merge(ArrayList<Interval> list) {
		int currentPosition = 0;
		for (int i = 1; i < list.size(); i++) {
			//no intersection
			if (overlap(list.get(i), list.get(currentPosition)) == false) {
				currentPosition++;
			} else {
				//get the new interval
				int start = Math.min(list.get(i).start, list.get(currentPosition).start);
				int end = Math.max(list.get(i).end, list.get(currentPosition).end);
				Interval interval = new Interval(start, end);
				list.remove(currentPosition);
				list.add(currentPosition, interval);
			}
		}
		
		int size = list.size();
		for (int i = currentPosition + 1; i < size; i++) {
			list.remove(currentPosition + 1);
		}
	}

	public static void main(String[] args) {
		ArrayList<Interval> list = new ArrayList<Interval>();
		
		list.add(new Interval(3, 8));
		list.add(new Interval(2, 29));
		list.add(new Interval(5, 17));
		list.add(new Interval(22, 47));
		list.add(new Interval(32, 48));
		Collections.sort(list);
		
		new Test().merge(list);
		for(Interval inter : list) {
			System.out.println("[" + inter.start + ", " + inter.end + "]");
		}
	}
}

class Interval implements Comparable<Interval>{
	int start;
	int end;
	
	Interval(int start, int end) {
		this.start = start;
		this.end = end;
	}

	public int compareTo(Interval o) {
		if (start > ((Interval)o).start || 
				(start == ((Interval)o).start && end > ((Interval)o).end)) {
				return 1;
		} else if (start == ((Interval)o).start && end == ((Interval)o).end) {
				return 0;
		}
		return -1;
	}
}
转载请注明出处:http://blog.csdn.net/beiyeqingteng

最优间隔分类器问题

SVM是支持向量机从诞生至今才10多年,发展史虽短,但其理论研究和算法实现方面却都取得了突破性进展,有力地推动机器学习理论和技术的发展。这一切与支持向量机具有较完备的统计学习理论基础的发展背景是密不可...
  • sina012345
  • sina012345
  • 2014年10月03日 00:35
  • 1157

【机器学习-斯坦福】学习笔记7 - 最优间隔分类器问题

本次课程大纲: 1、 最优间隔分类器 2、 原始优化问题&对偶优化问题(KKT条件) 3、 SVM对偶问题 4、 核方法(下一讲)...
  • maverick1990
  • maverick1990
  • 2013年11月21日 20:08
  • 6336

最优间隔分类器问题

最优间隔分类器问题 本次课程大纲: 1、 最优间隔分类器 2、 原始优化问题&对偶优化问题(KKT条件) 3、 SVM对偶问题 4、 核方法(下一讲)   复...
  • llwszjj
  • llwszjj
  • 2014年04月14日 11:34
  • 1540

【七】最优间隔分类器问题

介绍了《机器学习》第七讲的内容,推到了支持向量机SVM的相关公式,并给出一些概念的几何意义。...
  • knight_wzz
  • knight_wzz
  • 2016年10月24日 20:42
  • 441

firefox57浏览器下载,火狐firefox 57正式版32位,64位下载,安装和使用笔记

firefox浏览器的一直存在flash问题, 导致口碑不好, 最近推出了firefix57, 官方说重写了底层的内容, 性能更好,速度更快, 于是子恒老师安装试用了firefox57版本, 把其中的...
  • towtotow
  • towtotow
  • 2017年11月15日 10:46
  • 1857

间隔几天执行问题

需要做到间隔几天执行问题,可以考虑如下: ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); exec.sched...
  • lirenzuo
  • lirenzuo
  • 2017年04月21日 14:39
  • 2124

【斯坦福---机器学习】复习笔记之最优间隔分类器

本讲大纲:1.最优间隔分类器(optimal margin classifier) 2.原始/对偶优化问题(KKT)(primal/dual optimization problem) 3.SVM...
  • Andrewseu
  • Andrewseu
  • 2015年07月21日 20:52
  • 2087

支持向量机(SVM)关键点攻略(最大间隔,对偶问题)

用尽可能简单的思路,对SVM中的容易让人混淆的问题进行解释,并给出数学证明。...
  • a738779675
  • a738779675
  • 2016年03月26日 21:40
  • 1703

最优间隔分类、原始/对偶问题、SVM对偶—斯坦福ML公开课笔记7

本篇笔记针对ML公开课的第七个视频,主要内容包括最优间隔分类器(Optimal Margin Classifier)、原始/对偶问题(Primal/Dual Problem)、svm的对偶问题,都是s...
  • xinzhangyanxiang
  • xinzhangyanxiang
  • 2013年08月05日 22:25
  • 12450

SVM学习——软间隔优化

回想SVM学习——线性学习器一文中提到的Rosenblatt感知器的原始形式,当时的讨论是基于输入空间线性可分的情况,包括后来的最大间隔算法,通过核函数隐式的将输入空间映射到了一个高维特征空间中了,此...
  • u012116229
  • u012116229
  • 2014年05月14日 10:58
  • 1047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:间隔问题2 [No. 57]
举报原因:
原因补充:

(最多只允许输入30个字)