求一算法:判断两个不连续时间段是否存在时间交叉?(100分)

  • 主题发起人 主题发起人 xuyuanchao
  • 开始时间 开始时间
X

xuyuanchao

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:
---*******--------*******-------*******-----******--*********
-----------****---------*******---------******--------**-----
其中*表示工作时间,-表示没有工作的时间,从影射的观点看,只要上面的
工作时间影射到下面的时间段后得到的工作时间等于上面的工作时间与下面
的工作时间之和即可,如果小于,说明时间有交叉,不可能出现大于的情况。

说起来简单,如何用算法实现,还真想不明白。


本人分少得可怜,先给100分,以后富了再补。
 
循环依次读出上面的时间段.取出上面时间段的结束时间,然后再在下面
时间段中查找是否有开始时间小于上面时间段的结束时间,有,既有交叉
时间段.
 
将两段的单个工作时间取出,做个循环
 
TO yunshang:
下面时间段的开始时间小于上面时间段的结束时间并不能说明时间上交叉,
就象下面这样。
------------************
--********--------------
TO netwind
如果循环,时间复杂性太高,何况下面的时间段需要和多个上面的时间段比较。
 
开始时间小于上面时间段的结束时间
并且
下面结束时间大于上面开始时间.
 
我也想知道,谁给出正确答案我也出100分.
 
A: ---*******--------*******-------*******-----******--*********
B: -----------****---------*******---------******--------**-----
    其中*表示工作时间,-表示没有工作的时间。
(1)
  把A中工作的起始时间和结束时间放进数组a;
  把B中工作的起始时间和结束时间放进数组b;
  var ai,bi:integer;  //a和b的下标
(2)
  取a[0]和b[0]中最小的,不妨为a。此时,ai=1;bi=0;
(3)
  比较a[ai](结束时间)和b[bi](起始时间):
    如果a[ai]>b[bi],时间有交叉,结束;
    否则,ai=ai+1(下一次的起始时间);bi=bi+1(这次的结束时间)。
(4)
  比较b[bi]和a[ai](起始时间):
    如果b[bi]>a[ai],时间有交叉,结束;
    否则,ai=ai+1;bi=bi+1,回到(3)直到某数组结束。
差不多了吧???
 
假设表t1中有两项
BeginDate和EndDate,都是日期类型,已有若干记录。

现在要往t1表中插入新记录(d1,d2),为了避免(d1,d2)
与表中已有记录有日期交叉,可做如下判断:

Select count(*) From t1
Where
d1 between BeginDate and EndDate OR
d2 between BeginDate and EndDate OR
BeginDate Between d1 and d2 OR
EndDate Between d1 and d2

如果结果>0,则表示(d1,d2)与已有记录有日期交叉;
如果结果=0,则表示(d1,d2)与已有记录无日期交叉。
 
取最早测量时刻的为基准时间点。
工作时间与基准点的时差为距离。
连续工作区为集合。
另一种时段的工作点IN 集合 是否?
OK?
 
多人接受答案了。
 
后退
顶部