Система Orphus

Методы и алгоритмы вычислений на строках

Автор: Билл Смит
Издательство: Вильямс, 2006
496 страниц

Материал предоставил: Издательство ''Вильямс''
Найти в магазинах
Купить в Озоне (726 руб.)
Купить в Болеро (557 руб.)
Купить в OZ.by (Беларусь)
Купить в My-Shop.ru (634 руб.)

Аннотация

Содержание
Предисловие

Аннотация

Книга "Методы и алгоритмы вычислений на строках" описывает фундаментальные алгоритмы лежащие в основе построения эффективных вычислительных паттернов(шаблонов) над строковыми последовательностями. Это общие алгоритмы и методы, которые находят применение во многих областях науки и информационных технологий: сжатие данных, криптография, распознавание речи и компьютерное зрение, вычислительная геометрия и молекулярная биология. Рассмотренные в книге алгоритмы предназначены для нахождения в строковых последовательностях определенных типов паттернов - частных, характеристических и внутренних. Каждому типу паттернов посвящена соответствующая часть книги. Книга отличается последовательным изложением материала, большим количеством иллюстративных примеров, свободным обсуждением текущих исследований в этой области, содержит более 500 упражнений, поясняющих и расширяющих материал, изложенный в тексте книги "Методы и алгоритмы вычислений на строках". Книга предназначена для тех, кто имеет достаточную подготовку в математике и компьютерных науках и хочет познакомиться с этой интересной и важной областью. Материал книги "Методы и алгоритмы вычислений на строках" доступный для студентов старших курсов и аспирантов соответствующих специальностей.

Содержание

Предисловие

Часть I. Строковые последовательности и алгоритмы

Глава 1. Свойства строковых последовательностей

1.1 Последовательность жемчужин
1.2 Линейные строковые последовательности
1.3 Периодичность
1.4 Строковые петли

Глава 2. Паттерны? Что такое паттерны?

2.1 Внутренние паттерны
2.2 Частные паттерны
2.3 Характеристические паттерны

Глава 3. Такие разные строки

3.1 Проблема исключений и морфизмы
3.2 Строки Туе, являющиеся (2, 3)-исключениями
3.3 Строки Туе, являющиеся (3, 2)-исключениями
3.4 Строки Фибоначчи

Глава 4. Строковые алгоритмы и тестовые данные

4.1 Хорошие строковые алгоритмы
4.2 Разные паттерны
4.3 Разные грани

Часть II. Вычисление внутренних паттернов

Глава 5. Деревья для строковых последовательностей

5.1 Деревья граней
5.2 Деревья суффиксов
5.2.1 Предварительные сведения о деревьях суффиксов
5.2.2 Алгоритм Мак-Крейта
5.2.3 Алгоритм Укконена
5.2.4 Алгоритм Фарача
5.2.5 Применение и реализация
5.3 Альтернативные структуры для представления суффиксов
5.3.1 Ориентированные ациклические графы слов
5.3.2 Массивы суффиксов

Глава 6. Декомпозиция строковых последовательностей

6.1 Линдонская декомпозиция: алгоритм Дюваля
6.2 Применения линдонской декомпозиции
6.3 s-факторизация

Часть III. Вычисление частных паттернов

Глава 7. Базовые алгоритмы

7.1 Алгоритм Кнута-Морриса-Пратта
7.2 Алгоритм Бойера-Мура
7.3 Алгоритм Карпа-Рабина
7.4 Алгоритм Демелки-Бейза-Ятса-Гоннета
7.5 Заключение

Глава 8. Наследники Бойера-Мура

8.1 Алгоритм БМ - цикл с перескоками
8.2 Алгоритм Бойера-Мура-Хоспула
8.3 Частота встречаемости букв и алгоритмы Бойера-Мура-Санди
8.3.1 Сравнение со стражем
8.3.2 Наиболее эффективные перескоки
8.3.3 Первый алгоритм Бойера-Мура-Санди
8.3.4 Второй алгоритм Бойера-Мура-Санди
8.4 Алгоритм Бойера-Мура-Гелила
8.5 Алгоритм Турбо-БМ
8.6 Наследники алгоритма КМП
8.7 Создайте собственный алгоритм!
8.8 Точные оценки сложности алгоритмов точного сравнения с паттерном

