Задача о неперекрывающихся интервалах

Задачи об интервалах легко решаются перебором. Но если элементов много, то нужно сообразить в каком порядке их лучше перебирать, чтобы избежать лишних вычислений.

Формулируется задача так: дан массив интервалов, каждый из которых определен двумя числами — [начало интервала, конец интервала]. Требуется удалить минимальное число элементов, чтобы интервалы не перекрывали друг друга.

Исходя из формулировки, задача выглядит так, что требуется подсчитать число перекрытий для каждого интервала, и далее начать удаление с тех элементов, у которых больше всего перекрытий, актуализируя число перекрытий для оставшихся элементов.

Сложность вычислений превосходит N*N, т.к. придется каждый элемент сравнивать с другим, а потом пройтись по части списка, удаляя элементы и актуализируя число перекрытий, что тоже может составить до N*N операций.

Обсуждение подхода

Сложность высока из-за того, что элементы не упорядочены. Мы вынуждены проверять отношения все ко всем.

Если отсортировать элементы по возрастанию левой границы, то нам уже как минимум не придется сравнивать каждый элемент со всеми предыдущими по левой границе. Останется анализ правой границы.

Если два интервала пересекаются, нам нужно выбрать какой из них удалить. Т.к. речь идет о сравнении по правой границе, то логично удалить тот интервал, который имеет меньшую правую границу, т.к. это более вероятно позволит избежать пересечения с последующими в списке интервалами.

Мы можем отслеживать значение левой границы, двигаясь по списку интервалов, чтобы сразу определять — имеется ли пересечение с следующим рассматриваемым интервалом. Если пересечения нет, то границу можно отодвигать по правой границе нового интервала.

Если же пересечение есть, то мы должны решить — удалять рассматриваемый интервал или один из предыдущих. Удаляется тот, у которого правая граница больше.

Реализация

Код на TS/JS:

Сложность вычислений можно оценить как N * log(N) — это неизбежный вклад сортировки, и далее порядка 2 * N — перебор сортированного массива.

Мало букафф? Читайте есчо !

Задача группировки подобных строк

Апрель 28, 2023 г.

Речь идет о № 839 с leetcode. Формулируется проблема таким образом - дан массив строк, которые отличаются (или не отличаются) друг от друга перестановкой ...

Читать

TS: функция преобразования к каноническому пути

Март 15, 2023 г.

Увидел эту задачу на leetcode - https://leetcode.com/problems/simplify-path/, где не так часто встречаются задачи близкие к практиктическому программированию. Ранее уже приводил решение подобной задачи для PHP. Здесь порешаем её уже на TS. Задача ...

Читать

Задача о подсчете количества путей в словаре

Апрель 16, 2023 г.

Разбираем задачу № 1639 Number of Ways to Form a Target String Given a Dictionary c leetcode.com. Дан словарь, где слова имеют одинаковую длину - words. Также дано дополнительно слово - target, которое нужно составить из словарных слов по следующим правилам: ...

Читать

Игра в камни

Май 27, 2023 г.

Серия задач StoneGame на leetcode - образец игры, где требуется просчитать оптимальную стратегию. Выигрыш/проигрыш начинающего партию предопределен, и второй участник лишь может надеяться на ошибку первого. Но это не наш случай, т.к. по условию ...

Читать
 

Комментарии к «Задача о неперекрывающихся интервалах»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: