Задача о наименьшей суперпоследовательности — различия между версиями
Motyaspr (обсуждение | вклад) (→Псевдокод) |
|||
Строка 1: | Строка 1: | ||
+ | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;" | ||
+ | |+ | ||
+ | |-align="center" | ||
+ | |'''НЕТ ВОЙНЕ''' | ||
+ | |-style="font-size: 16px;" | ||
+ | | | ||
+ | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. | ||
+ | |||
+ | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. | ||
+ | |||
+ | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. | ||
+ | |||
+ | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. | ||
+ | |||
+ | ''Антивоенный комитет России'' | ||
+ | |-style="font-size: 16px;" | ||
+ | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. | ||
+ | |-style="font-size: 16px;" | ||
+ | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки]. | ||
+ | |} | ||
+ | |||
{{Определение | {{Определение | ||
|definition= | |definition= |
Версия 07:05, 1 сентября 2022
НЕТ ВОЙНЕ |
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Определение: |
Последовательность | является суперпоследовательностью (англ. supersequence) последовательности , если — подпоследовательность , то есть существует строго возрастающая последовательность индексов таких, что для всех выполняется соотношение , при этом .
Определение: |
Последовательность | является общей суперпоследовательностью (англ. common supersequence) последовательностей и , если является суперпоследовательностью как для , так для и .
Задача: |
Пусть имеются последовательности | и . Необходимо найти , где — длина наименьшей общей суперпоследовательности последовательностей и
Содержание
Наивное решение
Пусть даны две последовательности длин
и соответственно. Заметим, что если приписать к одной из данных последовательностей другую, то полученная последовательность будет их суперпоследовательностью с длиной . Запомним все элементы обеих последовательностей и из них построим все возможные последовательности. Тогда искомая гарантированно найдётся, однако время работы алгоритма будет экспоненциально зависеть от длин исходных последовательностей.Динамическое программирование
Решение
Обозначим за
длину наименьшей общей суперпоследовательности для префиксов данных последовательностей и , заканчивающихся в элементах с номерами и соответственно. Будем считать ответ методом динамического программирования на префиксе. Наименьшая общая суперпоследовательность и должна содержать каждый символ обеих последовательностей, поэтому если , то это просто последовательность . Аналогичен случай, когда . Если и , то возможны два случая. Если , то должна включать оба этих элемента. Значит нужно выбрать минимальный из ответов для префиксов, включающих один элемент и не включающих второй, а именно минимум из ответов для меньших подзадач: и . Если же , то для последовательностей и должна заканчиваться этим элементом, так как он общий для них. Поэтому в этом случае . Получается следующее рекуррентное соотношение:
Cложность алгоритма составит
, где и — длины последовательностей.Восстановление ответа
Для восстановления ответа заведем массив
, где будет равняться:
По этим данным можно узнать, какой символ был добавлен в наименьшую общую суперпоследовательность.
Псевдокод
— данные последовательности; — для префикса длины последовательности и префикса длины последовательности ; — массив для восстановления ответа.
// Подсчет динамики fun SCS(x: int[], y: int[]): n = x.size m = y.size // инициализация массивов динамики scs = int[][] pref = int[][] // случай равенства одного из индексов 0 for i = 0 to n scs[i][0] = i for j = 0 to m scs[0][j] = j for i = 1 to n for j = 1 to m // случай равенства элементов if x[i] == y[j] scs[i][j] = 1 + scs[i - 1][j - 1] prev[i][j] = 1 else // случай неравенства элементов if scs[i - 1][j] > scs[i][j - 1] scs[i][j] = 1 + scs[i][j - 1] prev[i][j] = 2 else scs[i][j] = 1 + scs[i - 1][j] prev[i][j] = 3
// вывод SCS fun printSCS(n: int, m: int): i = n j = m ans = [] // массив ответа while i > 0 and j > 0 if prev[i][j] == 1 ans.append(x[i]) i -= 1 j -= 1 else if prev[i][j] == 2 ans.append(y[j]) j -= 1 else ans.append(x[i]) i -= 1 // добавляем оставшиеся символы первой последовательности while i > 0 ans.append(x[i]) i -= 1 // добавляем оставшиеся символы второй последовательности while j > 0 ans.append(y[j]) j -= 1 reverse(ans) // разворачиваем последовательность, так как шли с конца return ans
Связь с наибольшей общей подпоследовательностью
Теорема: |
наибольшей общей подпоследовательности, — длина наименьшей общей суперпоследовательности, и — длины последовательностей и соответственно. , где — длина |
Доказательство: |
Пусть Поэтому: , . Обозначим за их и будем ее строить. Так как являетcя суперпоследовательностью , то можно представить так: Мы должны на место некоторых пропусков поставить элементы , так чтобы суммарная длина была минимальна, и являлась суперпоследовательностью . Рассмотрим любую общую подпоследовательность и . Заметим, что она уже находятся в , а значит все её элементы не нужно добавлять. Поэтому мы добавим не меньше, чем . Длину нужно минимизировать, значит имеет место равенство: . |