Проверить перекрывающиеся серии в С#

Я делаю приложение, в котором пользователь добавляет начало и конец, чтобы определить диапазон

Условие состоит в том, что диапазон не должен пересекаться:

Как проверить, не перекрывается ли диапазон номеров, например.

  1. Диапазон 1 Начало 5 Конец 15
  2. Диапазон 2 Начало 1 Конец 4
  3. Диапазон 3 Начало 16 Конец 20
  4. Диапазон 4 Начало 2 Конец 4

Итак, Range 4 делает набор недействительным, как мне проверить это на С#.

Далее пользователь может добавить диапазон в любом порядке, как в примере выше, вся серия не должна перекрываться.

Спасибо за предложение помощи.

С уважением, Сакши

Отвечать:

Я сделал правильное решение: если начало и конец - это диапазон, который необходимо проверить, тогда

  1. start>startRange и start меньше endRange
  2. end>startRange и end меньше, чем endRange

Условие выше 2 подтверждает, что серия перекрывается.

Где startRange и endRange — это начало и конец всех существующих диапазонов.


person Sakshi Smriti    schedule 20.09.2011    source источник


Ответы (2)


OP предлагает две проверки, чтобы убедиться, что новый диапазон не пересекается с существующим диапазоном. Однако эти две проверки не охватывают всех возможностей. Например, если существующий диапазон равен (4,10), а новый диапазон равен (2,12), он не будет помечен, поскольку он начинается до начала существующего диапазона и заканчивается позже.

Вместо этого я бы рекомендовал следующий подход:

if (newRangeStart <= existingRangeEnd && newRangeEnd >= existingRangeStart) {
    // we have an overlap
}

По сути, существует четыре возможности перекрытия диапазонов:

  1. Диапазон, который начинается перед существующим диапазоном и заканчивается внутри существующего диапазона
  2. Диапазон, который начинается в пределах существующего диапазона и заканчивается позже
  3. Диапазон, который начинается в существующем диапазоне и заканчивается в существующем диапазоне
  4. Диапазон, который начинается перед существующим диапазоном и заканчивается после существующего диапазона

Случаи (1) и (2) включают частичное перекрытие, тогда как случаи (3) и (4) включают полное перекрытие (либо существующий диапазон полностью охватывает новый диапазон [случай 3], либо новый диапазон полностью охватывает существующий диапазон [случай 4]. ]).
Код OP улавливает случаи 1, 2 и 3, но не случай 4. Код здесь улавливает все 4 возможности перекрывающегося диапазона.

person Avi Shmidman    schedule 06.09.2012

Диапазоны должны иметь несколько проверок:

У вас может быть много вариантов перекрытия, поэтому вам нужно будет провести несколько тестов.

|-----------|       |--------------|
    |------------------------|
         |-------------|
|--------------------------------|

Первая проверка: начало диапазона 1 >= начало диапазона 2 и начало диапазона 1 ‹= конец диапазона 2

Вторая проверка: начало диапазона 2 >= начало диапазона 1 и начало диапазона 2 ‹= конец диапазона 1

Третья проверка: Конец диапазона 1 >= Начало диапазона 2 и Конец диапазона 1 ‹= Конец диапазона 2

Четвертая проверка: конец диапазона 2 >= начало диапазона 1 и конец диапазона 2 ‹= конец диапазона 1

Эти проверки предполагают, что End >= Start для обоих диапазонов. Если нет, вам нужно поменять местами начало и конец тестов.

    public static bool DoRangesOverlap(int p_start1, int p_end1, int p_start2, int p_end2)
    {
        if ((p_start1 >= p_start2 && p_start1 <= p_end2) || (p_start2 >= p_start1 && p_start2 <= p_end1) || (p_end1 >= p_start2 && p_end1 <= p_end2) || (p_end2 >= p_start1 && p_end2 <= p_end1))
        {
            return true;
        }

        return false;
    }
person Brien King    schedule 18.11.2013
comment
Используйте метод ниже, так как это лучшее решение, чем мое. - person Brien King; 01.07.2014