满足冲突算法

时间:2011-02-04 20:02:34

标签: algorithm datetime compare

我今天接受了采访,并被要求检查两次会面是否相互冲突。每次会议都有开始时间和结束时间。 我试图回答这个问题但不是那个具体的问题。有人可以提出一些想法吗?

bool IsConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2)
如果有冲突,

应该返回true,如果没有冲突则返回false。

例如

如果符合,则为真:
(s1,e1)= 8,10

(s2,e2)= 9,11

(s1,e1)= 7,10

(s2,e2)= 8,9

(s1,e1)= 8,11

(s2,e2)= 9,11 等等

5 个答案:

答案 0 :(得分:18)

这是基本区间代数,请参阅my answer here for more details,但代码如下所示:

bool IsConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2)
{
    return (s1 < e2) && (e1 > s2);
}

我假设两个会议开始,而另一个会议没有发生冲突。

答案 1 :(得分:2)

在两个区间的简单情况下,我认为这将有效(未经测试的伪代码):

bool IsConflict(Datatime s1, Datatime e1, Datatime s2, Datatime e2) {
    if( s1 < s2 ) {
        // meeting 1 starts first
        if( e1 > s2 ) return true; // overlap
    }
    else {
        // meeting 2 starts first
        if( e2 > s1 ) return true; // overlap
    }

    return false;
}

答案 2 :(得分:1)

当且仅当max(s1, s2) < min(e1, e2)时,会议重叠。这种基于交集的方法假设间隔(s, e)是开放的,并暗示(正确或错误地)会议s = e不能与另一次会议重叠。

答案 3 :(得分:1)

以下算法的复杂性为O(nlogn)

public boolean isConflicts(float startTime[], float endTime[])
{
    TreeMap<Float, Integer> map = new TreeMap<Float, Integer>();
    for (int i = 0; i < startTime.length; i++)
    {
        map.put(startTime[i], -1);
        map.put(endTime[i], 1);
    }

    Iterator<Integer>iter = map.values().iterator();
    while (iter.hasNext())
    {
        if ((iter.next() + iter.next()) != 0)
        {
             System.out.println ("Conflicts...");
             return true;
        }
    }
    return false;                 
}

答案 4 :(得分:0)

计划 有三种情况需要检查这个问题。

  • 案例1:s1是否位于区间[s2,e2]内     (s1> = s2)&amp;&amp; (s1&lt; = e2)
  • 案例2:e1是否位于区间[s2,e2]内     (e1> = s2)&amp;&amp; (e2&lt; = e2))
  • 案例3:点(s2,e2)是否在[s1,e1]之内     (s1&lt; = s2)&amp;&amp; (e1> = e2)

所以这就是答案。我道歉;这不是最易读的代码行。

代码(伪):

bool isConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2){
  return ((s1 >= s2) && (s1 <= e2)) || ((e1 >= s2) && (e2 <= e2)) || (s1 <= s2) && (e1 >= e2));
}