Хобрук: Ваш путь к мастерству в программировании

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

Скажем, у меня есть список из n целых интервалов [a,b], каждый из которых представляет набор S = {a, a+1, ...b}. Перекрытие определяется как |S_1 \cap S_2|. Пример: [3,6] и [5,9] перекрываются с [5,6], поэтому его длина равна 2. Задача состоит в том, чтобы найти два интервала с самым длинным перекрытием в Little-O(n^2), используя только рекурсия и не динамическое программирование.

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

Я просто не могу найти способ разделить его на подзадачи. Любые идеи были бы хорошы.

Также нашел это, что, по моему мнению, вообще не работает:

Поиск «максимальной» пары перекрывающихся интервалов в O(nlog(n))


  • Если вопрос заключается в поиске алгоритма, а не в его реализации, возможно, лучше подойдет Информатика? (но помните не делайте кросспост и прочитайте их справочный центр, прежде чем спрашивать) 12.04.2018
  • Просто сказать, что, по моему мнению, это вообще не работает, не оправдывает того, что это на самом деле не работает. Вам нужно объяснить, почему это не работает и почему ваш вопрос не дублируется. 12.04.2018
  • Перебор будет выполняться за O (n ^ 2), поэтому он должен соответствовать требованиям задачи. 12.04.2018
  • @ Mitchel0022, пожалуйста, обратите внимание на разницу между обозначениями Little-O и Big-O. 12.04.2018

Ответы:


1

Вот подход, который занимает N log(N) времени.

Разбейте каждый интервал [a,b] [c,d] на массив пар следующим образом:

pair<a,-1>
pair<b,a>
pair<c,-1>
pair<d,c>

sort these pairs in increasing order. Since interval starts are marked as -1, in case of ties interval they should come ahead of interval ends.

for i = 0 to end of the pair array
    if current pair represents interval start
        put it in a multiset
    else
        remove the interval start corresponding to this interval end from the multiset.
        if the multiset is not empty
            update the maxOverlap with (current_interval_end - max(minimum_value_in_multiset,start_value_of_current_interval)+1)

Этот подход должен обновить maxOverlap до максимально возможного значения.

12.04.2018

2

Сохраняйте информацию о двух самых больших перекрывающихся интервалах max1 и max2 (вначале пустых).

Отсортируйте входной список [x1, y1] .. [xn, yn] = I1..In по значению x, отбрасывая более короткий из двух интервалов, если встречается равенство. Выбрасывая интервалы, обновляйте max1 и max2.

Для каждого интервала добавьте атрибут max в линейном времени, показывающий наибольшее значение y из всех предыдущих интервалов (в отсортированном списке):

rollmax = −∞
for j = 1..n do
  Ij.max = rollmax
  rollmax = max(rollmax, Ij.y)

В отсортированном, отфильтрованном и расширенном списке ввода выполните следующий запрос. Он использует постоянно расширяющийся подсписок интервалов, меньших, чем искомый в настоящее время интервал Ii, в качестве входных данных для рекурсивной функции SearchOverlap.

for i = 2..n do
  SearchOverlap(Ii, 1, i − 1)
return {max1, max2}

Функция SearchOverlap использует подход divide and conquer для обхода отсортированного списка Il, .. Ir. Он представляет такой список как полное бинарное дерево с интервалом Ic в качестве его локального корня. Тест Ic.max < I.max используется, чтобы всегда принимать решение об обходе бинарного дерева (идти влево/вправо) в направлении интервала с наибольшим перекрытием с I. Обратите внимание, что I — это запрошенный интервал, который сравнивается с log(n) другими интервалами. Также обратите внимание, что при таком обходе может быть пройден максимально возможный интервал перекрытия, отсюда и проверка на наибольшее перекрытие в начале функции SearchOverlap.

SearchOverlap(I , l, r)
c = ceil(Avg(l, r)) // Central element of queried list
if Overlap(max1, max2) < Overlap(I , Ic) then
  max1 = I
  max2 = Ic
if l ≥ r then
  return
if Ic.max < I.max then
  SearchOverlap(I , c + 1, r)
else
  SearchOverlap(I , l, c − 1)
return

Наибольшие перекрывающиеся интервалы (если они не пустые) возвращаются в конце. Общая сложность O(n log(n)).

15.04.2018
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

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

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.