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区间并集_区间并集求解算法实现相关推荐

  1. java加权区间调度_区间调度问题详解

    今天给大家介绍一下区间调度问题.区间调度是一类难度比较大,但同时应用比较广的问题,经常会在面试中以各种形式出现.本文将会介绍区间调度的各种变形,希望能使大家在面临区间调度问题时得心应手,并可以在实际工 ...

  2. java 查找排序_查找与排序算法(Java实现)

    1.二分查找算法 package other; public class BinarySearch { /* * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 */ p ...

  3. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  4. 着色问题求解java 图形化_练习 - 实现 Grover 算法以解决图形着色问题

    练习 - 实现 Grover 算法以解决图形着色问题 40 分钟 在本模块中,最后将以端到端的方式实现 Grover 搜索算法:从图形着色问题的黑盒定义到处理算法的随机性质的逻辑. 备注 出于必要,本 ...

  5. java活动安排_贪心法求解活动安排(java实现)

    贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...

  6. java 排序原理_简单选择排序算法原理及java实现(超详细)

    简单选择排序的原理 简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换.以 ...

  7. java murmurhash实现_一致性哈希算法与Java实现

    一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数 ...

  8. java 逆波兰_逆波兰表达式算法-Java版

    这两天一直在看数据结构,栈这个地方,基础的就是这个逆波兰表达式,看了很多博文,都讲得不清不楚或者只能计算一个位的数字,决定自己写,这篇博文给了很大启发–>Go New Land AND Here ...

  9. java 数字区间_(Java实现) 整数区间

    一.题目描述 给n个区间,形式为[a, b],a和b均为整数,且a < b. 求一个最小的整数点的集合,使得每个区间至少2个不同的元素(整数点)属于这个集合. 求这个集合的元素个数. 输入 第1 ...

  10. pso解决tsp matlab,计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc...

    计算智能课程设计_粒子群优化算法求解旅行商问题_Matlab实现.doc 摘要:TSP是一个典型的NPC问题.本文首先介绍旅行商问题和粒子群优化算法的基本概念.然后构造一种基于交换子和交换序[1]概念 ...

最新文章

  1. 吴恩达新书《Machine Learning Yearning》完整中文版 PDF 下载!
  2. free movie
  3. SNMP功能开发简介 二 net-snmp源码分析报文处理流程图
  4. FSD键盘钩子框架参考爱写驱动的女装大佬
  5. SiamMask:视频跟踪最高精度 (中科院王强大神作品)
  6. VTK:隐式二次元用法实战
  7. POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...
  8. 腾讯最新手游《和平精英》上线 魅族李楠评论亮了
  9. poj3461kmp
  10. re:Invent 2020首日发布43项新产品与功能,涵盖新实例、容器、Serverless、机器学习等领域!
  11. 大数据分析五步法流程顺序
  12. Android NDK 下载地址
  13. Python 加性高斯白噪声 AWGN
  14. 什么是计算机科学中的“本体论”
  15. Unity与Android权限设置
  16. 负载均衡和Nginx
  17. ARFoundation系列讲解 - 80 AR内容制作一
  18. PostgreSQL 源码解读(109)- WAL#5(相关数据结构)
  19. 六个计算机函数,excel统计函数都有哪些?Excel常见6个统计函数
  20. 三,python基础初识。

热门文章

  1. iOS 手机号码验证
  2. zookeeper入门篇
  3. 共享磁盘到远程服务器上,远程桌面链接怎么共享本地磁盘,你值得一看的技巧...
  4. 古镇、温泉、阳澄湖品蟹二日游--这个周末,终于放松了一下。
  5. 百度富文本编辑器Ueditor图片上传的注意点
  6. QT 之QPainter画点
  7. FIRST集合、FOLLOW集合以及LL(1)文法
  8. 前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01
  9. [论文] Feature Squeezing:Detecting Adversarial Examples in Deep Neural Networks
  10. 农夫山泉背后的男人“有点狠”