Глава 9. Алгоритмы вычисления расстояния между строками

9.1 Базисная рекурсия
9.2 Алгоритм Вагнера-Фишера
9.3 Алгоритмы Хешберга
9.4 Алгоритм Ханта-Шиманского
9.5 Алгоритм Укконена-Майерса
9.6 Заключение

Глава 10. Приближенное сравнение с паттерном

10.1 Алгоритм для произвольной функции расстояния
10.2 Алгоритм, вычисляющий несовпадения
10.3 Алгоритмы, вычисляющие разности
10.3.1 Алгоритм Укконена
10.3.2 Алгоритм Майерса
10.4 Быстрый и гибкий алгоритм Ву и Менбера
10.5 Сложность алгоритмов приближенного сравнения с паттерном

Глава 11. Регулярные выражения и множественные паттерны

11.1 Алгоритмы для регулярных выражений
11.1.1 Недетерминированные конечные автоматы
11.1.2 Детерминированные конечные автоматы
11.1.3 Модификация алгоритма ВМ
11.2 Алгоритмы сравнения с множественными паттернами
11.2.1 Автомат Ахо-Корасика: модификация алгоритма КМП
11.2.2 Автомат Комменца-Вальтера: модификация алгоритма БМ
11.2.3 Аппроксимирующие паттерны: модификация алгоритма ВМ
11.2.4 Аппроксимирующие паттерны: алгоритм Бейза-Ятса-Наварро

Часть IV. Вычисление характеристических паттернов

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

12.1 Все кратные строки
12.1.1 Алгоритм Крочемора
12.1.2 Алгоритм Мейна и Лоренца
12.2 Серии
12.2.1 Крайние левые серии - алгоритм Мейна
12.2.2 Все серии - алгоритм Колпакова и Кучерова

Глава 13. Обобщение периодичности

13.1 Все оболочки - алгоритм Ли-Смита
13.2 Все раппорты - алгоритм Франека-Смита-Танга
13.2.1 Вычисление NE-дерева
13.2.2 Вычисление NE-массива
13.3 k-приближенные раппорты - алгоритм Шмидта
13.4 k-приближенные периоды - алгоритмы Сима-Илиопулоса-Парка-Смита

Литература
Предметный указатель

Предисловие

В начале было Слово,
и Слово было у Бога,
и Слово было Бог.
- Иоанн 1.1

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

В этой связи вызывает большое удивление, что академические факультеты математики или компьютерных наук в своем большинстве не включают в магистерские курсы или в курсы для аспирантов эту интересную, важную и сложную для исследований тему. Еще более удивительно, что существует всего несколько книг и обзоров, где собраны вместе и основополагающие теоретические результаты и практические алгоритмы, которые появились в последнюю четверть прошедшего столетия. Я знаю все пять книг [St94, CR94, G97, SM97, CHL01] и три объемных обзора научных статей [BY89a, A90, Nav01], содержимое которых значительно перекрывает материал данной книги. Обзорные статьи и книги [St94, CR94] написаны в большей мере как обобщение итогов исследования авторов, чем книги для студентов. Книги [G97, SM97] касаются, в основном, применения строковых алгоритмов в молекулярной биологии. Последняя монография [CHL01], написанная легко и элегантно, сочетает в себе как монографию, так и руководство по строковым алгоритмам. К сожалению, в настоящее время она доступна только на французском языке.

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

Основное "свойство" этой книги - сделать материал доступным для студентов старших курсов и аспирантов, имеющих специализацию по математике или компьютерным наукам и которые знакомы с дискретными структурами и алгоритмами, оперирующими этими структурами.

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

