2

図で最もよく説明される次の問題があります。次のシーケンスを検討してください(任意のタイプのシーケンスにすることができます:数字、日付(私の場合はその日付)など)

ダイアグラム

後者の例の出力のように、最長の連続したシーケンスのすべてのグループ、つまり可能な限り最長のシーケンスを含むグループの最小量を見つけたいと思います。

最初に左のポイント、次に右のポイントで、ある種の並べ替え/順序付けを行うことを考えました(ギャップが空になる可能性があるため、最小/最大はここではあまり役に立たないようです)が、それについてはわかりませんまた。

4

4 に答える 4

3

前回次のようなコードを書いたときの疑似コードを吐き出すだけです。

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)
       });
   }
}
于 2013-07-31T19:23:18.207 に答える
0

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
于 2013-07-31T19:20:17.733 に答える