Проверьте перекрывающиеся серии в C # - PullRequest
0 голосов
/ 20 сентября 2011

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

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

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

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

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

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

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

С уважением, Sakshi

Ответ:

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

  1. start> startRange и запуск меньше, чем endRange
  2. end> ​​startRange и end меньше, чем endRange

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

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

Ответы [ 2 ]

3 голосов
/ 06 сентября 2012

ОП предлагает две проверки для подтверждения того, что новый диапазон не перекрывается с существующим диапазоном. Однако эти две проверки не охватывают все возможности. Например, если существующий диапазон равен (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 возможности перекрывающегося диапазона.

0 голосов
/ 19 ноября 2013

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

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

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

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

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

Третья проверка: конец диапазона 1> = начало диапазона 2 и конец диапазона 1 <= конец диапазона 2 </p>

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

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

    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;
    }
...