Объединение закрытых интервалов.
От: pASkuda Россия  
Дата: 10.04.09 06:37
Оценка:
Вот собственно стоит такая задчка: есть массив закрытых интервалов, нужно объединить те которые имеют пересечение. Я налабал на шарпе, но это однозначно не оптимально, может кто знает более короткое решение (у гогля спрашивал – не нашел)

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));
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.