Лучшие вопросы
Таймлайн
Чат
Перспективы
Наибольшая общая подпоследовательность
Из Википедии, свободной энциклопедии
Remove ads
Задача нахождения наибольшей общей подпоследовательности (англ. longest common subsequence, LCS) — задача поиска последовательности, которая является подпоследовательностью нескольких последовательностей (обычно двух). Часто задача определяется как поиск всех наибольших подпоследовательностей. Это классическая задача информатики, которая имеет приложения, в частности, в задаче сравнения текстовых файлов (утилита diff), а также в биоинформатике.
Подпоследовательность можно получить из некоторой конечной последовательности, если удалить из последней некоторое множество её элементов (возможно пустое). Например, BCDB является подпоследовательностью последовательности ABCDBAB. Будем говорить, что последовательность Z является общей подпоследовательностью последовательностей X и Y, если Z является подпоследовательностью как X, так и Y. Требуется для двух последовательностей X и Y найти общую подпоследовательность наибольшей длины. Заметим, что НОП может быть несколько.
Обратите внимание! Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность "ABCDEF", то "ACE" будет подпоследовательностью, но не подстрокой, а "ABC" будет как подпоследовательностью, так и подстрокой.
Remove ads
Решение задачи
Суммиров вкратце
Перспектива
Сравним два метода решения: полный перебор и динамическое программирование.
Полный перебор
Существуют разные подходы при решении данной задачи при полном переборе — можно перебирать варианты подпоследовательности, варианты вычеркивания из данных последовательностей и т. д. Однако в любом случае, время работы программы будет экспонентой от длины строки.
Метод динамического программирования
Вначале найдём длину наибольшей подпоследовательности. Допустим, мы ищем решение для случая (n1, n2), где n1, n2 — длины первой и второй строк. Пусть уже существуют решения для всех подзадач (m1, m2), меньших заданной. Тогда задача (n1, n2) сводится к меньшим подзадачам следующим образом:
Теперь вернемся к задаче построения подпоследовательности. Для этого в существующий алгоритм добавим запоминание для каждой задачи той подзадачи, через которую она решается. Следующим действием, начиная с последнего элемента, поднимаемся к началу по направлениям, заданным первым алгоритмом, и записываем символы в каждой позиции. Это и будет ответом в данной задаче.
Время работы алгоритма будет .
Remove ads
См. также
- Алгоритмы на строках
- Наибольшая общая подстрока
Ссылки
- Нахождение наибольшей общей подпоследовательности . algolist.ru. Дата обращения: 15 августа 2013. Архивировано 24 августа 2013 года.
- Алгоритм поиска длины наибольшей общей подпоследовательности . coders.ask-ru.net.
![]() | В статье не хватает ссылок на источники (см. рекомендации по поиску). |
![]() | В другом языковом разделе есть более полная статья Longest common subsequence problem (англ.). |
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads