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

Рассмотрим вопрос, чтобы найти минимальное доминирующее множество интервального графа. В контексте интервального планирования он преобразуется в следующий вопрос:

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

Существует согласованное жадное решение, доступное из различных источников в Интернете, например одно решение от Корнелла: http://www.cs.cornell.edu/Courses/cs4820/2011sp/handouts/samplesolutions.pdf

Мы работаем, чтобы заполнить набор C, который составляет комитет (подмножество интервалов). Мы используем набор M для удержания «покрытых» интервалов в бухгалтерском учете.

  1. Отсортируйте интервалы по времени окончания, начиная с самого раннего времени окончания.
  2. Возьмите интервал i в S с самым ранним временем финиша.
  3. Построить множество O = {s ∈ S | s пересекает i}
  4. Возьмем o ∈ O с самым поздним временем окончания и прибавим o к C, добавим все интервалы, которые пересекаются с o, к M
  5. повторить 2-4, пока не будут покрыты все интервалы.

Это похоже на проголосованный ответ, предоставленный interjay в 2012 году на SO: Найдите наименьший набор перекрывающихся заданий

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

Рассмотрим интервалы: [0,2], [1,4], [3,10], [5, 6], [7,8], [9, 10].

Минимальное подмножество должно иметь 2 интервала: [3, 10] плюс либо [0, 2], либо [1, 4].

Но приведенное выше решение вернет подмножество из 4 интервалов: [1,4], [5,6], [7,8] и [9,10]. Самый длинный интервал [3,10] был преждевременно отклонен на этапе 4.

Есть ли более жадное решение, чем приведенные выше? Спасибо!


person Feixi    schedule 02.10.2014    source источник


Ответы (1)


Алгоритм, который вы указали, неверен, потому что набор S никогда не изменяется, поэтому на шаге 2 всегда будет выбран один и тот же интервал, и вы войдете в бесконечный цикл. Если вы измените шаг 2 на «Возьмите интервал i в S-M с самым ранним временем финиша», это будет правильно.

Однако мой ответ, на который вы указали ссылку, правильный. И он, и исправленный алгоритм выше дадут набор {[1,4], [3,10]} для вашего примера.

Ошибка, которую вы делаете, может заключаться в том, что на шаге 3 выше (или шаге 2 в моем связанном ответе) вы смотрите только на наборы, которые находятся в S-M (в моем ответе они называются A). Но вы должны смотреть на все интервалы, которые пересекают i, даже если они уже находятся в M.

person interjay    schedule 02.10.2014
comment
Спасибо за разъяснения, интерджей! Из-за того, что у меня очень мало очков репутации, я не смог напрямую прокомментировать ваш ответ по ссылке, поэтому я открыл здесь новый вопрос. Я выбрал ваш ответ здесь как правильный, но не смог проголосовать также из-за отсутствия очков репутации. ржу не могу. Лучший! - person Feixi; 03.10.2014