Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 12. Последовательности и динамическое программирование

12.2.2 ДНК и текстовое выравнивание последовательности

Общий текст, обрабатывающий проблему, которая возникает в генетике и программном обеспечении engi-

приближение, должен проверить подобие между двумя текстовыми строками. В применении генетики две последовательности могли соответствовать двум берегам ДНК, которую мы хотим сравнить. Аналогично, в применении программирования, две последовательности могли прибыть из двух версий исходного кода для той же самой программы. Мы могли бы хотеть сравнить эти две версии, чтобы определить то, какие изменения были внесены от одной версии до следующего. Действительно, определение подобия между двумя последовательностями так распространено, что у Unix и операционных систем Linux есть встроенная программа, разность, для сравнения текстовых файлов.

Учитывая последовательность X = x0x1x2 ∙ ∙ ∙ xn-1, подпоследовательность X является любой последовательностью, которая имеет

xi1 xi2 ∙ ∙ ∙ xik формы, где я j <я j+1; то есть, это - последовательность знаков, которые являются

не обязательно смежный, но тем не менее взяты в заказе от X. Например,

последовательность AAAG является подпоследовательностью последовательности БЕССМЫСЛЕННЫЙ CGATAATT.

Проблемой подобия ДНК и текста, которой мы обращаемся здесь, является проблема самой длинной общей подпоследовательности (LCS). В этой проблеме нам дают две строки символов,

X = x0x1x2 ∙ ∙ ∙ xn-1 и Y = y0y1y2 ∙ ∙ ∙ ym-1, по некоторому алфавиту (такому как альфа -

ставкаA, C, G, T распространенный в вычислительной генетике), и попросились найти самое длинное

натяните S, который является подпоследовательностью и X и Y. Один способ решить самое длинное

общая проблема подпоследовательности состоит в том, чтобы перечислить все подпоследовательности X и взять самую большую, которая является также подпоследовательностью Y. Так как каждый характер X или в или не в подпоследовательности, есть потенциально 2n различные подпоследовательности X, каждый из которых требует, чтобы O (m) время определил, является ли это подпоследовательностью Y. Таким образом этот подход «в лоб» приводит к показательно-разовому алгоритму, который управляет в O (2 нм) временем, которое очень неэффективно. К счастью, проблема LCS - эффективно разрешимое использующее динамическое программирование.

Компоненты динамического программного решения

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

проблемы оптимизации, где мы хотим найти «лучший» способ сделать что-то. Мы можем применить динамический программный метод в таких ситуациях, если у проблемы есть определенные свойства. Простые подпроблемы: должен быть некоторый способ повторной ломки глобального -

проблема оптимизации в подпроблемы. Кроме того, должен быть простой способ определить подпроблемы со всего несколькими индексами, как я, j, k, и так далее.

Оптимизация подзадач: оптимальное решение глобальной проблемы должно быть a

состав оптимальных подпроблемных решений.

Подпроблемное Наложение: Оптимальные решения несвязанных подпроблем могут содержать

подпроблемы вместе.