任意多个区间的交,并

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lifestxx/article/details/85339799

化简常量表达式可能会遇到任意多个区间的交,并。

下面简单描述算法。

一 任意多个交

集合分为六种类型。

1 单点集 x=a

2 空集

3 全集

4 两个参数的区间 a<x<b

5 正无穷 x>a

6 负无穷 x<b 

其中1,4可以多个。假设已经全为不交情形。

两个上述六种类型的并的交:

单点集,空集,全集都比较简单,可先不考虑。

只考虑多个4,及单个5,6情形。

1 如果两个都含有负无穷,取小的为a。保存x<a。否则空。继续。

2 如果两个都含有正无穷,取大的为b。保存x>b。否则空。继续。

3 记A为上述xa,B为上述xb。如果不存在则取所有区间的最小最大值。

4 对区间[xa,xb]遍历如下:从左到右

    设a1,b1;a2,b2;.....;an,bn;

       c1,d1;c2,d2;.....;cm,dm;

    取a1,c1最大值不妨设为a1。记A0=a1,B0=b1. 此时对于另一边有三种情况:

     d1>a1且d1<b1:保存(a1,d1) 取下一个区间继续。

     d1<a1:取下一个区间继续。

     d1>b1:保存(a1,b1)取下一个区间继续。

二 任意多个并:

1 前面留大的;

2 后面留小的;

3 同样处理;

4 区间遍历 (a1,b1)(a2,b2)设a1小,

      a2>b1或b2<b1 舍去继续;

      a2<b1且b2>b1 保存成一个(a1,b2)继续。

猜你喜欢

转载自blog.csdn.net/lifestxx/article/details/85339799