Эффективная вставка в список с минимальным количеством инверсий


15

Предположим, два списка сопоставимых предметов: и и с. Пусть INV (u) будет числом инверсий в u.

Я ищу эффективный алгоритм для вставки элементов s в вас с минимальным увеличением INV (u).

По сути, я хотел бы вставлять объекты в список, сохраняя его «как можно более отсортированным», сохраняя порядок первого списка.

Пример:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

Как видите, единственного оптимального решения не существует.

Я был бы рад за любые идеи или направления для изучения.


Пища для размышления: Наивный подход будет следующим: возьмите один элемент из s, сравните его с каждым элементом в u слева направо, увеличьте, если это инверсия, и перенесите ранее вычисленное число. Затем пройдитесь по списку справа налево с тем же элементом, увеличивая количество для каждой позиции. Это выполняется в O (| s | * | u |) с пробелом = O (| u |)
trevore

1
Проверка всех максимально увеличивающихся подпоследовательностей может куда-то привести.
Рафаэль

Ответы:


2

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

Вы можете показать, что в любом оптимальном решении элементы будут выглядеть упорядоченными. sЕсли нет, предположим, что и они появляются в обратном порядке в оптимальном решении. Пусть σ 1 будет количеством элементов между s 1 и s 2 , которые меньше s 1, а β 1 будет количеством элементов, которые больше s 1 . Определите σ 2 и β 2 аналогично для s 2 . Обратите внимание, что σ 1s1<s2σ1s1s2s1β1s1σ2β2s2 и β 2β 1 . Замена s 1 и s 2 изменит количество инверсий на - β 1 + β 2 - σ 2 + σ 1 - 1, что не более -1.σ1σ2β2β1s1s2β1+β2σ2+σ11

Нетрудно видеть, что элементы могут быть вставлены независимо. sПоскольку они кажутся упорядоченными, элементы не «чувствуют» присутствие друг друга. То есть пары элементов из s не влияют на счет инверсии. Для этого оптимально вставьте медиану s в линейное время. Затем, рекурсивно, вставьте элементы s меньше медианы слева от медианы и элементы больше медианы справа.ssss

Пусть медиана будет вставлена ​​в позицию , время выполнения которой удовлетворяет, T ( | s | , | u | ) = T ( | s | / 2 , | u | - k ) + T ( | s | / 2 , k ) + | ты | + | с | линейный | с |kT(|s|,|u|)=T(|s|/2,|u|k)+T(|s|/2,k)+|u|+|s||s|фактор для нахождения медианы и перемешивания элементов . По индукции легко показать, что T ( | s | , | u | ) = O ( | s | log | s | + | u | log | s | ) .sT(|s|,|u|)=O(|s|log|s|+|u|log|s|)

Обратите внимание, что зависимость от здесь оптимально. Поскольку решение проблемы с пустым u эквивалентно сортировке s с использованием только сравнений. Зависимость от | ты | также оптимально, поскольку задача для одноэлементного списка s и списка u должна требовать линейной работы.|s|us|u|su


Спасибо за разработку. Это именно то решение, которое я имел в виду.
Trevore

1

Хорошо, вот мое решение:

Наблюдение (которое я более или менее доказал) состоит в том, что оптимальным решением всегда будет решение, в котором s отсортировано по возрастанию. Это приводит к алгоритму O ((| u | + | s |) * log (| s |)).

Чтобы найти оптимальное решение для одного элемента, сделайте, как я уже сказал в моем комментарии: возьмите один элемент из s, сравните его с каждым элементом в u слева направо, увеличьте счетчик в обратном порядке и перенесите ранее вычисленное число. Затем пройдитесь по списку справа налево с тем же элементом, увеличивая количество для каждой позиции.

Это O (| u |).

Сортировка

Для среднего элемента s в позиции m: найдите лучшую позицию b в u (используя метод сверху).

Разделите s на m и u на b и рекурсивно вызовите с левой и правой частями, объединяя результаты с m в правильном порядке.

Остановитесь, как только вы или s опустеете.


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

Да, но в любом оптимальном решении элементы s всегда будут сортироваться по возрастанию в новом массиве. Обратите внимание на шаг "Sort s." Смотрите пример выше. До сих пор я доказал, что: для a, b в s, a <b, если a оптимально размещено в u, то оптимальное место для b находится справа от a.
Тревор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.