Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重叠的多个日期范围比较:如何有效地进行?_C#_Algorithm_C# 4.0_Comparison_Overlap - Fatal编程技术网

C# 重叠的多个日期范围比较:如何有效地进行?

C# 重叠的多个日期范围比较:如何有效地进行?,c#,algorithm,c#-4.0,comparison,overlap,C#,Algorithm,C# 4.0,Comparison,Overlap,要检查两个不同日期范围的重叠,{Start1,End1}和{Start2,End2}我正在检查: if ((Start1 <= End2) && (End1 >= Start2)) { //overlap exists } if((Start1=Start2)) { //存在重叠 } 问题是,, 如果我有五个日期范围,比较重叠的好方法是什么 检查它们是否相互重叠 如果我有多个日期范围,如何确定这些范围是否重叠?如果我理解正确,您想回答以下问题:这些范围中是否有

要检查两个不同日期范围的重叠,
{Start1,End1}
{Start2,End2}
我正在检查:

if ((Start1 <= End2) && (End1 >= Start2))
{
  //overlap exists
}
if((Start1=Start2))
{
//存在重叠
}
问题是,, 如果我有五个日期范围,比较重叠的好方法是什么

检查它们是否相互重叠


如果我有多个日期范围,如何确定这些范围是否重叠?

如果我理解正确,您想回答以下问题:这些范围中是否有两个重叠?根据它们的左端对它们进行排序,然后查看1是否与2重叠,2是否与3重叠,等等。如果有任何重叠,这将找到它。我不相信有任何方法可以在不花费至少O(n logn)时间的情况下回答任意间隔列表的问题,这就是排序它们所需的成本


或者,您可能想回答以下问题:这些范围中是否有两个不重叠?(从表面上看,这就是你编辑的问题所要问的,但是(1)这似乎是一件奇怪的事情,(2)你上面的评论似乎表明这不是你的意思。)要检查这一点,找到最左端的间隔和最右端的间隔,看看它们是否重叠。(如果任意两个间隔不重叠,则这两个间隔不重叠。)

查找所有间隔是否重叠

static bool Overlap(params Tuple<DateTime, DateTime>[] ranges)
{
    for (int i = 0; i < ranges.Length; i++)
    {
        for (int j = i + 1; j < ranges.Length; j++)
        {
            if (!(ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1))
                return false;

        }
    }
    return true;
}
static bool Overlap(params Tuple<DateTime, DateTime>[] ranges)
{
    for (int i = 0; i < ranges.Length; i++)
    {
        for (int j = i + 1; j < ranges.Length; j++)
        {
            if (ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1)
                return true;

        }
    }
    return false;
}
静态布尔重叠(参数元组[]范围)
{
对于(int i=0;i
找出是否有重叠

static bool Overlap(params Tuple<DateTime, DateTime>[] ranges)
{
    for (int i = 0; i < ranges.Length; i++)
    {
        for (int j = i + 1; j < ranges.Length; j++)
        {
            if (!(ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1))
                return false;

        }
    }
    return true;
}
static bool Overlap(params Tuple<DateTime, DateTime>[] ranges)
{
    for (int i = 0; i < ranges.Length; i++)
    {
        for (int j = i + 1; j < ranges.Length; j++)
        {
            if (ranges[i].Item1 <= ranges[j].Item2 && ranges[i].Item2 >= ranges[j].Item1)
                return true;

        }
    }
    return false;
}
静态布尔重叠(参数元组[]范围)
{
对于(int i=0;i
DateTime h1=historyRecord.serviceStartDate;
DateTime h2=historyRecord.serviceEndDate;
DateTime r1=record.serviceStartDate;
DateTime r2=record.serviceEndDate;
如果(!((h1>r1&&h1>r2&&h2>r1&&h2>r2)|
(h1
试试这个:

    private bool intersects(DateTime r1start, DateTime r1end, 
                            DateTime r2start, DateTime r2end)
    {
        return (r1start == r2start) 
            || (r1start > r2start ? 
                r1start <= r2end : r2start <= r1end);
    }
private bool相交(日期时间r1start,日期时间r1end,
日期时间r2开始,日期时间r2结束)
{
返回(r1start==r2start)
||(r1start>r2start?
r1start检查此项
简言之:

简单检查两个时间段是否重叠

bool overlap = a.start < b.end && b.start < a.end;
bool overlap=a.start
或者在你的代码中

bool overlap = tStartA < tEndB && tStartB < tEndA;
bool overlap=tStartA
补充Gareth的答案。
对于需要按间隔执行更复杂类型的重叠检查的任何人, 有一个很好的数据结构称为区间树

树数据结构来保存间隔。特别是,它允许一个人有效地找到与任何给定间隔或点重叠的所有间隔

来自javascript实现的示例

let tree=newintervaltree();
设区间=[[6,8],[1,4],[5,12],[1,1],[5,7];
//将间隔作为键插入,并将字符串“val0”、“val1”等作为值插入
for(设i=0;i
您需要知道它们是否都在一个点上重叠,或者是否有任何一个彼此不重叠?请澄清您的问题。“比较重叠”是什么意思?@Yuriy Faktorovich,@gaearon:伙计们,我编辑了这个问题。基本上,我只是想知道如果我有多个日期范围,是否存在重叠。这不是
n^2
,而排序将有
n个日志(n)
?@Snowbear我不确定-1是否比让它做额外的比较更有效。@Snowbear我不确定排序的依据是什么,你能解释一下吗?@Yuriy-Gareth的答案(第一部分)解释了排序解决方案这两个问题都有非常聪明的解决方案。对于任何需要执行更复杂的重叠检查的人,有一种称为间隔树的数据结构。