Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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 - Fatal编程技术网

C# 最小连续序列群

C# 最小连续序列群,c#,algorithm,C#,Algorithm,我有以下问题,最好用图表来描述: 考虑下面的序列可以是任何类型的序列:数字,日期在我的情况下,它的日期等。 我希望找到最长连续序列的所有组,如后一个示例中的输出,即包含可能的最长序列的最小组数 我想进行某种排序/排序最小值/最大值在这里似乎没有多大帮助,因为我可以有空的间隙,先按左点,然后按右点,但我也不确定。我会将起点和终点一起排序为一个排序顺序,然后按该顺序处理,保持看到的起点数减去看到的终点数的连续计数。当这个计数器降到零时,你就有了一个完整的间隙。根据相邻线是否被零长度间隔分隔,您可以在

我有以下问题,最好用图表来描述: 考虑下面的序列可以是任何类型的序列:数字,日期在我的情况下,它的日期等。 我希望找到最长连续序列的所有组,如后一个示例中的输出,即包含可能的最长序列的最小组数


我想进行某种排序/排序最小值/最大值在这里似乎没有多大帮助,因为我可以有空的间隙,先按左点,然后按右点,但我也不确定。我会将起点和终点一起排序为一个排序顺序,然后按该顺序处理,保持看到的起点数减去看到的终点数的连续计数。当这个计数器降到零时,你就有了一个完整的间隙。根据相邻线是否被零长度间隔分隔,您可以在连接的情况下在端点之前或之后对起点进行排序。

我在C中没有它,但必须在sql中解决这个确切的问题,也许这会给您一个如何将其转换为C的提示

select Resource_ID, Appointment_date, Min(NewStartTime) Start_Time, MAX(End_Time) End_Time
into #CleanedBlockTimes
from
(
    select *,
        NewStartTime = Dateadd(mi, v.number, t.Start_Time),
        NewStartTimeGroup =
            dateadd(mi,
                    1- DENSE_RANK() over (partition by Resource_ID, Appointment_date order by Dateadd(mi, v.number, t.Start_Time)),
                    Dateadd(mi, v.number, t.Start_Time))
    from #BlockTimes t
    inner join master..spt_values v
      on v.type='P' and v.number <= DATEDIFF(mi, Start_Time, End_Time)
) X
group by Resource_ID, Appointment_date, NewStartTimeGroup
order by Resource_ID, Appointment_date, Start_Time

我上一次编写类似这样的代码时,你只需抛出一些伪代码:

var outputRanges = new List<Range>();
foreach (var range in inputRanges)
{
   // Let Range.Touches(Range) define a function that returns true
   // iff the two ranges overlap at all (that is, A.Start and/or A.End
   // is between B.Start and B.End)
   var overlaps = outputRanges.Where(range.Touches).ToList();

   // If there are no overlaps, then simply add it to the output
   if (!overlaps.Any())
   {
       outputRanges.Add(range);
   }
   // If there are overlaps, merge them
   else
   {
       outputRanges.RemoveAll(overlaps);
       overlaps.Add(range);
       outputRange.Add(new Range() {
           Start = overlaps.Min(_=>_.Start),
           End = overlaps.Max(_=>_.End)
       });
   }
}

在范围的开头进行排序

从列表的开头开始,将结束时间与列表中下一项的开始时间进行比较。如果它们重叠,则用当前记录的结束时间和下一条记录的结束时间的最大值替换结束时间。删除下一条记录。重复一遍

如果没有重叠,则前进到下一条记录并重复


在日志n上进行排序,在日志n上进行编译。总的来说,在日志n.

上,数据是如何存储的?我会形象地翻转网格,在列表中向下迭代,检查某个日期是否有安排。@Joey Gennari-我可以按照自己的意愿存储数据,在我的例子中,我有两个日期列表:开始日期和结束日期。我不确定翻转它会有什么帮助,后面的图表中的每个序列并不是一个不同的日期,我有重叠的日期see@msdowella-这也是我最初的预感。感谢您概述了该方法。这说明了使用与mcdowella的答案类似的算法的精确解。谢谢