Найдите наименьшую часть пересекающихся интервалов

Учитывая набор целочисленных интервалов SI = {I1,I2,...,In}, мне нужно найти наименьший раздел SI такой, что все интервалы подмножества раздела пересекаются.

То есть найдите наименьшее P = {Pi : Pi⊂SI}, где Pi∩Pj=∅

и такое, что ∀Ia,Ib∊Pi, Ia∩Ib≠∅

Например :

Дано, SI = {[0,7],[0,6],[1,2],[4,10],[5,10],[9,10]}

Результат должен быть P* = {{[0,7],[0,6],[1,2]},{[4,10],[5,10],[9,10]}}, где |Р*|=2

Как называется эта проблема в литературе? Кто-нибудь может подсказать эффективный оптимальный алгоритм?

Мое текущее решение является жадным, когда я итеративно нахожу максимальные перекрывающиеся интервалы (используя подпрограмму временной сложности O (nlogn)). Для данного примера это выводит раздел P = {{[0,7],[0,6],[4,10],[5,10]},{[1,2]},{[9, 10]}} размера 3.

введите здесь описание изображения

Вместо этого попробуйте задать вопрос на Stack Overflow на русском.

Lover of Structure 10.06.2023 14:11

Я бы назвал эту проблему «разделение клики »: I_i — это вершины в графе, и вы хотите разделить граф на клики. Кроме того, это интервальный график, который значительно упрощает задачу.

Stef 10.06.2023 15:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

I_i образуют граф. Этот граф является интервальным графом , что означает, что легко найти совершенный порядок исключения его вершин.

Возьмем самый левый интервал I, т.е. интервал [a, b] с наименьшим b. Убедите себя, что для любых двух других интервалов J и K, если J и K пересекаются с I, то J и K также пересекаются друг с другом. Таким образом, множество, состоящее из I, а также каждый интервал, который пересекает I, является кликой и может быть первым множеством вашего разбиения.

Удалите интервалы из этого первого набора, затем повторите процедуру, чтобы получить другие наборы.

Спасибо за терминологию и ссылки. Мне нравится "кликовый раздел". Я согласен со свойством, которое вы утверждаете для I,J,K, принадлежащих одной и той же клике P_i.

J. M. Aziz 10.06.2023 17:27

Если я хорошо понимаю. То, что вы предлагаете, является жадным решением, подобным тому, которое я предложил, но принятие идеального порядка исключения позволяет использовать подпрограмму O (n).

J. M. Aziz 10.06.2023 17:28

@ JMAziz Да, это «жадно, но в правильном порядке», поэтому на самом деле возвращает оптимальное решение. На самом деле многие задачи можно решить таким образом для графов с идеальным порядком исключения.

Stef 10.06.2023 19:48

@ JMAziz Обратите внимание, что мы с MattTimmermans описываем один и тот же алгоритм, только разными словами.

Stef 10.06.2023 19:51

На самом деле, я посмотрел на ваш, прежде чем писать, но вы говорите «возьмите интервал [a,b] с наименьшим a», тогда как я говорю, возьмите интервал с наименьшим b. Если взять наименьшее a, ваше следующее предложение станет неверным, например, [ [ ] [ ] ] Я думаю, это была небольшая ошибка, но не было ясно, правильно ли то, что вы имели в виду в целом.

Matt Timmermans 11.06.2023 03:31

да, он должен был быть самым маленьким b. Я думал, вы доказываете, что каждое разбиение является кликой в ​​интервальном графе. Не видел, чтобы вы предлагали тот же алгоритм, что и Мэтт:/

J. M. Aziz 11.06.2023 12:48

Действительно! Самый маленький б.

Stef 12.06.2023 12:45
Ответ принят как подходящий
  1. Найдите интервал с наименьшей конечной точкой. Некоторое подмножество должно включать этот интервал
  2. Создайте подмножество с выбранным интервалом и всеми интервалами, которые начинаются до этой наименьшей конечной точки. Все они пересекаются друг с другом, поскольку все они включают интервал непосредственно перед этой наименьшей конечной точкой. Кроме того, любой интервал, который начинается позже, не перекрывается с выбранным и не может быть включен в то же подмножество.
  3. Повторяйте, пока не закончатся интервалы.

Обычно вы начинаете с сортировки интервалов по конечной точке, что делает все это быстрым и легким.

просто и легко. Спасибо.

J. M. Aziz 10.06.2023 17:34

Другие вопросы по теме