java区间并集_区间并集求解算法实现
packagetest;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/***
* 该类用ArrayList表示区间的集合,每一个元素表示一个区间,
* ArrayList中元素顺序为这些元素表示的区间按照在数轴上在顺序排列,
*
*
*
*@authorluoxian
*@sinceSep 5, 2008 4:38:09 PM
*@version1.0*/
public classUnionAlgorithm {/*** 存放结果 集合*/
private List value = newArrayList();/*** 计算主方法
*
*@paramparam
*@return
*/
publicList calc(Interval[] param) {
Interval[] interval=check(param);if (interval == null || interval.length == 0)return null;if (value.size() == 0 && interval.length >= 1)
value.add(interval[0]);for (int i = 1; i < interval.length; i++) {//判断该区间的左端点在value中的位置
int[] left_position = getPosition(value, 0, interval[i].getLeft());if (left_position[0] == 1) {//1 左端点属于value的情况
int[] right_position = getPosition(value, left_position[1], interval[i].getRight());if (right_position[0] == 1) {//1.1 右端点也属于value
if (left_position[1] == right_position[1])continue;
((Interval)value.get(left_position[1])).setRight(
((Interval)value.get(right_position[1])).getRight());for (int j = left_position[1] + 1; j <= right_position[1]; j++) {
value.remove(j);
}
}else{//1.2右端点不属于value
((Interval)value.get(left_position[1])).setRight(interval[i].getRight());for (int j = left_position[1] + 1; j < right_position[1]; j++) {
value.remove(j);
}
}
}else{//2 左端点不属于value
value.add(left_position[1], interval[i]);
refresh(left_position[1]);
}
}returnvalue;
}public void refresh(intindex) {
Interval temp=(Interval)value.get(index);int[] index_right_position = getPosition(value, index + 1, temp.getRight());if (index_right_position[0] == 1) {
Interval include_right= (Interval)value.get(index_right_position[1]);
temp.setRight(include_right.getRight());for (int i = index + 1; i <= index_right_position[1]; i++) {
value.remove(i);
}
}else if (index_right_position[0] == 0){//删除该区间内的所有区间
for (int i = index + 1; i < index_right_position[1]; i++) {
value.remove(i);
}
}
}/***
* 在集合value中查找点point的位置
* 从序列号为from开始查找
*
* 返回:为一个数组,包括两个值[type,index]
* 如果type=0,表示point点不在集合value中的任何一个区间内,该点在第index区间的前面
* 如果type=1,表示point点在集合value中的第index的元素区间内
*
* (说明:type为0的特殊情况为该点在集合中最后一个区间的后面,此时
* 尽管value.get(value.size())并不存在,我们仍然把index赋值为value.size())
*
*
*@paramvalue
*@paramfrom
*@parampoint
*@return
*/
public int[] getPosition(List value, int from, intpoint) {if (from >=value.size())return new int[]{0, value.size()};if (point
}for (int i = from; i < value.size() - 1; i++) {
Interval tmp=(Interval)value.get(i);if(tmp.isContain(point))return new int[]{1,i};
Interval tmpLater= (Interval)value.get(i + 1);if (point >tmp.getRight() && point
}//比较最后一个区间
Interval last = (Interval)value.get(value.size() - 1);if(last.isContain(point))return new int[]{1, value.size() - 1};else
return new int[]{0,value.size()};
}/*** 数组的检查, 数组元素右边的数不得小于右边的元素
*@paramduan
*@return
*/
publicInterval[] check(Interval[] temp){//:-不破坏参数原则
Interval[] interval = newInterval[temp.length];for (int i = 0; i < interval.length; i++) {
interval[i]= newInterval(temp[i]);
}//:-
int length =interval.length;for (int i = 0; i < interval.length; i++) {if (interval[i].getRight()
interval[i]= null;
length--;
}
}
Interval[] result= newInterval[length];int index = 0;for (int i = 0; i < interval.length; i++) {if (interval[i] != null){
result[index]=interval[i];
index++;
}
}returnresult;
}publicList getValue() {returnvalue;
}public static voidmain(String[] args) {
Interval[] v= {new Interval(1,3), new Interval(4,2)};
UnionAlgorithm ua= newUnionAlgorithm();
Interval d1= new Interval(7,9);
Interval d2= new Interval(5,7);
Interval d3= new Interval(-1,4);
Interval d4= new Interval(8,10);
Interval d5= new Interval(10,12);
Interval d6= new Interval(4,1);
Interval d7= new Interval(8,10);
Interval d8= new Interval(3,14);
Interval d9= new Interval(15,17);
Interval c1= new Interval(0,4545);
Interval c2= new Interval(32,54);
Interval c3= new Interval(123,456);
Interval c4= new Interval(34,54);
Interval c5= new Interval(12,23);
Interval[] duan={d1,d2,d3};//Interval[] duan = {d1,d2,d3,d4,d5,d6,d7,d8,d9,c1,c2,c3,c4,c5};
long sc =System.currentTimeMillis();
ua.calc(duan);//Thread.sleep(1);
sc = System.currentTimeMillis() -sc;
System.out.println(ua.getValue()+ "花费:" +sc);
}
}//下面是区间bean
packagetest;/*** 表示一个区间[left, right]
*@authorluoxian
*@sinceSep 5, 2008 4:48:15 PM
*@version1.0*/
public classInterval {private intleft;private intright;publicInterval(Interval interval) {this.left =interval.getLeft();this.right =interval.getRight();
}public Interval(int left, intright) {this.left =left;this.right =right;
}public boolean isContain(intpoint) {if (point <= right && point >=left)return true;else
return false;
}public intgetLeft() {returnleft;
}public intgetRight() {returnright;
}public void setLeft(intleft) {this.left =left;
}public void setRight(intright) {this.right =right;
}publicString toString(){return "[" + left + " , " + right + "]";
}
}
java区间并集_区间并集求解算法实现相关推荐
- java加权区间调度_区间调度问题详解
今天给大家介绍一下区间调度问题.区间调度是一类难度比较大,但同时应用比较广的问题,经常会在面试中以各种形式出现.本文将会介绍区间调度的各种变形,希望能使大家在面临区间调度问题时得心应手,并可以在实际工 ...
- java 查找排序_查找与排序算法(Java实现)
1.二分查找算法 package other; public class BinarySearch { /* * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 */ p ...
- java 二分查找_计算机入门必备算法——二分查找法
1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...
- 着色问题求解java 图形化_练习 - 实现 Grover 算法以解决图形着色问题
练习 - 实现 Grover 算法以解决图形着色问题 40 分钟 在本模块中,最后将以端到端的方式实现 Grover 搜索算法:从图形着色问题的黑盒定义到处理算法的随机性质的逻辑. 备注 出于必要,本 ...
- java活动安排_贪心法求解活动安排(java实现)
贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...
- java 排序原理_简单选择排序算法原理及java实现(超详细)
简单选择排序的原理 简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换.以 ...
- java murmurhash实现_一致性哈希算法与Java实现
一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数 ...
- java 逆波兰_逆波兰表达式算法-Java版
这两天一直在看数据结构,栈这个地方,基础的就是这个逆波兰表达式,看了很多博文,都讲得不清不楚或者只能计算一个位的数字,决定自己写,这篇博文给了很大启发–>Go New Land AND Here ...
- java 数字区间_(Java实现) 整数区间
一.题目描述 给n个区间,形式为[a, b],a和b均为整数,且a < b. 求一个最小的整数点的集合,使得每个区间至少2个不同的元素(整数点)属于这个集合. 求这个集合的元素个数. 输入 第1 ...
- pso解决tsp matlab,计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc...
计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc 摘要:TSP是一个典型的NPC问题.本文首先介绍旅行商问题和粒子群优化算法的基本概念.然后构造一种基于交换子和交换序[1]概念 ...
最新文章
- 吴恩达新书《Machine Learning Yearning》完整中文版 PDF 下载!
- free movie
- SNMP功能开发简介 二 net-snmp源码分析报文处理流程图
- FSD键盘钩子框架参考爱写驱动的女装大佬
- SiamMask:视频跟踪最高精度 (中科院王强大神作品)
- VTK:隐式二次元用法实战
- POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...
- 腾讯最新手游《和平精英》上线 魅族李楠评论亮了
- poj3461kmp
- re:Invent 2020首日发布43项新产品与功能,涵盖新实例、容器、Serverless、机器学习等领域!
- 大数据分析五步法流程顺序
- Android NDK 下载地址
- Python 加性高斯白噪声 AWGN
- 什么是计算机科学中的“本体论”
- Unity与Android权限设置
- 负载均衡和Nginx
- ARFoundation系列讲解 - 80 AR内容制作一
- PostgreSQL 源码解读(109)- WAL#5(相关数据结构)
- 六个计算机函数,excel统计函数都有哪些?Excel常见6个统计函数
- 三,python基础初识。
热门文章
- iOS 手机号码验证
- zookeeper入门篇
- 共享磁盘到远程服务器上,远程桌面链接怎么共享本地磁盘,你值得一看的技巧...
- 古镇、温泉、阳澄湖品蟹二日游--这个周末,终于放松了一下。
- 百度富文本编辑器Ueditor图片上传的注意点
- QT 之QPainter画点
- FIRST集合、FOLLOW集合以及LL(1)文法
- 前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01
- [论文] Feature Squeezing:Detecting Adversarial Examples in Deep Neural Networks
- 农夫山泉背后的男人“有点狠”