Второе условие не связано с компетентностью и подготовленностью читателя: моя цель - "соблазнить" студента и читателя интереснейшей и увлекательной областью новых знаний. Я не собирался писать энциклопедию алгоритмов, вычисляющих паттерны в строковых последовательностях. Вместе с тем я хотел представить результаты, которые (я надеюсь) важны и которые можно обобщить и расширить. Но это неизбежно ведет к тому, что некоторые интересные результаты были опущены (нельзя охватить необъятное!). Но все-таки я надеюсь, что выбранный подход к изложению материала приведет к стимулированию интереса читателя и далее к самостоятельному изучению им научной литературы.

Особым "субъектом" материала этой книги является математический объект, который в компьютерных науках называется "строка" (string) или "строковая последовательность" (в Европе и в среде математиков более распространен термин "слово"). Но основное внимание в книге уделяется алгоритмам - т.е. точным методам и процедурам, предназначенных для выполнения "чего-то". Исходя из этого данную книгу скорее можно отнести к книгам по компьютерным наукам, чем к математическим книгам. Поэтому она значительно отличается от классической монографии [L83], посвященной этой теме, и ее "потомкам" [L97, L02], ставящим во главу угла математические аспекты данной темы. Нас в первую очередь будут интересовать алгоритмы, находящие в строковых последовательностях различного рода паттерны, и только во вторую очередь - математические свойства самих строк. Это, конечно, не означает, что математические результаты не будут представлены строго и последовательно. Это означает, что будут представлены только те математические результаты, которые необходимы для пояснения построения и поведения алгоритмов. И последнее замечание: я сознательно ограничился изложением последовательных алгоритмов для обработки одномерных строк не делая ссылок на обширную литературу по алгоритмам с распараллеливанием процесса вычисления или на быстро растущую литературу по многомерным (особенно, двумерным) строкам.

Другой основной "герой" нашей книги - это паттерн. Так, все рассмотренные в книге алгоритмы предназначены для нахождения в строковых последовательностях определенных типов паттернов. Я говорю "определенных типов", поскольку будем различать три основных типа паттернов - частные, характеристические и внутренние. Каждому типу паттернов посвящена своя часть из четырех частей книги.

Частный паттерн (specific pattern) - это единственный вид паттернов, который можно задать в виде списка символов в нужном порядке. Например, в строке x = abaababaabaab мы можем найти (трижды) паттерн u = abaab, но не найдем паттерн u = ababab. (Иногда паттерн может содержать специальные "символы замещения" и в этом случае возможно только "приближенное" (в некотором точно определенном смысле) сравнение паттерна и строки.)

Характеристические паттерны (generic patterns) основаны на специальных представлениях структурной информации о строковых последовательностей. Например, мы можем говорить о "повторениях" в строке х - в этом случае в строке х есть несколько смежных одинаковых подстрок. (Например, в приведенной выше строке х присутствуют повторяющиеся подстроки (aba)(aba), (abaab)(abaab), aa (три отдельных серии) и несколько других, если вы сможете их найти.)

Я назвал последний тип паттернов, которые будут рассмотрены в книге внутренними (intrinsic). Эти паттерны отображают внутреннюю структуру строковых последовательностей. Мы рассмотрим различные паттерны, которые показывают наличие периодических структур в строках, например, нормальную форму, дерево суффиксов, линдонскую декомпозицию, s-факторизацию. Эти паттерны вездесущие: они используются в почти во всех алгоритмах вычисления частных и характеристических паттернов. Другими словами, они формируют основу для эффективных процедур обработки строковых последовательностей. Разнообразие внутренних паттернов поразительно: для строки х нашего примера нормальная форма имеет вид (abaababa)(abaab), тогда как линдонскую декомпозицию можно записать как (ab)(aabab)(aab)(aab), а s-факторизацию - как (a)(b)(a)(aba)(baaba)(ab), и все эти паттерны полезны и эффективны с вычислительной точки зрения.

