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

12.2. Динамическое программирование 563

Алгоритм LCS (Кодовый Фрагмент 12.2) вычисляет длину самой длинной com-подпоследовательности в понедельник (сохраненный в L [n- 1, m- 1]), но не самой подпоследовательности. Как

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

самая длинная общая подпоследовательность от множества L возвращенный алгоритмом.

Суждение 12.3: Учитывая последовательность X из n знаков и последовательности Y m знаков, мы можем найти самую длинную общую подпоследовательность X и Y в O (nm) время.

Оправдание: Алгоритм LCS вычисляет L [n- 1, m- 1], длина самого длинного

общая подпоследовательность, в O (nm) время. Учитывая стол L [я, j] ценности, конструкция -

луг самая длинная общая подпоследовательность прямой. Один метод должен начаться с L [n, m] и работать назад через стол, восстанавливая самое длинное общее под - последовательность от наоборот. В любом положении L [я, j], мы можем определить ли xi = y j. Если это верно, то мы можем взять xi в качестве следующего характера subse-айвы (замечание, что xi перед предыдущим характером мы нашли, если таковые имеются), перемещаясь

рядом с L [я- 1, j- 1]. Если xi = y j, то мы можем переместить в больший из L [меня, j- 1] и

L [я- 1, j]. (См. рисунок 12.2.) Мы останавливаемся, когда мы достигаем граничной клетки (со мной =-1 или j =-1). Этот метод строит самую длинную общую подпоследовательность в O (n + m)

дополнительное время.

Рисунок 12.2: алгоритм для строительства самой длинной общей подпоследовательности от множества L.

564

12.3

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

Алгоритмы соответствия образца

В классической проблеме соответствия образца на последовательностях нам дают текстовую строку T длины n, и образец натягивают P длины m и хотят найти, является ли P подстрокой T. Понятие «матча» - то, что есть подстрока T, начинающегося в некотором индексе i, который соответствует P, характеру характером, так, чтобы T [я] = P [0], T [я + 1] = P[1],

..., T [я + m- 1] = P [m- 1]. Таким образом, P = T [я.. я + m- 1]. Таким образом, продукция от

алгоритм соответствия образца мог или быть некоторым признаком что образец P

не существует в T или целом числе, указывающем на стартовый индекс в T подстроки, соответствующей P. Это - точно вычисление, выполненное функцией находки интерфейса последовательности STL. Альтернативно, можно хотеть найти все индексы, где подстрока T соответствие P начинается.

В этой секции мы представляем три алгоритма соответствия образца (с увеличивающимися уровнями трудности).

12.3.1 Грубая сила

Алгоритмический шаблон «в лоб» - сильная техника для алгоритма

проектируйте, когда у нас есть что-то, что мы хотим искать или когда мы желаем к opti-mize некоторой функции. В применении этой техники в общей ситуации мы, как правило, перечисляем все возможные конфигурации включенных входов и выбираем лучшую из всех этих перечисленных конфигураций.

В применении этой техники, чтобы проектировать образец «в лоб», соответствующий algo-rithm, мы получаем то, что является, вероятно, первым алгоритмом, о котором мы могли бы думать для решения проблемы соответствия образца - мы просто проверяем все возможные размещения P относительно T. Этот алгоритм, показанный в Кодовом Фрагменте 12.3, довольно прост.

Алгоритм BruteForceMatch (T, P):

Вход: Последовательности T (текст) с n знаками и P (образец) с m Продукцией знаков: Стартовый индекс первой подстроки T соответствие P или признак

это P не является подстрокой T

поскольку я¬ 0 к n- mдля каждого индекса кандидата в T делаю

j¬0

в то время как (j <m и T [я + j] = P [j]) делают

j¬ j+1

если j = m тогда

возвратитесь i

возвратитесь «Нет никакой подстроки T соответствия P.»

Кодовый Фрагмент 12.3: соответствие образца «в лоб».