0 引言
最近的工作中遇到了这么一个问题,需对任意个整数区间判断其连续性。思考一番后发现一个较为通用的方法,问题虽然不难,但感觉大家或许也会遇到,在此分享一下。
这里的区间连续性分为两个方面,一是区间之间不能出现重叠;二是区间之间不能存在数值间隔。区间本身也存在开区间和闭区间并存的情况,因此,第一步是解决区间开闭情况不统一的问题。
1 开区间转化为闭区间
开区间边界值进行比较时总是感觉隔着一层,索性将所有开区间转为闭区间。这部分的工作比较简单,过程就简单略过。
2 只有两个区间的情况
上学时老师就教导我们,解决复杂问题时要先从简单情况入手,简化模型,寻找规律,最后再从简单情况推广到复杂情况......
嗯,是的,让我们先来考虑只有两个区间时的情况。
我们将连续性分为重叠和间隔两个角度加以考虑。假设,存在整数区间A_1=[a,b],A_2=[c,d],如果A_1、 A_2间隔,必然有max(a,c)-min(b,d)>1;如果区间A_1、 A_2重叠,必然有max(a,c)-min(b,d)≤0。因此,只有当<0max(a,c)-min(b,d)<=1,即max(a,c)-min(b,d)=1时,整数区间A_1、 A_2才连续。
3 任意个区间的情况
我们对max(a,c)-min(b,d)=1进行简单推导,可得出如下结论。
已知整数区间A_1=[a,b],A_2=[c,d],其中,c>a,则,当且仅当c-d=1时区间A_1、 A_2连续。
我们将上述经验推广到任意数量整数区间的情况。假设,存在n个整数区间A_1,A_2,…,A_n,其中任一区间A_i的区间左边界记为A_i.start,右边界记为A_i.end,判断A_1,A_2,…,A_n是否连续。
利用上述结论,将判断过程分为两个步骤:
step1:将区间序列A_1,A_2,…,A_n按照区间左边界(A_i.start)升序排列,得新序列。
step2: 在新序列中,通过循环判断Ai.end+1,是否等于A(i+1).start,(i=1,2,…,n-1)。如果存在不相等的情况,则说明区间序列A_1,A_2,…,A_n不连续;如果都相等,则说明区间序列A_1,A_2,…,A_n连续。
通过伪代码,可将上述过程描述如下:
当然,我们也可以对step2中的结论进行简单扩展,如果A_(i+1).start>A_i.end+1,(i=1,2…n-1),则区间Ai和区间A(i+1)间隔;如果A_(i+1).start<A_i.end+1,(i=1,2…n-1),则区间Ai和区间A(i+1)重叠。
至此判断过程就算完成了。