Эта книга имеет следующую организацию. В части I приведены основные сведения о строковых последовательностях и алгоритмах обработки строк. Здесь даны терминология, формы записи и основные свойства строковых последовательностей. Глава 2 является ключом к остальной части книги: здесь четко поставлены задачи, алгоритмы для решения которых описаны в последующих частях книги. На основе материала этой главы читатель может выбрать для себя направление дальнейшего чтения в виде тех глав, которые представляют для него наибольший интерес. В части I также обсуждаются качества "хороших" алгоритмов и вопросы их реализации на практике. В частях II-IV описаны алгоритмы для вычисления внутренних, частных и характеристических паттернов соответственно.

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

Отметим, что в книге приведено примерно 500 упражнений, которые составляют неотъемлемую часть книги и могут использоваться для следующих целей.

С помощью упражнений я также пытался включить читателя в процесс разработки и анализа представленных алгоритмов. Этим я хотел показать, что в основе большинства алгоритмов и их модификаций лежат простые идеи, проникнуть в суть которых не составляет труда, но которые, может быть, "затемнены" или отброшены предыдущими исследователями. Если идея понята и принята, остается только ее техническая реализация. Это общее замечание относится и к строковым алгоритмам.

Признаюсь, что непосредственно в процессе писания книги я мог допускать ошибки. Поэтому при ее вычитке я старался исправить все замеченные ошибки и оплошности и сгладить шероховатости изложения материала. Но, конечно, я не могу гарантировать, что внимательный читатель не найдет "дефектов" в моей книге. Я поддерживаю Web-узел http://www.cs.curtis.edu.au/~smyth/patterns.shtml, где вы можете оставить свои сообщения о замеченных ошибках и предложения по улучшению книги. Я также буду благодарен, если читатели по этой же причине свяжутся со мной по электронной почте smyth@computing.edu.au или smyth@mcmaster.ca.

Материал книги можно использовать самое меньшее для чтения двухсеместрового (каждый семестр по 12-14 недель) курса для студентов старших курсов и аспирантов. Материал первых глав в разное время уже читался аспирантам факультета компьютерных наук и систем и факультета вычислительной техники и программного обеспечения университета Мак-Мастера, г. Гамильтон, Онтарио, Канада, и аспирантам факультета компьютерных наук университета Дебрецена, Венгрия. Аспиранты, прослушавшие эти курсы, внесли свой вклад в создание этой книги.

Я хотел бы выразить глубочайшую благодарность школе вычислительной техники университета Кортина, Перт, Западная Австралия и ее бывшим и настоящему руководителям Деннису Муру, Терри Силли, Свете Венкатеш и Джеффу Уесту (Dennis Moore, Terry Cealli, Svetha Venkatesh, Geoff West) за щедрую поддержку и за содействие, как интеллектуальное, так и практическое, на протяжении нескольких лет. Большая часть книги написана во время моих продолжительных визитов в Кортин. Я также благодарен профессору Петьо Аттиле (Petho Attila), декану факультета компьютерных наук университета Дебрецена за его интерес к моей работе и поддержку, особенно на последнем этапе создания электронного варианта книги. Хотел бы также выразить свою глубокую благодарность моим друзьям и коллегам Лейле Багдади, Джерри Чепплу, Франью Франеку, Костасу Илиопулосу, Терри Лекроку, Ян Ли, Деннису Муру, Пату Риану, Джеми Симпсону и Ксиангдонгу Ксиао (Leila Baghdadi, Jerry Chapple, Franya Franek, Costas Iliopoulos, Thierry Lecroq, Yin Li, Dennis Moore, Pat Ryan, Jaime Simpson, Xiangdong Xiao) за их дружеское и полезное содействие. Большая благодарность двум анонимным рецензентам, которые сделали конструктивные замечания и предложения по книге. Наконец, возношу хвалу своей дочери Жаклин за ее восхитительный выбор и попытки попробовать на вкус слова "строка" и "слово".