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

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

Операции по последовательности

Обработка документов быстро становится одной из доминирующих функций com-коротких клюшек для гольфа. Компьютеры используются, чтобы отредактировать документы, искать документы, транспортировать документы по Интернету и показать документы о принтерах и мониторах. Например, интернет-документ форматирует HTML, и XML - pri-marily текстовые форматы с добавленными признаками для мультимедийного содержания. Понимание многих терабайт информации в Интернете требует значительной суммы текстовой обработки.

В дополнение к наличию интересных заявлений текст, обрабатывающий алгоритмы также, выдвигает на первый план некоторые важные алгоритмические шаблоны. В частности проблема соответствия образца дает начало методу «в лоб», который часто неэффективен, но имеет широкую применимость. Для текстового сжатия мы можем применить жадный метод, который часто позволяет нам приближать решения тяжелых проблем, и для некоторых проблем (такой как в текстовом сжатии) фактически дает начало оптимальным алгоритмам. Наконец, в обсуждении текстового подобия, мы вводим динамическое программирование de - образец знака, который может быть применен в некоторых специальных случаях, чтобы решить проблему в многочленное время, которое, кажется, сначала требует, чтобы показательное время решило.

Текстовая обработка

В основе алгоритмов для обработки текста методы для контакта с charac-, трижды натягивает. Строки символов могут прибыть из большого разнообразия источников, включая научные, лингвистические, и интернет-приложения. Действительно, следующее примеры таких последовательностей:

P = «CGTAAACTGCTTTAATCAAACGC» S = «http://www .wiley.com».

Первая последовательность, P, прибывает из приложений ДНК, и вторая последовательность, S, является интернет-адресом (URL) для издателя этой книги.

Несколько из типичных операций по обработке последовательности включают ломающиеся большие последовательности в меньшие последовательности. Чтобы быть в состоянии говорить о частях, которые следуют из таких операций, мы используем термин подстрока m-строки-символов P, чтобы относиться к a

последовательность формы P [я] P [я + 1] P [я + 2] P [j],приблизительно за £ £0 ij£ m- 1, то есть,

последовательность, сформированная знаками в P от индекса i до индекса j, включительно. Технически,

это означает, что последовательность - фактически подстрока себя (взятие i = 0 и j = m- 1),

таким образом, если мы хотим исключить это как возможность, мы должны ограничить определение

надлежащие подстроки, которые требуют что или i> 0 или j <m- 1.

12.1. Операции по последовательности 555

Чтобы упростить примечание для обращения к подстрокам, давайте использовать P [я.. j] обозначить

подстрока P от индекса i до индекса j, включительно. Таким образом,

P [я.. j] = P [я] P [я + 1] P [j].

Мы используем соглашение что если i> j, то P [я.. j] равно пустой строке, у которой есть длина 0. Кроме того, чтобы отличить некоторые специальные виды подстрок,

давайте обратимся к любой подстроке формы P [0.. i], за£ £0 im- 1, как префикс P,

и любая подстрока формы P [я.. m- 1], за£ £0 im- 1, как суффикс P. Для

примером, если мы снова берем P, чтобы быть последовательностью ДНК, данной выше, тогда «CGTAA», является a

префикс P, «CGC» - суффикс P, и «TTAATC» - (надлежащая) подстрока P. Обратите внимание на то, что пустая строка - префикс и суффикс любой другой последовательности.

Чтобы допускать довольно общие понятия строки символов, мы, как правило, не ограничиваем знаки в T и P, чтобы явно прибыть из известной кодировки, как кодировки ASCII или Unicode. Вместо этого мы, как правило, используем символ S, чтобы обозначить кодировку или алфавит, из которого могут произойти знаки. Так как большинство алгоритмов обработки документов используется в заявлениях, где underly-кодировка луга конечна, мы обычно предполагаем что размералфавита S, обозначенного

с|S , фиксированная константа.

12.1.1 Класс последовательности STL

Вспомните из Главы 1, что C ++ поддерживает два типа последовательностей. Последовательность C-стиля

просто множество случайной работы типа, законченной пустым характером '\0'. Собой последовательности стиля C-не поддерживают сложные операции по последовательности. C ++ Standard Template Library (STL) обеспечивает полный класс последовательности. Этот класс поддерживает изумительное число операций по последовательности. Мы перечисляем всего несколько из них. В следующем позвольте S обозначить объект последовательности STL, на котором выполняется операция, и позвольте Q обозначить другую последовательность STL или последовательность C-стиля.

размер (): Возвратите число знаков, n, S.

пустой (): Возвратитесь верный, если последовательность пустая и ложная иначе.

оператор [я]: Возвратите характер в индексе i S без выполнения

выстройте проверку границ.

в (i): Возвратите характер в индексе i S. Из диапазона

исключение брошено, если я выхожу за пределы.

вставка (я, Q): последовательность Вставки Q до индекса i в S и возвращении ссылка

к результату.

приложите (Q): Приложите последовательность Q до конца S и возвратите ссылку на

результат.

сотрите (я, m): Удалите m знаки, начинающие в индексе i, и возвратитесь касательно -

erence к результату.

556