java区间并集_区间并集求解算法实现

这是一个使用Java实现的区间并集算法,通过ArrayList存储区间集合,按照数轴顺序排列。算法核心是遍历区间,根据区间的左端点在已合并结果中的位置,更新并合并区间,最终得到不相交的区间集合。
摘要由CSDN通过智能技术生成

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 + "]";

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值