Вот собственно стоит такая задчка: есть массив закрытых интервалов, нужно объединить те которые имеют пересечение. Я налабал на шарпе, но это однозначно не оптимально, может кто знает более короткое решение (у гогля спрашивал – не нашел)
public static DoubleInterval[] Merge(params DoubleInterval[] ranges)
{
if (ranges == null)
{
throw new ArgumentNullException("ranges");
}
List<DoubleInterval> result = new List<DoubleInterval>();
foreach (DoubleInterval range in ranges)
{
DoubleInterval newRange = new DoubleInterval(range.Minimum, range.Maximum);
if (result.Count > 0)
{
Int32 index = result.Count - 1;
while (index >= 0)
{
DoubleInterval prevRange = result[index];
if (prevRange.CanMergeWith(newRange))
{
newRange = prevRange.MergeWith(newRange);
result.RemoveAt(index);
index = result.Count - 1;
continue;
}
index--;
}
}
result.Add(newRange);
}
return result.ToArray();
}
ну и соответственно
public class DoubleInterval
{
public Double Minimum;
public Double Maximum;
public DoubleInterval MergeWith(DoubleInterval range)
{
if (!this.CanMergeWith(range))
{
throw new InvalidOperationException();
}
return new DoubleInterval(Math.Min(this.Minimum, range.Minimum), Math.Max(this.Maximum, range.Maximum));
}
}