Вы находитесь на странице: 1из 258

УДК 519.

85(023)
ББК 22.18
О-52

С е р и я о с н о в а н а в 2008 г.
Окулов С. М.
О-52 Алгоритмы обработки строк [Электронный ресурс] /
С. М. Окулов. — 3-е изд. (эл.). — Электрон. текстовые
дан. (1 файл pdf : 258 с.). — М. : БИНОМ. Лаборатория
знаний, 2015. — (Развитие интеллекта школьников). —
Систем. требования: Adobe Reader XI ; экран 10".
ISBN 978-5-9963-2622-8
На материале задачи поиска подстроки в строке, ре-
шению которой посвящены работы многих профессионалов
за последние 20–30 лет, показано, как построить занятия
по информатике, чтобы побудить школьника к творчеству,
развить у него вкус к решению исследовательских проблем.
Для школьников, преподавателей информатики, а также
для студентов, выбравших информатику в качестве основной
специальности. Книга может быть использована как в обыч-
ных школах при проведении факультативных занятий, так
и в образовательных учреждениях с углубленным изучением
информатики и математики.
УДК 519.85(023)
ББК 22.18

Деривативное электронное издание на основе печатно-


го аналога: Алгоритмы обработки строк / С. М. Оку-
лов. — 2-е изд. — М. : БИНОМ. Лаборатория знаний,
2015. — 255 с. : ил. — (Развитие интеллекта школьников). —
ISBN 978-5-9963-1931-2.

В соответствии со ст. 1299 и 1301 ГК РФ при устранении


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

ISBN 978-5-9963-2622-8 c БИНОМ. Лаборатория знаний, 2009



Оглавление

Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Глава 1. Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1. Основные понятия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2. Методы предварительного анализа строк . . . . . . . . . 13

Глава 2. Классические алгоритмы решения задач


обработки строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1. Алгоритм Д. Кнута – Дж. Морриса – В. Пратта . . . . 28
2.2. Алгоритм Р. Бойера – Дж. Мура . . . . . . . . . . . . . . . . . 36
2.3. Алгоритм Р. Карпа – М. Рабина. . . . . . . . . . . . . . . . . . 52
2.4. Алгоритм Shift-And . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.5. Использование элементов теории автоматов
в решении задач обработки строк . . . . . . . . . . . . . . . . 73
2.6. Алгоритм М. Крочемора . . . . . . . . . . . . . . . . . . . . . . . . 81
2.7. Алгоритм М. Мейна – Р. Лоренца . . . . . . . . . . . . . . . . 88

Глава 3. Деревья суффиксов. . . . . . . . . . . . . . . . . . . . . . . . . . . . 103


3.1. Основные понятия. Простые алгоритмы
построения дерева суффиксов . . . . . . . . . . . . . . . . . . 103
3.2. Алгоритм Э. Укконена . . . . . . . . . . . . . . . . . . . . . . . . 118
3.3. Алгоритм Е. Мак-Крейга . . . . . . . . . . . . . . . . . . . . . . 127
3.4. Суффиксные массивы . . . . . . . . . . . . . . . . . . . . . . . . . 136
3.5. Алгоритм А. Ахо – М. Корасик . . . . . . . . . . . . . . . . . 147

Глава 4. Вычисление расстояния между строками . . . . . . 155


4.1. Основной алгоритм . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
4.2. Алгоритм Э. Укконена – Ю. Майерса . . . . . . . . . . . . 165
4.3. Задача о наибольшей общей
подпоследовательности двух строк . . . . . . . . . . . . . 174
4 Оглавление

Глава 5. Алгоритмы приближенного поиска подстрок . . 198


5.1. Простой алгоритм . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
5.2. Алгоритм С. Ву – Ю. Менбера . . . . . . . . . . . . . . . . . . 201
5.3. Задача о k-несовпадениях . . . . . . . . . . . . . . . . . . . . . . 205
5.4. Алгоритм Ю. Майерса . . . . . . . . . . . . . . . . . . . . . . . . . 215
Вместо заключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Михаилу, сыну моему, посвящаю.

Предисловие

Все должно быть изложено так


просто, как только возможно, —
но не проще.
Альберт Эйнштейн

Что может быть эффективнее для развития творческих


возможностей школьника и его интеллекта, чем решение за-
дач, казалось бы, очень простых, но «тянущих» за собой про-
блемы, исследованием которых занимались ведущие специа-
листы по информатике в последние 20–30 лет? Одной из та-
ких задач является задача поиска подстроки в строке,
которая так или иначе затрагивается в любом учебнике по
информатике. Длительность ее решения с помощью самого
простого алгоритма пропорциональна произведению длин
строки и подстроки, и, несмотря на возросшую производи-
тельность компьютера, она оказывается слишком большой
для многих приложений. Можно ли найти такие алгоритмы
решения этой задачи, чтобы произведение заменялось хотя
бы суммой? Оказывается, да, и эта замена является сутью ра-
бот лучших умов в информатике, многие из которых продол-
жают свою деятельность и в настоящее время.
Данная книга конструктивно построена в виде занятий,
ее материал апробирован в ходе проведения реальных уро-
ков1). Особенность изложения этого материала заключается
в том, что он не приводится в виде конечных результатов
(лемм, теорем, фактов и т. д.). Напротив, автором сделана по-
пытка показать сам процесс получения нового результата,
а он не появляется сразу доказательно оформленным. Конеч-
1)
Первая попытка изложения части предлагаемого здесь материала была сде-
лана в 1997 г. (Бабушкина И. А., Бушмелева Н. А., Окулов С. М., Чер-
ных С. Ю. Конспекты занятий по информатике (практикум по Турбо Паска-
лю). — Киров: Изд-во ВГПУ, 1997).
6 Предисловие

ное оформление по принятым «правилам игры» при написа-


нии книг такого типа обычно скрывает способ его «рожде-
ния» — в каких «муках» и как он получен. «Ни один ученый
не мыслит формулами», — любил говорить Альберт
Эйнштейн. В основе любого алгоритма лежит какая-то образ-
ная картинка или ясная идея. Воссоздать эту картинку,
взять на себя смелость утверждения о «рождении» результа-
та именно так, как описывается в книге (через примеры, че-
рез эксперименты — а они обязательны — и ошибки с «на-
бросками» кода) — страшно. Но если читатель подвергнет
все сомнению, то автор будет считать, что он уже достиг
цели, ибо специалист по информатике обязан все подвергать
сомнению и ничего не принимать на веру! Такое сомнение в
правильности результатов и самостоятельная работа приве-
дут вас к моментам «Эврика!», к рождению нового, и, может
быть, ваша фамилия так же войдет в историю информатики,
как и фамилии авторов рассматриваемых здесь алгорит-
мов...
В предмете «информатика», а именно в олимпиадных
соревнованиях по информатике, сложилась уникальная си-
туация, которой нет ни в одном школьном предмете. Напри-
мер, тематика заданий олимпиад по математике опирается
на школьный курс, что вполне естественно. В олимпиадной
же информатике (назовем ее так) существует как минимум
три направления: первое, поддерживаемое и развиваемое
международным сообществом, связано с алгоритмами и
программированием; второе — это олимпиады по базовому
курсу информатики; третье — различного рода соревнова-
ния по использованию информационных технологий. Связь
первого направления со школьным курсом информатики
ограничена несколькими разделами, второе направление
полностью адекватно курсу, а третье — лишь частично. Для
достижения результатов в рамках первого направления
знать и уметь требуется много, очень много, и любой школь-
ный учебник не входит в этот необходимый минимум. Если
выразиться точнее, то победитель соревнований первого
типа не всегда сможет выразить свои мысли тем языком, ко-
торый задается учебниками, хотя, конечно, он знает их ма-
териал, но только на совершенно другом уровне понимания
и осознания.
Рассматриваемые в книге алгоритмы (основные) входят
в примерную программу по олимпиадной информатике всего
одной строкой — «алгоритмы поиска подстроки в строке
Предисловие 7

за O(n+m)»1). Эти алгоритмы относятся к дидактическим


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

Структура книги
Первая глава, с одной стороны, является вводной, а с
другой — дает основы предварительного анализа строк, без
которых понимание многих изложенных далее алгоритмов
невозможно. Но, вероятно, главным в ней следует считать
«очерчивание» одного из основных способов построения эф-
фективных алгоритмов, который заключается в тщатель-
ном анализе исходных данных с целью выявления в них за-
кономерностей, а затем — в использовании этих закономер-
ностей при решении основной задачи.
Во второй главе рассматриваются ставшие уже класси-
кой алгоритмы Д. Кнута – Дж. Морриса – В. Пратта; Р. Бой-
ера – Дж. Мура; Р. Карпа – М. Рабина; Shift–And (Б. Дёмёл-
ки – Р. Беза-Йетс – Г. Гоннет); М. Крочемора и М. Мейна –
Р. Лоренца. Если первые четыре алгоритма посвящены проб-
леме поиска подстроки в строке, то последние два являются
основополагающими в задаче анализа свойств строки (тек-
ста). Во второй главе кратко показано, как использовать аппа-
рат теории автоматов при описании алгоритмов на строках.
Третья глава целиком посвящена деревьям суффик-
сов — структуре данных, в которой фиксируются особен-
ности строки (текста), позволяющие эффективно решать
многочисленные задачи обработки строк. Рассмотрены два
алгоритма — Э. Укконена и Е. Мак-Крейга, однако их рас-
смотрению предшествует анализ простых методов построе-
ния дерева суффиксов, что позволяет сделать изложение
доступным и ясным (с точки зрения автора). На остальные
известные алгоритмы решения этой задачи в данной книге
приводятся только ссылки.
В четвертой главе рассматриваются задачи вычисления
расстояния между строками и нахождения наибольшей об-
щей подпоследовательности двух строк. Анализ первой за-
1)
Кирюхин В. М. Информатика: всероссийские олимпиады. — М.: Просвеще-
ние, 2008. С. 71.
2)
Там же. С. 67.
8 Предисловие

дачи ограничивается основным алгоритмом и результатом


Э. Укконена – Ю. Майерса. Вторая проблема анализируется
через достижения С. Нудельмана – К. Вунша, Д. Ханта –
Т. Зиманского и Л. Эллисона – Т. Дикса.
Пятая глава посвящена достаточно значимой задаче
данной проблематики — приближенному поиску подстрок в
тексте. Даны простые алгоритмы, а также алгоритм С. Ву –
Ю. Менбера, алгоритм решения задачи о k-несовпадениях и
идейные основы алгоритма Ю. Майерса.
Вместо заключения читателям предлагается небольшое
эссе о предмете «информатика», из которого становятся яс-
нее роль и место как материала данной книги, так и резуль-
тата, получаемого в итоге деятельности по освоению рас-
сматриваемых алгоритмов.
В приложениях раскрываются некоторые моменты
организации углубленного экспериментального исследова-
ния алгоритмов и приводится ряд проблем (задач) для инди-
видуальной творческой работы1). Рассмотренные в данной
книге алгоритмы — это, если можно так выразиться, толь-
ко первый «пласт» указанного раздела информатики. Проб-
лемы, приведенные в приложении, лишь частично воспол-
няют этот пробел, полностью устраняемый, вероятно, лишь
последующими работами.
Благодарности
Я благодарю коллег: Евгения Вячеславовича Котельни-
кова, Андрея Васильевича Лялина и многих других за ин-
теллектуальную помощь, без которой вряд ли состоялся бы
этот труд. Особая признательность — Дмитрию Юрьевичу
Усенкову, сотруднику издательства «БИНОМ. Лаборатория
знаний», оперативность и доброжелательность работы кото-
рого вызывают восхищение. Глубочайшая благодарность —
директору издательства Михаилу Николаевичу Бородину,
который не только поверил в «пришедшего с улицы» автора
(в 2001 г.), но и все эти годы профессионально поддерживает
его деятельность.
1)
На русском языке имеются только две фундаментальные переводные книги
по данной проблематике: Смит Б. Методы и алгоритмы вычисления на стро-
ках: пер. с англ. — М.: ООО «И. Д. Вильямс», 2006 и Гасфилд Д. Строки, де-
ревья и последовательности в алгоритмах: Информатика и вычислительная
биология: пер. с англ. И. В. Романовского. — СПб.: Невский Диалект;
БХВ-Петербург, 2003. Автор, конечно же, использовал их (как и англоязыч-
ные статьи) при написании данной книги, которая, выражаясь педагогичес-
ким языком, является пропедевтикой к изучению названных книг, предос-
тавляющих обширный материал по проблемам для индивидуальной твор-
ческой работы как школьника, так и студента.
8 Ïðåäèñëîâèå

äà÷è îãðàíè÷èâàåòñÿ îñíîâíûì àëãîðèòìîì è ðåçóëüòàòîì


Ý. Óêêîíåíà – Þ. Ìàéåðñà. Âòîðàÿ ïðîáëåìà àíàëèçèðóåòñÿ
÷åðåç äîñòèæåíèÿ Ñ. Íóäåëüìàíà – Ê. Âóíøà, Ä. Õàíòà –
Ò. Çèìàíñêîãî è Ë. Ýëëèñîíà – Ò. Äèêñà.
Ïÿòàÿ ãëàâà ïîñâÿùåíà äîñòàòî÷íî çíà÷èìîé çàäà÷å
äàííîé ïðîáëåìàòèêè — ïðèáëèæåííîìó ïîèñêó ïîäñòðîê â
òåêñòå. Äàíû ïðîñòûå àëãîðèòìû, à òàêæå àëãîðèòì Ñ. Âó –
Þ. Ìåíáåðà, àëãîðèòì ðåøåíèÿ çàäà÷è î k-íåñîâïàäåíèÿõ è
èäåéíûå îñíîâû àëãîðèòìà Þ. Ìàéåðñà.
Âìåñòî çàêëþ÷åíèÿ ÷èòàòåëÿì ïðåäëàãàåòñÿ íåáîëüøîå
ýññå î ïðåäìåòå «èíôîðìàòèêà», èç êîòîðîãî ñòàíîâÿòñÿ ÿñ-
íåå ðîëü è ìåñòî êàê ìàòåðèàëà äàííîé êíèãè, òàê è ðåçóëü-
òàòà, ïîëó÷àåìîãî â èòîãå äåÿòåëüíîñòè ïî îñâîåíèþ ðàñ-
ñìàòðèâàåìûõ àëãîðèòìîâ.
 ïðèëîæåíèÿõ ðàñêðûâàþòñÿ íåêîòîðûå ìîìåíòû
îðãàíèçàöèè óãëóáëåííîãî ýêñïåðèìåíòàëüíîãî èññëåäîâà-
íèÿ àëãîðèòìîâ è ïðèâîäèòñÿ ðÿä ïðîáëåì (çàäà÷) äëÿ èíäè-
âèäóàëüíîé òâîð÷åñêîé ðàáîòû1). Ðàññìîòðåííûå â äàííîé
êíèãå àëãîðèòìû — ýòî, åñëè ìîæíî òàê âûðàçèòüñÿ, òîëü-
êî ïåðâûé «ïëàñò» óêàçàííîãî ðàçäåëà èíôîðìàòèêè. Ïðîá-
ëåìû, ïðèâåäåííûå â ïðèëîæåíèè, ëèøü ÷àñòè÷íî âîñïîë-
íÿþò ýòîò ïðîáåë, ïîëíîñòüþ óñòðàíÿåìûé, âåðîÿòíî, ëèøü
ïîñëåäóþùèìè ðàáîòàìè.
Áëàãîäàðíîñòè
ß áëàãîäàðþ êîëëåã: Åâãåíèÿ Âÿ÷åñëàâîâè÷à Êîòåëüíè-
êîâà, Àíäðåÿ Âàñèëüåâè÷à Ëÿëèíà è ìíîãèõ äðóãèõ çà èí-
òåëëåêòóàëüíóþ ïîìîùü, áåç êîòîðîé âðÿä ëè ñîñòîÿëñÿ áû
ýòîò òðóä. Îñîáàÿ ïðèçíàòåëüíîñòü — Äìèòðèþ Þðüåâè÷ó
Óñåíêîâó, ñîòðóäíèêó èçäàòåëüñòâà «ÁÈÍÎÌ. Ëàáîðàòîðèÿ
çíàíèé», îïåðàòèâíîñòü è äîáðîæåëàòåëüíîñòü ðàáîòû êîòî-
ðîãî âûçûâàþò âîñõèùåíèå. Ãëóáî÷àéøàÿ áëàãîäàðíîñòü —
äèðåêòîðó èçäàòåëüñòâà Ìèõàèëó Íèêîëàåâè÷ó Áîðîäèíó,
êîòîðûé íå òîëüêî ïîâåðèë â «ïðèøåäøåãî ñ óëèöû» àâòîðà
(â 2001 ã.), íî è âñå ýòè ãîäû ïðîôåññèîíàëüíî ïîääåðæèâàåò
åãî äåÿòåëüíîñòü.
1)
Íà ðóññêîì ÿçûêå èìåþòñÿ òîëüêî äâå ôóíäàìåíòàëüíûå ïåðåâîäíûå êíèãè
ïî äàííîé ïðîáëåìàòèêå: Ñìèò Á. Ìåòîäû è àëãîðèòìû âû÷èñëåíèÿ íà ñòðî-
êàõ: ïåð. ñ àíãë. — Ì.: ÎÎÎ «È. Ä. Âèëüÿìñ», 2006 è Ãàñôèëä Ä. Ñòðîêè, äå-
ðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìàòèêà è âû÷èñëèòåëüíàÿ
áèîëîãèÿ: ïåð. ñ àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.: Íåâñêèé Äèàëåêò;
ÁÕÂ-Ïåòåðáóðã, 2003. Àâòîð, êîíå÷íî æå, èñïîëüçîâàë èõ (êàê è àíãëîÿçû÷-
íûå ñòàòüè) ïðè íàïèñàíèè äàííîé êíèãè, êîòîðàÿ, âûðàæàÿñü ïåäàãîãè÷åñ-
êèì ÿçûêîì, ÿâëÿåòñÿ ïðîïåäåâòèêîé ê èçó÷åíèþ íàçâàííûõ êíèã, ïðåäîñ-
òàâëÿþùèõ îáøèðíûé ìàòåðèàë ïî ïðîáëåìàì äëÿ èíäèâèäóàëüíîé òâîð-
÷åñêîé ðàáîòû êàê øêîëüíèêà, òàê è ñòóäåíòà.
Ãëàâà 1

Ñòðîêè

È ïðèõîäÿò ìíå â ãîëîâó ñêàçêè


Ìóäðåöàìè îòìå÷åííûõ äíåé,
È áëóæäàþ ÿ â íèõ ïî óêàçêå
Óäèâèòåëüíîé ïòèöû ìîåé.
Íèêîëàé Çàáîëîöêèé

1.1. Îñíîâíûå ïîíÿòèÿ


Ñòåíó ìîæíî ïðîáèòü òîëüêî ãîëîâîé.
Âñå îñòàëüíîå — òîëüêî îðóäèÿ.
Ëåøåê Êóìîð
Îáû÷íî ãîâîðÿò, ÷òî ñòðîêà (S) — ýòî ïîñëåäîâàòåëü-
íîñòü ñèìâîëîâ, âçÿòûõ èç çàðàíåå îïðåäåëåííîãî àëôàâè-
òà. Ïðè ýòîì ñðàçó âîçíèêàþò êàê ìèíèìóì äâà âîïðîñà, çà-
êëþ÷åííûå â ïîíÿòèÿõ «ïîñëåäîâàòåëüíîñòü» è «àëôàâèò».
Ïîñëåäîâàòåëüíîñòü — ýòî çíà÷èò ñòðîêà êàê îäíîìåð-
íàÿ ñòðóêòóðà, â êîòîðîé êàæäûé ýëåìåíò (ñèìâîë) èìååò
óíèêàëüíóþ ìåòêó â âèäå íîìåðà, à ðàññìàòðèâàþòñÿ òîëüêî
êîíå÷íûå ýëåìåíòû ñòðîêè (ïåðâûé è ïîñëåäíèé). Äàëåå,
êàæäûé ýëåìåíò ñòðîêè, êðîìå ïåðâîãî (ñàìîãî ëåâîãî), èìå-
åò åäèíñòâåííûé ïðåäøåñòâóþùèé ýëåìåíò, à êàæäûé ýëå-
ìåíò, êðîìå ïîñëåäíåãî (ñàìîãî ïðàâîãî), èìååò åäèíñòâåí-
íûé ñëåäóþùèé ýëåìåíò. Ïðîâîäÿ àíàëîãèþ ñ ÿçûêîì ïðî-
ãðàììèðîâàíèÿ Ïàñêàëü, ìîæíî ñêàçàòü, ÷òî äëÿ ñòðîêè
ðàáîòàþò îïåðàöèè pred(i) è succ(i), ãäå i — íîìåð ñèìâîëà
â ñòðîêå, è ñïðàâåäëèâû ðàâåíñòâà: i = succ(pred(i))
(çà èñêëþ÷åíèåì ñàìîãî ëåâîãî ñèìâîëà) è i = pred(succ(i))
(çà èñêëþ÷åíèåì ñàìîãî ïðàâîãî ñèìâîëà).
Àëôàâèò — ýòî èíòóèòèâíî äîñòàòî÷íî ÿñíîå ïîíÿòèå;
îïðåäåëèì åãî êàê êîíå÷íîå ìíîæåñòâî A ðàçëè÷èìûõ ýëå-
ìåíòîâ, íà êîòîðîì îïðåäåëåíî îòíîøåíèå ïîðÿäêà. Òðàäè-
öèîííûå ïðèìåðû àëôàâèòîâ: ëàòèíñêèé; ðóññêèé; âñå ñèì-
âîëû â ñîîòâåòñòâèè ñ èõ êîäèðîâêîé ASCII. Àëôàâèò èç äâóõ
ñèìâîëîâ (à êîìïüþòåð ðàáîòàåò ñ äàííûìè, ïðåäñòàâëåííû-
10 Ãëàâà 1. Ñòðîêè

ìè â òàêîì àëôàâèòå!) íàçûâàþò áèíàðíûì (äâîè÷íûì).


Îòíîøåíèå ïîðÿäêà äëÿ ñèìâîëîâ èç àëôàâèòà ãîâîðèò î òîì,
÷òî äëÿ ëþáûõ x Î A è y Î A ìîæíî ñäåëàòü âûâîä, êàêîé
ýëåìåíò áîëüøå äðóãîãî, ò. å. ÷òî x < y èëè y < x ïðè x ¹ y.
Ïîíÿòèå «ïîäñòðîêà» ñòðîêè S îïðåäåëÿåòñÿ êàê S[i..j]
äëÿ ëþáîé ïàðû òàêèõ ÷èñåë i è j, ÷òî 1 „ i „ j „ n, ãäå n —
êîëè÷åñòâî ñèìâîëîâ â S (äëèíà ñòðîêè, îáîçíà÷èì åå êàê
|S|). Åñëè æå i > j, òî ìû ñ÷èòàåì ïîäñòðîêó S[i..j] ïóñòîé.
Äðóãèìè ñëîâàìè, ïîäñòðîêà — ýòî ÷àñòü ñòðîêè, ñîñòîÿùàÿ
èç íåêîòîðîãî êîëè÷åñòâà ñìåæíûõ ñèìâîëîâ èñõîäíîé
ñòðîêè, è â äàííîì ñëó÷àå «íåêîòîðîå êîëè÷åñòâî» îïðåäå-
ëÿåòñÿ êàê j – i + 1. Ìîæíî âûäåëèòü òî÷íî n – k + 1 ïîä-
ñòðîê äëèíû k èç ñòðîêè S äëèíû n: ýòî ïîäñòðîêè S[1..k],
S[2..k + 1], ..., S[n – k + 1..n]. Îáùåå êîëè÷åñòâî ïîä-
ñòðîê ñ äëèíàìè îò 1 äî n îïðåäåëÿåòñÿ ñóììîé —
n
n2 + n
å (n - k + 1) = 2 , ò. å. èìååò ïîðÿäîê O(n2).
k=1
Ñòðîêè (åñòåñòâåííî, íà îäíîì àëôàâèòå) S1 è S2 ðàâíû,
åñëè:
1) ñîâïàäàþò èõ äëèíû (n);
2) S1[i] = S2[i] äëÿ âñåõ i = 1, ..., n.
Íà ìíîæåñòâå ñòðîê íà óïîðÿäî÷åííîì àëôàâèòå A îò-
íîøåíèå ïîðÿäêà (ëåêñèêîãðàôè÷åñêîãî) ââîäèòñÿ åñòåñò-
âåííûì îáðàçîì. Ïóñòü èìååòñÿ äâå ñòðîêè S1[1..n] è
S2[1..m], òîãäà ìû ãîâîðèì, ÷òî S1 < S2 (S1 ëåêñèêîãðàôè-
÷åñêè ìåíüøå S2), åñëè âûïîëíÿåòñÿ îäíî èç ñëåäóþùèõ
óñëîâèé (âçàèìîèñêëþ÷àþùèõ):
à) n < m è S1[1..n] = S2[1..n];
á) ñóùåñòâóåò òàêîå öåëîå ÷èñëî i (i Î 1..min{n, m}), ÷òî
S1[1..i – 1] = S2[1..i – 1] è S1[i] < S2[i] (èëè, äðóãèìè
ñëîâàìè, i — ïåðâàÿ ïîçèöèÿ ñëåâà, â êîòîðîé ýëåìåí-
òû S1 è S2 ðàçëè÷íû).

Ïðèìåðû
abc < abcd (n = 3, m = 4); abdef < ada (i = 2, b < d).
Ïðåôèêñ ñòðîêè S, çàêàí÷èâàþùèéñÿ â ïîçèöèè i, —
ýòî ïîäñòðîêà S[1..i].
Ñóôôèêñ ñòðîêè S, íà÷èíàþùèéñÿ â ïîçèöèè i, — ýòî
ïîäñòðîêà S[i..n].
1.1. Îñíîâíûå ïîíÿòèÿ 11

Ïðåôèêñû è ñóôôèêñû íàçûâàþò ñîáñòâåííûìè, åñëè


îíè íå ÿâëÿþòñÿ ïóñòûìè è íå ñîâïàäàþò ñ S.
Îñíîâíàÿ çàäà÷à. Äàíà ñòðîêà P (åå ÷àùå âñåãî íàçûâà-
þò îáðàçöîì) è ñòðîêà T (òåêñò). Òðåáóåòñÿ íàéòè âñå
âõîæäåíèÿ îáðàçöà P â òåêñò T. Äëèíû ñòðîê îáîçíà÷èì êàê
m = |P| è n = |T|.
Ïðèìåð
P = aab, T = aacbaabaatabaabaaw. P âõîäèò â T, íà÷è-
íàÿ ñ ïîçèöèé 5 è 13.
Ïðîñòîé, èëè «íàèâíûé», àëãîðèòì ðåøåíèÿ çàäà÷è ïî-
êàçàí íà ðèñ. 1.1. Çäåñü íàéäåíî äâà âõîæäåíèÿ (îáà ïîä-
÷åðêíóòû) îáðàçöà â òåêñò.

Ðèñ. 1.1. Ïðèìåð ïðîñòîãî ïîèñêà îáðàçöà â òåêñòå

Êàê íåòðóäíî âèäåòü, äëÿ ðåøåíèÿ ïîñòàâëåííîé çàäà÷è


îáðàçåö P «ïðèêëàäûâàåòñÿ» ëåâûì êîíöîì ê òåêñòó T, íà-
÷èíàÿ ñ åãî ïåðâîé ïîçèöèè, à çàòåì îñóùåñòâëÿåòñÿ ïîñèì-
âîëüíîå ñðàâíåíèå îáðàçöà è ñîîòâåòñòâóþùèõ ñèìâîëîâ òåê-
ñòà. Ïðè ýòîì âîçìîæíû äâà èñõîäà: ïðîèçîéäåò íåñîâïàäå-
íèå ñèìâîëîâ â êàêîé-òî ïîçèöèè ëèáî áóäåò íàéäåíî
âõîæäåíèå P â T (âñå ñèìâîëû P ñðàâíåíû). Âî âòîðîì ñëó÷àå
ôèêñèðóåòñÿ ôàêò ñîâïàäåíèÿ, íî â îáîèõ ñëó÷àÿõ çàòåì P
ñäâèãàåòñÿ íà îäíó ïîçèöèþ âïðàâî è ïðîöåññ ïðîâåðêè ñî-
âïàäåíèÿ ïîâòîðÿåòñÿ.  äàííîì àëãîðèòìå íå ó÷èòûâàþòñÿ
êàê ðåçóëüòàòû ïðåäûäóùèõ ñðàâíåíèé, òàê è ñòðóêòóðà îá-
ðàçöà èëè òåêñòà.
Ôîðìàëèçîâàííàÿ çàïèñü ðàññìîòðåííîãî àëãîðèòìà
èìååò ñëåäóþùèé âèä.
12 Ãëàâà 1. Ñòðîêè

Procedure Solve;
{P, T – ãëîáàëüíûå âåëè÷èíû òèïà String}
Var i,j:Integer;
Begin
For i:=1 To n-m+1 Do Begin
j:=1;
While (j<=m) And (P[j]=T[i+j-1]) Do j:=j+1;
If j=m+1 Then WriteLn('íàéäåíî âõîæäåíèå P â T,
íà÷èíàÿ ñ ïîçèöèè ', i);
End;
End;
Îöåíèì âðåìÿ ðàáîòû ýòîãî àëãîðèòìà â êîëè÷åñòâå îïå-
ðàöèé ñðàâíåíèÿ. Îíî î÷åâèäíî è èìååò çíà÷åíèå O(n·m).
Òàêàÿ îöåíêà äîñòèãàåòñÿ ïðè n – m + 1 ñîâïàäåíèÿõ, ò. å.
êîãäà è P, è T ñîñòîÿò èç îäíîãî ñèìâîëà. Ïðè çíà÷åíèÿõ
m > 103, n > 109 âðåìÿ ðàáîòû òàêîãî àëãîðèèòìà ñòàíîâèò-
ñÿ íåïðèåìëåìûì äëÿ ìíîãèõ ïðèëîæåíèé.
Öåëüþ ñïåöèàëèñòîâ ïî èíôîðìàòèêå çà ïîñëåäíèå 30 ëåò
ÿâëÿåòñÿ ðàçðàáîòêà àëãîðèòìîâ ïîèñêà âõîæäåíèÿ îáðàçöà â
òåêñò (èíîãäà — óäèâèòåëüíûõ è íåîæèäàííûõ, êàê ñêàçêà J),
à òàêæå ðåøåíèå öåëîãî ðÿäà ðîäñòâåííûõ çàäà÷, ñ âðåìåííîé
îöåíêîé ïîðÿäêà O(n + m). Áîëüøèíñòâî ðåçóëüòàòîâ ïðè
ýòîì îñíîâàíî íà ïðåäâàðèòåëüíîì àíàëèçå îáðàçöà èëè òåê-
ñòà (â çàâèñèìîñòè îò çàäà÷è), íàïðàâëåííîì íà âûÿâëåíèå,
åñëè ìîæíî òàê âûðàçèòüñÿ, åãî ñòðóêòóðû, ñ ïîñëåäóþùèì
èñïîëüçîâàíèåì ýòîé èíôîðìàöèè äëÿ ðåøåíèÿ çàäà÷è. Ðàçó-
ìååòñÿ, ñìûñë èìåþò òîëüêî àëãîðèòìû ñ âðåìåííîé îöåíêîé
O(n) èëè O(m). Ñêàæåì, òàêîé àíàëèç P ïîçâîëèë áû ðåøèòü
çàäà÷ó èç ïðèâåäåííîãî íà ðèñ. 1.1 ïðèìåðà íå çà 16 ñäâèãîâ,
à çà ãîðàçäî ìåíüøåå èõ ÷èñëî (íàïðèìåð, 9).

@ Óïðàæíåíèÿ
1. Ñôîðìóëèðóéòå îòëè÷èå ñëåäóþùåé ðåàëèçàöèè ïðî-
ñòîãî àëãîðèòìà ïîèñêà âõîæäåíèÿ P â T îò ðàíåå ïðèâå-
äåííîé.
Procedure Solve;
{P, T – ãëîáàëüíûå âåëè÷èíû òèïà String}
Var i,j:Integer;
Begin
For i:=1 To n-m+1 Do Begin
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 13

j:=m;
While (j>=1) And (P[j]=T[i+j-1]) Do j:=j-1;
If j=0 Then WriteLn('íàéäåíî âõîæäåíèå P
â T, íà÷èíàÿ ñ ïîçèöèè ', i);
End;
End;
2. Â ôîðìàëèçîâàííîé çàïèñè àëãîðèòìà ïðîñòîãî ïîèñêà
ñ÷èòàëîñü, ÷òî êàê P, òàê è T èìåþò äëèíû, äîïóñêàþ-
ùèå èñïîëüçîâàíèå òèïà äàííûõ String. Ñíèìèòå ýòî
îãðàíè÷åíèå. Ïðåäïîëîæèòå, íàïðèìåð, ÷òî m = 100, à
n = 10000. Ñîîòâåòñòâåííî èçìåíèòå ðåàëèçàöèþ ìåòî-
äà è îöåíèòå (ýêñïåðèìåíòàëüíî) âðåìÿ åãî ðàáîòû.
Ïðèìå÷àíèå. Äëÿ ýòîãî ïîòðåáóåòñÿ äîïîëíèòåëüíî íà-
ïèñàòü ãåíåðàòîð ñëó÷àéíûõ ñòðîê çàäàííîé äëèíû.
3. Äàíû äâå ñòðîêè — S1 è S2. Îïðåäåëèòå, íàïèñàâ ñîîòâåò-
ñòâóþùóþ ïðîãðàììó, ìîæíî ëè îäíó (ëþáóþ) èç ýòèõ
ñòðîê ïîëó÷èòü öèêëè÷åñêèì ñäâèãîì äðóãîé ñòðîêè.

1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà


ñòðîê
Êàæäûé èç íàñ ëèøü âûèãðàåò, ñîçäàâàÿ âðå-
ìÿ îò âðåìåíè «èãðóøå÷íûå» ïðîãðàììû ñ
çàäàííûìè èñêóññòâåííûìè îãðàíè÷åíèÿ-
ìè, çàñòàâëÿþùèìè íàñ äî ïðåäåëà íàïðÿ-
ãàòü ñâîè ñïîñîáíîñòè... Èñêóññòâî ðåøåíèÿ
ìèíè-çàäà÷ íà ïðåäåëå ñâîèõ âîçìîæíîñòåé
îòòà÷èâàåò íàøå óìåíèå äëÿ ðåàëüíûõ çàäà÷.
Äîíàëüä Êíóò
Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê ïîçâîëÿþò âû-
ÿâèòü èõ ñòðóêòóðó — çàêîíîìåðíîñòè ðàñïîëîæåíèÿ ñèì-
âîëîâ â ñòðîêå. Ðåøåíèå çàäà÷è çà ëèíåéíîå âðåìÿ (îò äëè-
íû ñòðîêè) ñîçäàåò ïðåäïîñûëêè äëÿ íàõîæäåíèÿ ýôôåê-
òèâíûõ àëãîðèòìîâ ïîèñêà ïîäñòðîêè â ñòðîêå. Èçâåñòíû
äâå ñõåìû ïðåäâàðèòåëüíîãî àíàëèçà — íàõîæäåíèå ãðà-
íåé1) è áëîêîâ ñòðîê2). Ðàññìîòðèì èõ.
1)
Ñìèò Á. Ìåòîäû è àëãîðèòìû âû÷èñëåíèÿ íà ñòðîêàõ: ïåð. ñ àíãë. — Ì.:
ÎÎÎ «È. Ä. Âèëüÿìñ», 2006.
2)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ: ïåð. ñ àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.:
Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåðáóðã, 2003.
14 Ãëàâà 1. Ñòðîêè

1.2.1. Ãðàíè ñòðîêè


Íà ãðàíè ìàðòà è àïðåëÿ,
ãðàíèöå äíÿ è òåìíîòû —
Ñ ñîçíàíüåì, ÷òî â êîíöå òîííåëÿ
íà ñàìîì äåëå òîëüêî òû.
Äìèòðèé Áûêîâ
Îïðåäåëåíèå
Ãðàíüþ (border, verge, brink) br ñòðîêè S íàçûâàåòñÿ ëþ-
áîé ñîáñòâåííûé ïðåôèêñ ýòîé ñòðîêè, ðàâíûé ñóôôèêñó S.
Ñòðîêà S = abaababaabaab èìååò äâå ãðàíè (íå ïóñ-
òûå) — ab è abaab. Ñòðîêà S = abaabaab òàêæå èìååò äâå
ãðàíè — ab è abaab, íî âòîðàÿ ãðàíü — ïåðåêðûâàþùàÿñÿ.
Ñòðîêà äëèíû n èç ïîâòîðÿþùåãîñÿ ñèìâîëà, íàïðèìåð
aaaaaaaa (èëè a8), èìååò n – 1 ãðàíü. Äëÿ S = a8 ýòî ãðàíè:
a, aa, aaa, aaaa, aaaaa, aaaaaa è aaaaaaa.
Ïîíÿòèå «ñîáñòâåííûé ïðåôèêñ» èñêëþ÷àåò ãðàíü, ñî-
âïàäàþùóþ ñ ñàìîé ñòðîêîé.
Äëèíà ãðàíè — ýòî êîëè÷åñòâî ñèìâîëîâ â íåé.
Åñòåñòâåííûì îáîáùåíèåì ïîíÿòèÿ «ãðàíü» ÿâëÿåòñÿ
ïîíÿòèå «íàèáîëüøåé ãðàíè» — ýòî íàèáîëüøèé (ïî êîëè-
÷åñòâó ñèìâîëîâ) ñîáñòâåííûé ïðåôèêñ ñòðîêè, ðàâíûé åå
ñóôôèêñó.
Ïðîñòûì àëãîðèòìîì âû÷èñëåíèÿ íàèáîëüøåé ãðàíè
ñòðîêè S ÿâëÿåòñÿ ïîñëåäîâàòåëüíàÿ ïðîâåðêà ñîâïàäåíèÿ
ïðåôèêñîâ S[1], S[1..2], S[1..3], ..., S[1..n – 1] ñ ñîîòâåòñòâóþ-
ùèìè ñóôôèêñàìè S[n], S[n – 1..n], S[n – 2..n], ..., S[2..n]:
Function MaxBorder(S:String):Word;
Var i, j, br, n:Word;
Begin
n:=Length(S); {Âû÷èñëÿåì äëèíó ñòðîêè W}
br:=0;
For i:=1 To n-1 Do Begin {Öèêë ïî äëèíå ãðàíè}
j:=n-i+1;
While (j<=n) And (S[i+j-n]=S[j]) Do j:=j+1;
{Ïðåôèêñ è ñóôôèêñ äëèíû i ñîâïàäàþò?}
If j=n+1 Then br:=i;
End;
MaxBorder:=br;
End;
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 15

Âðåìåííàÿ ñëîæíîñòü ýòîãî àëãîðèòìà — O(n2).


Ñäåëàåì îáîáùåíèå çàäà÷è. Ïóñòü íåîáõîäèìî âû÷èñ-
ëèòü çíà÷åíèÿ íàèáîëüøèõ ãðàíåé äëÿ âñåõ ïîäñòðîê S[1..i]
(i = 1..n) è ñîõðàíèòü èõ â ìàññèâå br[1..n]. Î÷åâèäíî, çíà-
÷åíèå br[1] ðàâíî 0, èáî ïîäñòðîêà S[1] íå èìååò ñîáñòâåí-
íûõ ïîäñòðîê. Ïîñëåäîâàòåëüíîå ïðèìåíåíèå ïðåäûäóùåé
ëîãèêè ê êàæäîé ïîäñòðîêå ïðèâîäèò ê ñëåäóþùåìó àëãî-
ðèòìó ñ âðåìåííîé ñëîæíîñòüþ O(n3):
Procedure MaxBorderArray(S:String);
{Ìàññèâ br - ãëîáàëüíûé}
Var i,n,t:Word;
Begin
n:=Length(S);
br[1]:=0;
For i:=2 To n Do
br[i]:=MaxBorder(Copy(S,1,i));
{"Âûðåçàåì" èç S ïîäñòðîêó äëèíû i,
íà÷èíàÿ ñ ïåðâîãî ñèìâîëà}
End;
Ïðèìåðû
 òàáë. 1.1 ïðèâåäåíû ïðèìåðû âû÷èñëåíèÿ ìàññèâà
ãðàíåé br äëÿ ðàçëè÷íûõ ñòðîê S.

Òàáëèöà 1.1

¹ S Br
1 aaaaaa 0, 1, 2, 3, 4, 5
2 abcdef 0, 0, 0, 0, 0, 0
3 abaababaabaab 0, 0, 1, 1, 2, 3, 2, 3, 4, 5, 6, 4, 5
4 abcabcabcabc=(abc)4 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
5 abcabdabcabeabcabd 0, 0, 0, 1, 2, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4,
abcabc 5, 6, 7, 8, 9, 10, 11, 3

Êàêèå íàáëþäåíèÿ ìîæíî ñäåëàòü íà îñíîâàíèè ýòèõ


äàííûõ? Âî-ïåðâûõ, br[i + 1] „ br[i] + 1 äëÿ ëþáûõ i îò 1 äî
n – 1, è åñëè çíà÷åíèÿ ýëåìåíòîâ br âîçðàñòàþò, òî îíè âîç-
ðàñòàþò ñ øàãîì 1. Âî-âòîðûõ, êîãäà br[i + 1] = br[i] + 1?
Îòâåò îäíîçíà÷åí: ïðè S[i + 1] = S[br[i] + 1]. Äðóãèìè ñëî-
âàìè, åñëè ñèìâîë S â ïîçèöèè i + 1 ñîâïàäàåò ñ ñèìâîëîì,
16 Ãëàâà 1. Ñòðîêè

ñëåäóþùèì çà ìàêñèìàëüíûì ïðåôèêñîì S[1..i], ñîâïàäàþ-


ùèì ñ ñóôôèêñîì S[1..i], òî íàèáîëüøàÿ ãðàíü br[i + 1] äëÿ
S[1..i + 1] ïðîñòî óâåëè÷èâàåòñÿ íà 1. À åñëè S[i + 1] ¹
¹ S[br[i] + 1]? Ñèòóàöèÿ äëÿ ñòðîêè S[1..12] òðåòüåãî ïðèìå-
ðà èç òàáë. 1.1 ïîÿñíÿåòñÿ íà ðèñ. 1.2à, à äëÿ ñòðîêè S[1..24]
ïÿòîãî ïðèìåðà èç òàáë. 1.1 — íà ðèñ. 1.2á.

Ðèñ. 1.2. Ïðèìåðû âû÷èñëåíèé çíà÷åíèé br ïðè


S[i + 1] ¹ S[br[i] + 1]

Èòàê, åñëè íåò ñîâïàäåíèÿ S[i + 1] ¹ S[br[i] + 1], òî ðàñ-


ñìàòðèâàåòñÿ íàèáîëüøàÿ ãðàíü ïîäñòðîêè S[1..br[i]] è ïðî-
âåðÿåòñÿ ðàâåíñòâî S[i + 1] = S[br[br[i]] + 1]. Äëÿ ïðèìåðà
íà ðèñ. 1.2à îíî âûïîëíÿåòñÿ:
S[12] ¹ S[br[11] + 1] = S[7] (a ¹ b);
S[12] = S[br[br[11]] + 1] = S[br2[11] + 1] =
= S[br[6] + 1] = S[3 + 1] = S[4] (a = a)
è br[12] = br[6] + 1,
à äëÿ ïðèìåðà íà ðèñ. 1.2á îíî (íà âòîðîì øàãå) íå âûïîëíÿ-
åòñÿ, è òðåáóåòñÿ åùå îäèí øàã àíàëîãè÷íîãî «ñêà÷êà» ïî
ñòðîêå.
 ôîðìèðîâàíèè ìàññèâà ãðàíåé êëþ÷åâóþ ðîëü èãðàåò
ôàêò, ÷òî åñëè t (ñòðîêà) — ãðàíü ñòðîêè S, òî t’ (ãðàíü ïîä-
ñòðîêè t) ÿâëÿåòñÿ ãðàíüþ ñòðîêè S. Ìàññèâ ãðàíåé ìîæíî
«ðàçâåðíóòü» â äâóìåðíóþ ñòðóêòóðó (åå ÷àñòü äëÿ ïðèìåðà
íà ðèñ. 1.2á ïðåäñòàâëåíà â òàáë. 1.2). Åñòåñòâåííî, ÷òî íà
ôîðìèðîâàíèå çíà÷åíèé äâóìåðíîãî ìàññèâà ïîòðåáóåòñÿ
âðåìÿ O(n2).
Åñëè ââåñòè îáîçíà÷åíèå brj[i], j = 1, 2, .., k, ÿâëÿþùåå-
ñÿ çíà÷åíèåì äëèíû j-é ïî âåëè÷èíå ãðàíè ïîäñòðîêè
S[1..i], òî S[1..brj[i]] åñòü ãðàíü ïîäñòðîêè S[1..brj–1[i]]. Äðó-
ãèìè ñëîâàìè, brj[i] = br[brj–1[i]], èëè j-ÿ ïî âåëè÷èíå ãðàíü
ïîäñòðîêè S[1..i], ÿâëÿåòñÿ ãðàíüþ (j – 1)-é ïî âåëè÷èíå
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 17

Òàáëèöà 1.2

I Äëèíà ãðàíåé
24 3, 0
23 11, 5, 2, 0
22 10, 4, 1, 0
21 9, 3, 0
20 8, 2, 0
... ...

ãðàíè ïîäñòðîêè S[1..i], è ñóùåñòâóåò íàèìåíüøåå çíà÷åíèå


k òàêîå, ÷òî brk[i] = 0.

Ôîðìàëèçîâàííàÿ çàïèñü àëãîðèòìà âû÷èñëåíèÿ br äëÿ


S ìîæåò áûòü ïðåäñòàâëåíà òàê:
Procedure MaxBorderArray(S:String);
{Ìàññèâ br - ãëîáàëüíûé}
Var i,n,t:Word;
Begin
n:=Length(S);
br[1]:=0;
For i:=1 To n-1 Do Begin
t:=br[i];
While (t>0) And (S[i+1]<>S[t+1]) Do t:=br[t];
If S[i+1]=S[t+1] Then br[i+1]:=t+1
Else br[i+1]:=0;
End;
End;

Îöåíèì âðåìåííûå ïàðàìåòðû ýòîãî àëãîðèòìà. Öèêë


For âûïîëíÿåòñÿ n – 1 ðàç. Êîëè÷åñòâî øàãîâ âëîæåííîãî
öèêëà While ðàçëè÷íî. Âðåìÿ âûïîëíåíèÿ àëãîðèòìà ïðî-
ïîðöèîíàëüíî îáùåìó êîëè÷åñòâó ïðèñâàèâàíèé çíà÷åíèé
ïåðåìåííîé t. Îíî ðàâíî n – 1 (â öèêëå For) ïëþñ êîëè÷åñò-
âî ýòèõ îïåðàöèé âíóòðè öèêëà While. Â öèêëå While ïðî-
èñõîäèò óìåíüøåíèå çíà÷åíèÿ ïåðåìåííîé t. Íà êàæäîé æå
èòåðàöèè For çíà÷åíèå t (à îíî âñåãäà íåîòðèöàòåëüíîå)
ëèáî îñòàåòñÿ ðàâíûì íóëþ, ëèáî óâåëè÷èâàåòñÿ íà åäèíè-
öó. Òàêèì îáðàçîì, êîëè÷åñòâî óâåëè÷åíèé ïðîïîðöèîíàëü-
íî (n – 1), íî îáùåå êîëè÷åñòâî óìåíüøåíèé â öèêëå While
(à îíî âñåãäà îñóùåñòâëÿåòñÿ íå ìåíåå ÷åì íà 1) íå ìîæåò
18 Ãëàâà 1. Ñòðîêè

ïðåâîñõîäèòü êîëè÷åñòâà óâåëè÷åíèé. Ñëåäîâàòåëüíî, t èç-


ìåíÿåòñÿ âíóòðè öèêëà While íå áîëåå (n – 1) ðàç, òàê ÷òî
ïîëíîå êîëè÷åñòâî ïðèñâàèâàíèé t îãðàíè÷åíî ñâåðõó âåëè-
÷èíîé 2(n – 1) = O(n). Èòàê, ìàññèâ br äëÿ S ôîðìèðóåòñÿ íå
çà âðåìÿ O(n3), êàê áûëî ðàññìîòðåíî ðàíåå, à çà âðåìÿ O(n).
Êàê ìîæíî âèäåòü, â ìàññèâå br ôèêñèðóþòñÿ ãðàíè âñåõ
ïîäñòðîê S[1..i], i = 1...n, èëè, äðóãèìè ñëîâàìè, âû÷èñëÿ-
þòñÿ ãðàíè âñåõ ïðåôèêñîâ ñòðîêè S. Àíàëîãè÷íóþ çàäà÷ó
ìîæíî ðåøèòü è äëÿ ñóôôèêñîâ ñòðîêè S, íàïðèìåð â ìàñ-
ñèâå bw ñôîðìèðîâàòü ãðàíè S[i..n], i=1..n. Íà ðèñ. 1.3 ïî-
êàçàíî, â ÷åì çàêëþ÷àåòñÿ îòëè÷èå ýòîãî ñïîñîáà îò
ïðåäûäóùåãî.

Ðèñ. 1.3. Ãðàíè:


à) ãðàíü ïðåôèêñà S[1..i] – br[i]; á) ãðàíü ñóôôèêñà S[i..n] – bw[i]

Ïðèìåð
 òàáë. 1.3 ïîêàçàíà ñòðîêà S è ìàññèâû ãðàíåé ïðåôèê-
ñîâ br è ñóôôèêñîâ bw äëÿ íåå.
Òàáëèöà 1.3

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
S a b a a b a b a a b a a b a b a a b a b a
br 0 0 1 1 2 3 2 3 4 5 6 4 5 6 7 8 9 10 11 7 8
bw 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 3 2 1 0 0

Ëîãèêà ôîðìèðîâàíèÿ çíà÷åíèé ýëåìåíòîâ ìàññèâà bw


àíàëîãè÷íà ðàíåå ðàññìîòðåííîé â ïðîöåäóðå
MaxBorderArray è èìååò âèä:
Procedure BorderRigth(S:String);
Var i,t:Word;
Begin
n:=Length(S);
bw[n]:=0;
For i:=n DownTo 2 Do Begin
t:=bw[i];
While (t>0) And (S[i-1]<>S[n-t]) Do t:=bw[n-t];
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 19

If S[i-1]=S[n-t] Then bw[i-1]:=t+1


Else bw[i-1]:=0;
End;
End;
Îáðàòèìñÿ òåïåðü ê îñíîâíîé çàäà÷å, ñôîðìóëèðîâàí-
íîé â ï. 1.1, — ê ïîèñêó âõîæäåíèÿ îáðàçöà P â òåêñò T.
Ïóñòü èìååòñÿ ñèìâîë $, íå ïðèíàäëåæàùèé àëôàâèòó A.
Ñôîðìèðóåì èç P è T ñòðîêó S = P$T è âû÷èñëèì br äëÿ S.
Ïðèìåðû
Íà ðèñ. 1.4 ïðèâåäåíû äâà ïðèìåðà òàêîãî ðåøåíèÿ çà-
äà÷è.  ïåðâîé ñòðîêå óêàçàíû íîìåðà ïîçèöèè ñèìâîëà â S,
âî âòîðîé — ñòðîêà S, à â òðåòüåé — çíà÷åíèÿ ýëåìåíòîâ
ìàññèâà br.

Ðèñ. 1.4. Äâà ïðèìåðà âû÷èñëåíèÿ br äëÿ ñòðîê òèïà S=P$T


Ðåøåíèå çàäà÷è äîñòàòî÷íî î÷åâèäíî.  ñôîðìèðîâàí-
íîì ìàññèâå br òðåáóåòñÿ íàéòè çíà÷åíèÿ, ðàâíûå äëèíå P,
à íîìåð ïîçèöèè i óêàçûâàåò íà ïðàâûé êîíåö ìåñòà âõîæäå-
íèÿ P â T. Çàäà÷à ðåøàåòñÿ çà âðåìÿ O(n + m).
Èòàê, â ìàññèâå ãðàíåé ôèêñèðóåòñÿ íåêàÿ èíôîðìàöèÿ
î ñòðóêòóðíîé îðãàíèçàöèè S, ïîçâîëÿþùàÿ ðåøàòü èñõîä-
íóþ çàäà÷ó áîëåå ýôôåêòèâíî, ò. å. çà ìåíüøåå âðåìÿ. Ïîä-
÷åðêíåì ñëåäóþùóþ ìûñëü îá ýòîì ïðèåìå (èëè ìåòîäå) èí-
ôîðìàòèêè: ââåäåíèå äîïîëíèòåëüíûõ ñòðóêòóð äàííûõ,
ýôôåêòèâíî ôîðìèðóåìûõ è ëèáî îïèñûâàþùèõ èñõîäíóþ
çàäà÷ó íåñêîëüêî èíà÷å, ëèáî ñòðóêòóðèðóþùèõ èíôîðìà-
öèþ îá èñõîäíûõ äàííûõ, — ýòî ïóòü ê íàõîæäåíèþ áîëåå
áûñòðîäåéñòâóþùèõ ìåòîäîâ ðåøåíèÿ çàäà÷.

1.2.2. Áëîêè ñòðîêè


Ñëîæíîñòü — ýòî ñóììà
ïðîñòûõ òðóäíîñòåé.
Ãåîðãèé Àëåêñàíäðîâ
Îïðåäåëåíèå
Áëîêîì (bloc) ñòðîêè S â ïîçèöèè i (bl[i]) íàçîâåì äëèíó
íàèáîëüøåé ïîäñòðîêè S, êîòîðàÿ íà÷èíàåòñÿ â i è ñîâïàäà-
åò ñ ïðåôèêñîì S.
20 Ãëàâà 1. Ñòðîêè

Äëÿ õðàíåíèÿ áëîêîâ ñòðîêè S íàèáîëåå åñòåñòâåííîé


ñòðóêòóðîé äàííûõ ÿâëÿåòñÿ ìàññèâ. Îïðåäåëèì åãî êàê
ìàññèâ áëîêîâ (bl).
Ïðèìåðû
Íà ðèñ. 1.5 ïðèâåäåíî âîñåìü ïðèìåðîâ âû÷èñëåíèÿ
ìàññèâà áëîêîâ ñòðîê.

Ðèñ. 1.5. Ïðèìåðû âû÷èñëåíèÿ bl äëÿ ðàçëè÷íûõ ñòðîê S

Ôîðìàëèçîâàííàÿ çàïèñü àëãîðèòìà âû÷èñëåíèÿ áëî-


êîâ ñòðîêè ñ âðåìåííîé ñëîæíîñòüþ O(n2) èìååò âèä:
Procedure Bloc(S:String); {Ìàññèâ bl - ãëîáàëüíûé}
Var i, j, n:Word;
Begin
n:=Length(S);
bl[1]:=0;
For i:=2 To n Do Begin
j:=i;
While (j<=n) And (S[j-i+1]=S[j]) Do j:=j+1;
bl[i]:=j-i;
End;
End;
Ïîñòàâèì âîïðîñ: ìîæíî ëè âû÷èñëÿòü áëîêè ñòðîêè àë-
ãîðèòìîì ñ ëèíåéíîé âðåìåííîé ñëîæíîñòüþ O(n)? Âåðîÿò-
íî, åäèíñòâåííûé âîçìîæíûé ïóòü — ýòî ó÷åò ïðè âû÷èñëå-
íèè î÷åðåäíîãî áëîêà èíôîðìàöèè î ðàíåå âû÷èñëåííûõ
áëîêàõ. Â ïðèâåäåííîì âûøå àëãîðèòìå ýòîãî íå äåëàåòñÿ, è
êàæäûé áëîê îïðåäåëÿåòñÿ êàê áû ñ íóëåâîé îòìåòêè.
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 21

Ââåäåì ôóíêöèþ ñðàâíåíèÿ (comparison) ïîäñòðîê ñòðî-


êè, êîòîðàÿ ïîëó÷àåò íîìåðà ïåðâûõ ñèìâîëîâ ïîäñòðîê (p1
è p2) è îïðåäåëÿåò äëèíó (êîëè÷åñòâî ñèìâîëîâ) ñîâïàäàþ-
ùåé ÷àñòè:
Function Cmp(p1,p2:Word):Word;
{Ñèìâîëû ñòðîêè S ñðàâíèâàþòñÿ, íà÷èíàÿ ñ ïîçèöèé p1
è p2: S[p1]=S[p2], S[p1+1]=S[p2+1], ..., äî ïåðâîãî
íåðàâåíñòâà ñèìâîëîâ èëè äî äîñòèæåíèÿ êîíöà ñòðîêè}
Var j,t:Word;
Begin
If (p1>n) Or (p2>n) Then Cmp:=0
Else Begin
If n-p1<n-p2 Then t:=n-p1 Else t:=n-p2;
{Îïðåäåëÿåì ìèíèìàëüíîå çíà÷åíèå äî êîíöà ñòðîêè}
j:=0;
While (j<=t) And (S[p1+j]=S[p2+j]) Do j:=j+1;
Cmp:=j;
End;
End;
Ïðè íàëè÷èè ýòîé ôóíêöèè ïðåäûäóùèé àëãîðèòì çà-
ïèñûâàåòñÿ â ñëåäóþùåì âèäå:
Procedure Bloc(S:String); {Ìàññèâ bl - ãëîáàëüíûé}
Var i, n:Word;
Begin
n:=Length(S);
bl[1]:=0;
For i:=2 To n Do
bl[i]:=Cmp(1,i);
End;
Ïðàâäà, äëÿ ðåøåíèÿ çàäà÷è íàìè ïîêà íè÷åãî íå ñäåëà-
íî, à ïðîâåäåíà ÷èñòî òåõíè÷åñêàÿ ïðàâêà àëãîðèòìà. Ïîý-
òîìó ïðîäîëæèì.
Äëÿ ëþáîé ïîçèöèè i > 1 çíà÷åíèå bl[i] > 0 îïðåäåëÿåò
ïðàâóþ ãðàíèöó i + bl[i] – 1 áëîêà, ñîâïàäàþùåãî ñ ïðå-
ôèêñîì S, íà÷èíàþùåãîñÿ â i è çàêàí÷èâàþùåãîñÿ â
i + bl[i] – 1. Íî ïîçèöèÿ i ñòðîêè ìîæåò «ïîêðûâàòüñÿ»
íåñêîëüêèìè áëîêàìè, ïîýòîìó âïîëíå åñòåñòâåííî áóäåò
îïðåäåëèòü ñàìîå ïðàâîå (íàèáîëüøåå) çíà÷åíèå r[i] =
= Max(j + bl[j] – 1) ïî âñåì 1 < j „ i.  êà÷åñòâå ëåâîé ãðà-
22 Ãëàâà 1. Ñòðîêè

íèöû l[i] ìû âîçüìåì ëåâóþ ãðàíèöó ëþáîãî áëîêà, ñîäåðæà-


ùåãî ïîçèöèþ i.
Ïðèìåð
 òàáë. 1.4 ïðèâåäåíû ñòðîêà S è âû÷èñëåííûå äëÿ íåå
çíà÷åíèÿ bl[i], à òàêæå r[i] è l[i].
Òàáëèöà 1.4

i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
S a b c a b d a b c a b e a b c a b d a b c a b c
bl 0 0 0 2 0 0 5 0 0 2 0 0 11 0 0 2 0 0 5 0 0 3 0 0
r 0 0 0 5 5 0 11 11 11 11 11 0 23 23 23 23 23 23 23 23 23 24 24 24
l 0 0 0 4 4 0 7 7 7 10 10 0 13 13 13 13 13 13 19 19 19 22 22 22

Ïóñòü âû÷èñëÿåòñÿ bl[i], è ïîçèöèÿ i íå âõîäèò íè â îäèí


ðàíåå âû÷èñëåííûé áëîê (ôàêòè÷åñêè íàì ïîòðåáóþòñÿ
òîëüêî ïîñëåäíèå çíà÷åíèÿ r è l, òàê ÷òî â èñïîëüçîâàíèè
ìàññèâîâ íåò íåîáõîäèìîñòè).
Ïóñòü i > r.  ýòîì ñëó÷àå ïðÿìûì ñðàâíåíèåì äî íåñîâ-
ïàäåíèÿ ïîäñòðîê, íà÷èíàþùèõñÿ ñ ïîçèöèè 1 è ñ ïîçèöèè i
(èëè äî èñ÷åðïàíèÿ ñòðîêè), îïðåäåëÿåòñÿ çíà÷åíèå bl[i].
Òîãäà r = i + bl[i] – 1 è l = i.
Ðàññìîòðèì òåïåðü âòîðîé ñëó÷àé: i „ r, ò. å. ïîçèöèÿ i
íàõîäèòñÿ â áëîêå. Î ÷åì ýòî ãîâîðèò? Òàêàÿ ñèòóàöèÿ ïîêà-
çàíà íà ðèñ. 1.6, è èç íåå ñëåäóåò, ÷òî ïðèíàäëåæíîñòü S[i]
áëîêó äàåò îñíîâàíèå óòâåðæäàòü î íàëè÷èè ïðåôèêñà S, ñîâ-
ïàäàþùåãî ñ äàííûì áëîêîì (íà ðèñ. 1.6 îí âûäåëåí ïóíê-
òèðíîé ëèíèåé). À çíà÷èò, â ïîçèöèè k = i – l + 1 íàõîäèòñÿ
ñèìâîë S[k], ðàâíûé S[i]. Áîëåå òîãî, ïîäñòðîêà S[i..r] äîëæ-
íà ñîâïàäàòü ñ ïîäñòðîêîé S[k..bl[i]]. Íî çíà÷åíèå bl[k] óæå
âû÷èñëåíî, è èçâåñòíî, ñ êàêîé ÷àñòüþ ïðåôèêñà S ñîâïàäàåò
ïîäñòðîêà, íà÷èíàþùàÿñÿ ñ ïîçèöèè k. Òîãäà ïîëó÷àåòñÿ,
÷òî ó íàñ åñòü âñå îñíîâàíèÿ óòâåðæäàòü î ñîâïàäåíèè ïîä-
ñòðîêè, íà÷èíàþùåéñÿ ñ ïîçèöèè i, è ïðåôèêñà S äëèíîé,
ðàâíîé ìèíèìóìó çíà÷åíèé bl[k] è r – i + 1.

Ðèñ. 1.6. Ïîçèöèÿ i íàõîäèòñÿ â áëîêå bl[i] ñ ãðàíèöàìè [l, r]


1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 23

Ëîãè÷åñêè ïðè íàõîæäåíèè i â áëîêå íåíóëåâîé äëèíû


âîçìîæíû ñëåäóþùèå ñèòóàöèè.
Ïåðâàÿ — êîãäà bl[k] < r – i + 1, ò. å. äëèíà ïðåôèêñà
S, ñîâïàäàþùåãî ñ ïîäñòðîêîé, íà÷èíàþùåéñÿ ñ ïîçèöèè k,
ìåíüøå, ÷åì «îñòàòîê» áëîêà bl[i]. Òîãäà bl[i] = bl[k] è çíà-
÷åíèÿ l, r íå èçìåíÿþòñÿ.
Âòîðàÿ ñèòóàöèÿ — ïðè bl[k] … r – i + 1 — áîëåå èíòå-
ðåñíà. Èìååò ìåñòî ïîëíîå ñîâïàäåíèå ïîäñòðîê S[k..bl[i]] è
S[i..r], íî îíî ìîæåò áûòü ïðîäîëæåíî, íà÷èíàÿ ñ ïîçèöèé
r + 1 è bl[i] + 1. Ñëåäîâàòåëüíî, íåîáõîäèìî íåïîñðåäñòâåí-
íûì ñðàâíåíèåì ïðîâåðèòü ñîâïàäåíèå ïîäñòðîê, íà÷èíàþ-
ùèõñÿ ñ ýòèõ ïîçèöèé. È åñëè ïðè ýòîì ïðîèçîéäåò q ñîâïà-
äåíèé, òî bl[i] = r – i + 1 + q, r = r + q, l = i.

 ôîðìàëèçîâàííîì âèäå ýòîò àëãîðèòì ìîæíî ïðåäñòà-


âèòü â ñëåäóþùåì âèäå:
Procedure Bloc(S:String);
{Ìàññèâ bl - ãëîáàëüíûé}
Var n,r,l,i,k,q:Word;
Begin
n:=Length(S);
r:=0;
l:=0;
bl[1]:=0;
For i:=2 To n Do Begin
bl[i]:=0;
If i>r Then Begin
bl[i]:=Cmp(1,i);
{Âû÷èñëÿåì äëèíó ñîâïàäåíèÿ ïîäñòðîê
è êîððåêòèðóåì, åñëè åñòü ñîâïàäåíèå,
çíà÷åíèÿ l è r}
If bl[i]>0 Then Begin
r:=i+bl[i]-1;
l:=i;
End
End
Else Begin {Ïîçèöèÿ i âõîäèò â áëîê}
k:=i-l+1;
If bl[k]<r-i+1 Then bl[i]:=bl[k]
Else Begin
24 Ãëàâà 1. Ñòðîêè

{Ðàçìåð áëîêà â ïîçèöèè k ïðåâûøàåò


"îñòàòîê" áëîêà, "ïîêðûâàþùåãî" ïîçèöèþ i}
bl[i]:=r-i+1;
l:=i;
q:=Cmp(r-i+2,r+1);
If q>0 Then Begin
{Åñòü äàëüíåéøåå ñîâïàäåíèå - óòî÷íÿåì
ðàçìåð áëîêà è åãî ïðàâóþ ãðàíèöó}
bl[i]:=bl[i]+q;
r:=i+bl[i]-1;
End;
End;
End;
End;
End;

Âðåìÿ ðàáîòû ýòîãî àëãîðèòìà âû÷èñëåíèÿ áëîêîâ ðàâ-


íî O(n). Ïðè ïîâåðõíîñòíîì àíàëèçå íåòðóäíî óâèäåòü, ÷òî
êîëè÷åñòâî èòåðàöèé (öèêë For) ïðîïîðöèîíàëüíî n, è åñòü
âíóòðåííèé öèêë While ïðè ðåàëèçàöèè ñðàâíåíèÿ ïîä-
ñòðîê, ò. å. âðåìåííàÿ îöåíêà äîëæíà áûëà áû ðàâíÿòüñÿ
O(n2). Íî öèêë While çàêàí÷èâàåòñÿ ïðè ïåðâîì íåñîâïàäå-
íèè ñèìâîëîâ. Åñëè äîïóñòèòü îäíè íåñîâïàäåíèÿ (êîãäà
âñÿ ñòðîêà ñîñòîèò èç ðàçëè÷íûõ ñèìâîëîâ), òî êîëè÷åñòâî
íåñîâïàäåíèé íå ïðåâûøàåò çíà÷åíèÿ n – 1. Ðàçáåðåìñÿ òå-
ïåðü ñ ñîâïàäåíèåì ñèìâîëîâ. Ñëåäóåò ïîíÿòü, ÷òî êàæäûé
ñèìâîë ñòðîêè ó÷àñòâóåò â ñîâïàäåíèè îäèí ðàç, ò. å. ïî-
âòîðíûõ ïðîâåðîê, íåñìîòðÿ íà âëîæåííûé öèêë While,
íåò. Âåðõíÿÿ ãðàíèöà r — ýòî êîëè÷åñòâî ïðîâåðåííûõ (ñî-
âïàâøèõ) ñèìâîëîâ. Åå çíà÷åíèå íå óìåíüøàåòñÿ, à òîëüêî
óâåëè÷èâàåòñÿ îò èòåðàöèè ê èòåðàöèè: ri … ri–1 äëÿ ëþáîãî
çíà÷åíèÿ i. Ïóñòü íà î÷åðåäíîé èòåðàöèè i ñèìâîë S[i] íàõî-
äèòñÿ â áëîêå, è âûïîëíåíî q ñðàâíåíèé, òîãäà ri óâåëè÷è-
âàåòñÿ íà çíà÷åíèå q. Îäíàêî âåðõíÿÿ ãðàíèöà áëîêîâ íå ïðå-
âîñõîäèò n, ñëåäîâàòåëüíî, îáùåå êîëè÷åñòâî ñîâïàäåíèé (íà
âñåõ èòåðàöèÿõ) òàêæå íå ïðåâîñõîäèò n. Òàêèì îáðàçîì, êî-
ëè÷åñòâî ñîâïàäåíèé è íåñîâïàäåíèé èìååò îöåíêó O(n).
Îáðàòèìñÿ â î÷åðåäíîé ðàç ê îñíîâíîé çàäà÷å, ñôîðìó-
ëèðîâàííîé â ï. 1.1, — ê ïîèñêó âõîæäåíèÿ îáðàçöà P â
òåêñò T. Àëãîðèòì åå ðåøåíèÿ ñ èñïîëüçîâàíèåì ìàññèâà
ãðàíåé áûë ðàññìîòðåí ðàíåå. Ìîæíî ëè èñïîëüçîâàòü äëÿ
ýòîé öåëè ìàññèâ áëîêîâ?
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 25

Ïóñòü èìååòñÿ ñèìâîë $, íå ïðèíàäëåæàùèé àëôàâèòó


A. Ñôîðìèðóåì èç P è T ñòðîêó S = P$T è âû÷èñëèì bl
äëÿ S.
Ïðèìåðû
Íà ðèñ. 1.7 ïðèâåäåíû äâà ïðèìåðà. Â ïåðâîé ñòðîêå
óêàçàíû íîìåðà ïîçèöèè ñèìâîëà â S, âî âòîðîé — ñòðîêà S,
à â òðåòüåé — çíà÷åíèÿ ýëåìåíòîâ ìàññèâà bl.

Ðèñ. 1.7. Äâà ïðèìåðà âû÷èñëåíèÿ bl äëÿ ñòðîê òèïà S=P$T

Ðåøåíèå ýòîé çàäà÷è äîñòàòî÷íî î÷åâèäíî.  ñôîðìèðî-


âàííîì ìàññèâå bl òðåáóåòñÿ íàéòè çíà÷åíèÿ, ðàâíûå äëèíå P.
Íîìåð ïîçèöèè i (i > n) ïðè ýòîì óêàçûâàåò íà ëåâûé êîíåö
ìåñòà âõîæäåíèÿ P â T. Çàäà÷à ðåøàåòñÿ çà âðåìÿ O(n + m).
Ïðèìå÷àíèå. Êàçàëîñü áû, çà÷åì íàì ïðîäîëæàòü ðàñ-
ñìàòðèâàòü ïðîáëåìó, åñëè äëÿ íåå óæå åñòü äâà ïðîñòûõ âà-
ðèàíòà ðåøåíèÿ? Îäíàêî çàäà÷è ìíîãî÷èñëåííûõ ïðèëîæå-
íèé, ñâîäÿùèõñÿ ê îáðàáîòêå ñòðîê, íå èñ÷åðïûâàþòñÿ ýòîé
ïðîñòîé ñõåìîé! Íàïðèìåð, ïðè ïîèñêå â ðåàëüíîì âðåìåíè
èëè îïåðàòèâíîé îáðàáîòêå äàííûõ (â ðåæèìå on-line), êîã-
äà äåéñòâèÿ îáÿçàíû âûïîëíÿòüñÿ ïî ìåðå ïîñòóïëåíèÿ èí-
ôîðìàöèè, âîçâðàùàòüñÿ ê ïîâòîðíûì îïåðàöèÿì ñ îòäåëü-
íûì ñèìâîëîì òåêñòà (èëè, â çàâèñèìîñòè îò çàäà÷è, îáðàç-
öà) íå ïðåäñòàâëÿåòñÿ âîçìîæíûì.

@ Óïðàæíåíèÿ
1. Â àëãîðèòìå íàõîæäåíèÿ íàèáîëüøåé ãðàíè ñòðîêè S ñ
âðåìåííîé ñëîæíîñòüþ O(n2) ïîèñê íà÷èíàëñÿ ñ íàè-
ìåíüøåãî âîçìîæíîãî çíà÷åíèÿ ãðàíè. Èçìåíèòå ýòîò
àëãîðèòì òàê, ÷òîáû ïîèñê íà÷èíàëñÿ ñ ìàêñèìàëüíî
âîçìîæíîãî çíà÷åíèÿ è ïðè íàõîæäåíèè ïåðâîãî ñîâïà-
äåíèÿ çàâåðøàë ðàáîòó.
2. Âû÷èñëèòå ìàññèâ ãðàíåé ïðåôèêñîâ è ñóôôèêñîâ äëÿ
ñòðîê:
l ab;
l abba;
l abbabaab;
26 Ãëàâà 1. Ñòðîêè

l abbabaabbaababba;
l abbabaabbaababbabaababbaabbabaab;
l abcab;
l abcabacabcbacbcacbabcabacabcb;
l abcabacabcbacbcacbabcabacabcbabcabacbcacbabc
abacabcbacbcacbacabcbabcabacbcacbacabcbacbca
cbabcabacbcacbacabcbabcabacabcbacbcacbabcaba
cabcbabcabacbcacbabcabacabcbacbcacbacabcb;
l aba;
l abaab;
l abaabaab;
l abaababaabaab;
l abaababaabaababaabaab;
l abaababaabaababaabaababaababaabaab.
3. Ðàçðàáîòàéòå ïðîãðàììó ïîèñêà P â T ñ èñïîëüçîâàíèåì
ìåòîäà âû÷èñëåíèÿ ìàññèâà ãðàíåé ïðåôèêñîâ. Ýêñïå-
ðèìåíòàëüíî îöåíèòå âðåìÿ åå ðàáîòû äëÿ ïðåäåëüíî
áîëüøèõ ñòðîê.
4. Ðàçðàáîòàéòå ïðîãðàììó ïîèñêà P â T ñ èñïîëüçîâàíèåì
ìåòîäà âû÷èñëåíèÿ ìàññèâà áëîêîâ. Ýêñïåðèìåíòàëüíî
îöåíèòå âðåìÿ åå ðàáîòû äëÿ ïðåäåëüíî áîëüøèõ ñòðîê.
5. Âîçüìèòå ïðîèçâîëüíóþ ñòðîêó S. «Ïåðåâåðíèòå» åå,
ò. å. ïîäâåðãíèòå ïðåîáðàçîâàíèþ:
S’:=’’;
For i:= n DownTo 1 Do S’:=S’+S[i]; {n=Length(S)}

Âû÷èñëèòå äëÿ S’ ìàññèâ ãðàíåé ñóôôèêñîâ bwt è óáå-


äèòåñü, ÷òî bwt[n – i + 1] = bw[i]. Äàéòå îáúÿñíåíèå ýòî-
ìó ôàêòó.
6. Ïîêàæèòå, ÷òî âðåìåííàÿ îöåíêà âû÷èñëåíèé ìàññèâà
ñóôôèêñîâ bw ÿâëÿåòñÿ ëèíåéíîé.
7. Êàê âçàèìîñâÿçàíû ãðàíè (ïðåôèêñîâ) è áëîêè ñòðîêè?
Ðàçðàáîòàéòå ïðîãðàììû äëÿ èõ âçàèìíîãî ïðåîáðàçî-
âàíèÿ.
1.2. Ìåòîäû ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê 27

Ìåòîäè÷åñêèé êîììåíòàðèé
Ïðè ðàññìîòðåíèè çàäà÷è òî÷íîãî ïîèñêà îáðàçöà â èçâåñò-
íûõ àâòîðó êíèãàõ1) íà ðóññêîì ÿçûêå îáû÷íî èñïîëüçóåòñÿ
îäèí èç ìåòîäîâ ïðåäâàðèòåëüíîãî àíàëèçà îáðàçöà. Ðàññìîò-
ðåíèå îáîèõ ìåòîäîâ è èõ èñïîëüçîâàíèå ïðè îáñóæäåíèè îñî-
áåííîñòåé àëãîðèòìîâ íå íàðóøàåò öåëîñòíîñòè èçëîæåíèÿ;
íàîáîðîò, òàêîé ïîäõîä ïîçâîëÿåò â î÷åðåäíîé ðàç ïîä÷åðê-
íóòü îñíîâíîå ïîëîæåíèå ïðîöåññà ïîëó÷åíèÿ ýôôåêòèâíûõ
àëãîðèòìîâ — «èç íè÷åãî íå ðîæäàåòñÿ íå÷òî». Äðóãèìè ñëî-
âàìè, äëÿ äîñòèæåíèÿ ðåçóëüòàòà òðåáóåòñÿ âûÿâèòü çàêîíî-
ìåðíîñòè â èñõîäíûõ äàííûõ è ïðåäñòàâèòü èõ â íîâûõ ñòðóê-
òóðàõ äàííûõ, èñïîëüçîâàíèå êîòîðûõ ïðèâîäèò ê ýôôåêòó
(ïî çàòðàòàì âðåìåíè ëèáî ïî ðàñõîäîâàíèþ ðåñóðñà ïàìÿòè)
ïðè ðåàëèçàöèè îñíîâíîé îáðàáîòêè (ëîãèêè àëãîðèòìà).

1)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ / ïåð. ñ àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.:
Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåðáóðã, 2003; Ñìèò Á. Ìåòîäû è àëãîðèòìû âû-
÷èñëåíèé íà ñòðîêàõ. — Ì.: ÎÎÎ «È. Ä. Âèëüÿìñ», 2005.
Ãëàâà 2

Êëàññè÷åñêèå àëãîðèòìû ðåøåíèÿ


çàäà÷ îáðàáîòêè ñòðîê

Íàì âûïàëî — ñòðåìèòüñÿ çà ïðåäåëû.


Çðÿ, ÷òî ëè, ñóùåñòâóþò íåáåñà?!
Ðîáåðò Áðàóíèíã

2.1. Àëãîðèòì Ä. Êíóòà – Äæ. Ìîððèñà –


Â. Ïðàòòà

Õðàíè â ïàìÿòè èìåíà âåëèêèõ


ëþäåé è â ñâîèõ ïîõîäàõ è äåéñòâèÿõ
ñ áëàãîðàçóìèåì ñëåäóé èõ ïðèìåðó.
Àëåêñàíäð Ñóâîðîâ

Ýòî — îäèí èç ñàìûõ èçâåñòíûõ àëãîðèòìîâ ðåøåíèÿ


çàäà÷è ïîèñêà îáðàçöà P â òåêñòå T, èìåþùèé âðåìåííóþ
îöåíêó O(n), ò. å. â íåì ïîèñê îáðàçöà îñóùåñòâëÿåòñÿ çà
âðåìÿ, ïðîïîðöèîíàëüíîå äëèíå òåêñòà. Â êàêîé-òî ìåðå
ýòîò ðåçóëüòàò ìîæíî ñ÷èòàòü «òî÷êîé îòñ÷åòà» â ñòðåìëå-
íèè ñïåöèàëèñòîâ ïî èíôîðìàòèêå ñîçäàòü íîâûå àëãîðèò-
ìû ðåøåíèÿ äàííîé êëàññè÷åñêîé çàäà÷è.
Çäåñü îáðàçåö, êàê è â ïðîñòîì àëãîðèòìå, ïîñëåäîâà-
òåëüíî «ïðèêëàäûâàåòñÿ» ê òåêñòó è îñóùåñòâëÿåòñÿ ïîøà-
ãîâîå ñðàâíåíèå ñèìâîëîâ. Íî åñëè â ïðîñòîì àëãîðèòìå ïî-
ñëå íåñîâïàäåíèÿ â êàêîé-òî ïîçèöèè îñóùåñòâëÿåòñÿ ñäâèã
íà îäíó ïîçèöèþ, òî â ðàññìàòðèâàåìîì, çà ñ÷åò ïðåäâàðè-
òåëüíîãî àíàëèçà P, ñäâèã âûïîëíÿåòñÿ â íåêîòîðûõ ñëó÷à-
ÿõ áîëåå ÷åì íà îäèí ñèìâîë.
Ïóñòü âû÷èñëåí ìàññèâ ãðàíåé P (ñì. ï. 1.2), èëè, äðóãè-
ìè ñëîâàìè, äëÿ êàæäîé ïîçèöèè i â P îïðåäåëåíà br[i] —
äëèíà íàèáîëüøåãî ñîáñòâåííîãî ñóôôèêñà P[1..i], ñîâïàäà-
þùåãî ñ ïðåôèêñîì P. Â òàáë. 2.1 äàí ïðèìåð P è åãî ìàññè-
âà ãðàíåé br.
2.1. Àëãîðèòì Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà 29

Òàáëèöà 2.1

i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
P a b c a e a b c a b c a
br 0 0 0 1 0 1 2 3 4 2 3 4
a b c a e a b c a b c a

Ïðåäïîëîæèì, ÷òî ïðîèçîøëî íåñîâïàäåíèå ñèìâîëîâ


ïðè i = 9 è ïðè íåêîòîðîé ïîçèöèè k òåêñòà T. Çíà÷åíèå
br[8] ãîâîðèò î íàëè÷èè ñóôôèêñà äëèíîé 3, ñîâïàäàþùåãî ñ
ïðåôèêñîì P. Çíà÷èò, ÷òîáû ýòîò ïðåôèêñ ñîâïàë ñ ñóôôèê-
ñîì, ñëåäóåò ñäâèíóòü P íà (8 – 3) = 5 ïîçèöèé. Ïðè ýòîì ãà-
ðàíòèðóåòñÿ ñîâïàäåíèå br[8] (ò. å. òðåõ) ñèìâîëîâ P ñ ñîîò-
âåòñòâóþùèìè ñèìâîëàìè T, òàê ÷òî ñëåäóþùåå ñðàâíåíèå
ñëåäóåò âûïîëíÿòü ìåæäó ñèìâîëàìè T[k] è P[br[8] + 1].
 ýòîì çàêëþ÷àåòñÿ âñÿ ñóòü ðàññìàòðèâàåìîãî àëãîðèò-
ìà: áëàãîäàðÿ çíàíèþ ñòðóêòóðû îáðàçöà P, àíàëèç êîòîðîé
âûïîëíÿåòñÿ çà ëèíåéíîå âðåìÿ, ìîæíî âûïîëíÿòü ñäâèã
ïðè ïîèñêå âõîæäåíèÿ P â T áîëåå ÷åì íà îäíó ïîçèöèþ.
Ïðè ýòîì ñèìâîë T[k] ó÷àñòâóåò â ñðàâíåíèè êàê ìèíèìóì
äâà ðàçà.
Ïðèìåð
Ïóñòü òðåáóåòñÿ â T=ababcxabdabcxabcxabcde íàéòè
âõîæäåíèÿ P=abcxabcde. Ìàññèâ ãðàíåé br=(0, 0, 0, 0, 1, 2,
3, 0, 0). Ïðîöåññ ïîèñêà ïðåäñòàâëåí â òàáë. 2.2.

Òàáëèöà 2.2

i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T a b a b c x a b d a b c x a b c x a b c d e
P a b c x a b c d e
a b c x a b c d e
a b c x a b c d e
a b c x a b c d e
a b c x a b c d e
a b c x a b c d e

Ïîñëå ïåðâîãî «ïðèêëàäûâàíèÿ» ïðîèñõîäèò äâà ñîâïà-


äåíèÿ ñèìâîëîâ, çàòåì â òðåòüåé ïîçèöèè — íåñîâïàäåíèå
(a¹c). Òàê êàê br[3]=0, òî îñóùåñòâëÿåòñÿ ñäâèã íà
(2 – 0) = 2 ïîçèöèè. Ïðè âòîðîì «ïðèêëàäûâàíèè» íåñîâ-
30 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ïàäåíèå ïðîèñõîäèò â 7-é ïîçèöèè P, òîãäà çíà÷åíèå íîâîãî


ñäâèãà îïðåäåëÿåòñÿ êàê (6 – br[6]) = (6 – 2) = 4. Äåéñòâè-
òåëüíî, ó ïîäñòðîêè P[1..6] åñòü ñóôôèêñ äëèíû 2, ñîâïà-
äàþùèé ñ ïðåôèêñîì P, è ýòîò ïðåôèêñ ñëåäóåò «ïðèëî-
æèòü» ê ÷àñòè òåêñòà T[7..8]. Çàòåì îñóùåñòâëÿåòñÿ ñðàâíå-
íèå ñèìâîëîâ T[9] (ïîâòîðíîå) è P[3]. Èìååò ìåñòî
íåñîâïàäåíèå è ñäâèã íà (2 – br[2]) = (2 – 0) = 2 ïîçèöèè
âïðàâî. Òåïåðü ñèìâîë T[9] ñðàâíèâàåòñÿ ñ P[1] è âûïîë-
íÿåòñÿ ñäâèã íà îäíó ïîçèöèþ. Ïîñëåäîâàòåëüíîå ñðàâíåíèå
ñèìâîëîâ T è P ïðè äàííîì «ïðèêëàäûâàíèè» äîñòèãàåò 8-é
ïîçèöèè. Çíà÷åíèå br[7] ðàâíî 3, ÷òî ãîâîðèò î íàëè÷èè ñóô-
ôèêñà èç òðåõ ñèìâîëîâ, ñîâïàäàþùåãî ñ ïðåôèêñîì P, è
ýòîò ïðåôèêñ ñëåäóåò «ðàçìåñòèòü» ïîä ñîîòâåòñòâóþùèìè
ñèìâîëàìè T[14..16], à äëÿ ýòîãî òðåáóåòñÿ âûïîëíèòü
ñäâèã íà (7 – 3) = 4 ïîçèöèè. Äàëåå íàõîäèòñÿ âõîæäåíèå P
â T, è ñëåäóåò çàìåòèòü, ÷òî åñëè áû òåêñò T ïðîäîëæàëñÿ,
òî ñëåäóþùèé ñäâèã (ïîñëå ôèêñàöèè âõîæäåíèÿ) âûïîë-
íÿëñÿ áû íà âñþ äëèíó P, èáî br[9] = 0.
Ïðèìå÷àíèå. Ìû çäåñü ãîâîðèì î «ñäâèãàõ» è «ïðèêëà-
äûâàíèÿõ», íî íàäî ïîíèìàòü, ÷òî ôàêòè÷åñêè íåò íèêàêèõ
ðåàëüíûõ ñäâèãîâ è ïðèêëàäûâàíèé ñòðîê! Èçìåíÿþòñÿ
ëèøü èíäåêñû ñîîòâåòñòâóþùèõ ýëåìåíòîâ T è P, ïîñêîëü-
êó ïðåäïîëàãàåòñÿ, ÷òî T è P ïðåäñòàâëåíû â ïàìÿòè
êîìïüþòåðà êàê ìàññèâû ñèìâîëüíîãî òèïà. (Ïðè äðóãîì
ñïîñîáå ïðåäñòàâëåíèÿ T è P èçìåíÿåòñÿ ñõåìà àäðåñàöèè ê
ñèìâîëàì, íî ñóòü îò ýòîãî íå ìåíÿåòñÿ.)

Ïðèìåð 1
Ïóñòü T = aaaaaaaaaaaa è P = aaaaa. Î÷åâèäíî, ÷òî P
âõîäèò â T (n – m + 1) = (12 – 5 + 1) = 8 ðàç. Ïîäñ÷èòàåì
êîëè÷åñòâî ñðàâíåíèé. Ïðè ïðîñòîì ìåòîäå ìû èìååì
(n – m + 1) · m = 40 ñðàâíåíèé. Ìàññèâ ãðàíåé br äëÿ P ðàâåí
(0, 1, 2, 3, 4). Ñõåìà ïîèñêà âõîæäåíèé ïî àëãîðèòìó Ä. Êíó-
òà – Äæ. Ìîððèñà – Â. Ïðàòòà ïîêàçàíà â òàáë. 2.3.
Ïîñëå íàõîæäåíèÿ ïåðâîãî âõîæäåíèÿ âû÷èñëÿåì çíà-
÷åíèå ñäâèãà. Îíî ðàâíî (5–br[5]) = (5–4) = 1. Äðóãèìè ñëî-
âàìè, ìû ñäâèãàåì ïîäñòðîêó ïðè îáíàðóæåíèè êàæäîãî
âõîæäåíèÿ íà îäíó ïîçèöèþ. Íî ñðàâíèâàåì ìû ïîñëå ñäâè-
ãîâ òîëüêî ïîñëåäíèé ñèìâîë P[5] ñ î÷åðåäíûì ñèìâîëîì T:
P[5] ñ T[6]; P[5] ñ T[7]; P[5] ñ T[8] è ò. ä. Òàêèì îáðàçîì, äëÿ
ïîèñêà âñåõ âõîæäåíèé òðåáóåòñÿ ëèøü n ñðàâíåíèé, â äàí-
íîì ñëó÷àå — 12, à íå 40.
2.1. Àëãîðèòì Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà 31

Òàáëèöà 2.3

i 1 2 3 4 5 6 7 8 9 10 11 12
T a a a a a a a a a a a a
P a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a

Ïðèìåð 2
Ïóñòü T = aaaaaaaaaaaa è P = aaaab. Êàê íåòðóäíî âè-
äåòü, P íå âõîäèò â T. Ïðîñòûì àëãîðèòìîì ýòîò ôàêò óñòà-
íàâëèâàåòñÿ çà 40 ñðàâíåíèé. Ìàññèâ ãðàíåé äëÿ P ðàâåí (0,
1, 2, 3, 0). Ñõåìà ïîèñêà âõîæäåíèÿ P â T ïî àëãîðèòìó
Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà ïðèâåäåíà â òàáë. 2.4.

Òàáëèöà 2.4

i 1 2 3 4 5 6 7 8 9 10 11 12
T a a a a a a a a a a a a
P a a a a b
a a a a b
a a a a b
a a a a b
a a a a b
a a a a b
a a a a b
a a a a b

Òàê êàê íåñîâïàäåíèÿ ïðîèñõîäÿò â ïîçèöèè P[5], òî âå-


ëè÷èíà ñäâèãà âñåãäà ðàâíà (4 – br[4]) = (4 – 3) = 1.  êàæ-
äîì ñëó÷àå ñèìâîëû T[5], T[6], ..., T[11] ïîâòîðíî ñðàâíèâà-
þòñÿ ñ ñèìâîëîì P[4], ò. å. äâàæäû ó÷àñòâóþò â ñðàâíåíèÿõ.
Îáùåå êîëè÷åñòâî ñðàâíåíèé ðàâíî (m – 1 + 2 · (n – m +
+ 1) – 1) = (2n – m). Ïîñëåäíåå âû÷èòàíèå åäèíèöû îá-
óñëîâëåíî òåì, ÷òî ñèìâîë T[n] ñðàâíèâàåòñÿ òîëüêî îäèí
ðàç. Äëÿ ðàññìàòðèâàåìîãî ïðèìåðà êîëè÷åñòâî ñðàâíåíèé
ðàâíî 19, à íå 40, êàê ïðè ïðîñòîì àëãîðèòìå (ñì. ï. 1.2).
32 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ôîðìàëèçîâàííàÿ çàïèñü àëãîðèòìà Ä. Êíóòà – Äæ. Ìîð-


ðèñà – Â. Ïðàòòà ïîèñêà P â T èìååò âèä:
Procedure KMP(T,P:String);
Var n, m, i, q:Word;
Begin
n:=Length(T);
m:=Length(P);
MaxBorderArray(P);
{Âû÷èñëÿåì çíà÷åíèÿ ýëåìåíòîâ ìàññèâà ãðàíåé br
(ï. 1.2)}
q:=0;
{Èíäåêñ ñðàâíèâàåìîãî ñèìâîëà îáðàçöà P}
For i:=1 To n Do Begin
{Èíäåêñ ñèìâîëà òåêñòà T}
While (q>0) And (P[q+1]<>T[i]) Do q:=br[q];
{Èìèòàöèÿ ñäâèãà}
If P[q+1]=T[i] Then q:=q+1;
If q=m Then Begin
WriteLn('Íàéäåíî âõîæäåíèå P â T ñ ïîçèöèè ',
i-m+1);
q:=br[m];
End;
End;
End;

 ïðèìåðå, ïðåäñòàâëåííîì â òàáë. 2.2, æèðíûì øðèô-


òîì áûë âûäåëåí ñëó÷àé, äàþùèé îñíîâàíèÿ äëÿ äàëüíåé-
øåãî óñîâåðøåíñòâîâàíèÿ àëãîðèòìà. Â ýòîò ìîìåíò ñèìâîë
T[9] ñðàâíèâàåòñÿ ñ P[7] (i = 9, q = 6). Ðàáîòàåò öèêë While
(ñì. ñîîîòâåòñòâóþùóþ ôîðìàëèçîâàííóþ çàïèñü), è çíà÷å-
íèå q ñòàíîâèòñÿ ðàâíûì 2 (br[6] = 2). Ïðîèñõîäèò ñðàâíå-
íèå T[9] ñ P[3]. Ðåçóëüòàò çàâåäîìî èçâåñòåí, èáî
P[3] = P[7], è óæå áûëî çàôèêñèðîâàíî íåñîâïàäåíèå ñèì-
âîëà P[7] ñ T[9]. Çàòåì q ïðèñâàèâàåòñÿ çíà÷åíèå 0
(br[2] = 0) è îñóùåñòâëÿåòñÿ ñðàâíåíèå T[9] ñ P[1], íî ýòî
óæå ñëåäóþùàÿ ñòðîêà òàáëèöû! Ìîæíî ëè èñêëþ÷èòü ýòè
ëèøíèå ñäâèãè?
Óòî÷íèì ïîíÿòèå ãðàíè. Äëÿ êàæäîé ïîçèöèè i ñòðîêè
S îïðåäåëèì brs[i] êàê äëèíó íàèáîëüøåãî ñîáñòâåííîãî
ñóôôèêñà S[1..i], ñîâïàäàþùåãî ñ ïðåôèêñîì S è òàêîãî, ÷òî
S[i + 1] ¹ S[brs[i] + 1]. Äðóãèìè ñëîâàìè, ñëåäóþùèé ñèì-
2.1. Àëãîðèòì Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà 33

âîë çà ïðåôèêñîì, ðàâíûì ñóôôèêñó, íå äîëæåí ñîâïàäàòü ñ


ñèìâîëîì S[i + 1].
 òàáë. 2.5 ïðèâåäåíû òðè ïðèìåðà âû÷èñëåíèÿ çíà÷å-
íèé óòî÷íåííûõ ãðàíåé. (Êîíå÷íî, çíà÷åíèÿ ýëåìåíòîâ ìàñ-
ñèâà brs ïîëó÷åíû íà îñíîâå âû÷èñëåííîãî ðàíåå ìàññèâà br.)
Òàáëèöà 2.5

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
S a b c x a b c d e
br 0 0 0 0 1 2 3 0 0
brs 0 0 0 0 0 0 3 0 0
S a b a a b a b a a b a a b
br 0 0 1 1 2 3 2 3 4 5 6 4 5
brs 0 0 1 0 0 3 0 1 0 0 6 0 5
S a b a a b a b a a b a a b a b a a b a b a
br 0 0 1 1 2 3 2 3 4 5 6 4 5 6 7 8 9 10 11 7 8
brs 0 0 1 0 0 3 0 1 0 0 6 0 0 3 0 1 0 0 11 0 8

Ïðèìå÷àíèå. Çíà÷åíèå brs[n] ïîëó÷åíî ïðè óñëîâèè,


÷òî ê S ïðèïèñûâàåòñÿ ñèìâîë, êîòîðîãî íåò â àëôàâèòå.

Åñëè â àëãîðèòìå Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà äëÿ


îïðåäåëåíèÿ âåëè÷èí ñäâèãîâ èñïîëüçîâàòü íå br, à brs, òî
ñäâèãè, î êîòîðûõ øëà ðå÷ü âûøå, èñêëþ÷àþòñÿ.  ðàññìàò-
ðèâàåìîì ïðèìåðå (ñì. òàáë. 2.2) brs[6] = 0, è ñäâèã, âûäåëåí-
íûé æèðíûì øðèôòîì â òàáë. 2.2, óæå íå âûïîëíÿåòñÿ.
Ïîëó÷åíèå brs èç br òðåáóåò ëèíåéíîãî âðåìåíè O(n) è
ðåàëèçóåòñÿ ñëåäóþùèì îáðàçîì:
Procedure Brst(S:String);
Var i, n:Word;
Begin
n:=Length(S);
brs[1]:=0;
For i:=2 To n Do
If S[br[i]+1]<>S[i+1] Then brs[i]:=br[i]
Else brs[i]:=brs[br[i]];
{Ñèìâîëû ñîâïàäàþò - áåðåì ðàíåå
ñôîðìèðîâàííîå çíà÷åíèå}
End;
34 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

 ñëó÷àå èñïîëüçîâàíèÿ êàê br, òàê è brs ïðè íåñîâïàäå-


íèè â ïîçèöèè q + 1 îáðàçöà P è ïîçèöèè i òåêñòà T ïðè
ñäâèãå P íà q – br[q] âïðàâî ëåâûå br[q] ñèìâîëîâ P ñîâïàäóò
ñ ñîîòâåòñòâóþùèìè ñèìâîëàìè â T. Ñëåäóþùåå ñðàâíåíèå
ñëåäóåò âûïîëíÿòü ìåæäó ñèìâîëàìè T[i] è P[br[q] + 1].
Äëÿ ïîëíîòû îáîñíîâàíèÿ íóæíî òàêæå ïîêàçàòü, ÷òî îáðà-
çåö P íå ñäâèãàåòñÿ ñëèøêîì äàëåêî, èëè, äðóãèìè ñëîâà-
ìè, ÷òî íå áóäóò ïðîïóùåíû âõîæäåíèÿ P â T. Ýòî èíòóè-
òèâíî ÿñíîå óòâåðæäåíèå (îíî ñëåäóåò èç îïðåäåëåíèÿ ìàñ-
ñèâà ãðàíåé è ëîãèêè ñäâèãà) äîêàçûâàåòñÿ ìåòîäîì «îò
ïðîòèâíîãî»: ïðåäïîëàãàåòñÿ, ÷òî ïðîïóùåíî òàêîå âõîæäå-
íèå è íàõîäèòñÿ ãðàíü, ïðåâîñõîäÿùàÿ ïî äëèíå çíà÷åíèå
br[q].
Àëãîðèòì Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà âûïîë-
íÿåòñÿ çà âðåìÿ O(n); ïðè ýòîì âðåìÿ, íåîáõîäèìîå äëÿ
ïðåäâàðèòåëüíîé îáðàáîòêè îáðàçöà P (äëÿ ôîðìèðîâàíèÿ
ìàññèâà ãðàíåé), ðàâíî O(m). Òîãäà îáùåå âðåìÿ — O(n+m).
Äåéñòâèòåëüíî, äëÿ îöåíêè âðåìåííîé ñëîæíîñòè àëãî-
ðèòìà Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà òðåáóåòñÿ ïîä-
ñ÷èòàòü êîëè÷åñòâî ñðàâíåíèé. Åñëè ðåçóëüòàò ñðàâíåíèÿ
P[q + 1] = T[i] îêàçûâàåòñÿ ïîëîæèòåëüíûì, òî çíà÷åíèÿ q
è i óâåëè÷èâàþòñÿ íà åäèíèöó è îáðàçåö P íå ñäâèãàåòñÿ îò-
íîñèòåëüíî T. Åñëè æå ðåçóëüòàò ñðàâíåíèÿ îòðèöàòåëüíûé
(ñèìâîëû íå ñîâïàäàþò), òî ïðè q = 0 çíà÷åíèå i óâåëè÷èâà-
åòñÿ íà åäèíèöó, à P ñäâèãàåòñÿ âïðàâî íà îäíó ïîçèöèþ.
Ïðè q > 0 çíà÷åíèå i íå ìåíÿåòñÿ è íàõîäèòñÿ ãðàíü (ïóòåì
ïðèñâîåíèÿ q:=br[q] èëè q:=brs[q]), äàþùàÿ ñîâïàäåíèå
P[q + 1] = T[i], ÷òî îáåñïå÷èâàåò òðåáóåìûé ñäâèã. Òàêèì
îáðàçîì, îáùåå êîëè÷åñòâî ñðàâíåíèé ñèìâîëîâ íå ïðåâîñ-
õîäèò n + t, ãäå t — êîëè÷åñòâî ñäâèãîâ, âûïîëíåííûõ àëãî-
ðèòìîì. Íî çíà÷åíèå t „ n – m + 1, ïîýòîìó îáùåå êîëè-
÷åñòâî ñðàâíåíèé íå ïðåâîñõîäèò çíà÷åíèÿ 2n.

@ Óïðàæíåíèÿ
1. Âûïîëíèòå òðàññèðîâêó àëãîðèòìà Ä. Êíóòà – Äæ. Ìîð-
ðèñà – Â. Ïðàòòà ñ èñïîëüçîâàíèåì êàê ìàññèâà ãðàíåé
br, òàê è ìàññèâà brs äëÿ ñëåäóþùèõ ïðèìåðîâ:
l T=abbabaabbaababba, P=abbab;
l T=abcabdabcabeabcabdabcabc, P=abda;
l T=abcabdabcabcabcabd, P=abcabc;
l T=abcabcabdabcabcabcb, P=abcabcabc.
2.1. Àëãîðèòì Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà 35

2. Äîêàæèòå óòâåðæäåíèå, ÷òî àëãîðèòì Ä. Êíóòà – Äæ. Ìîð-


ðèñà – Â. Ïðàòòà íå ïðîïóñêàåò âõîæäåíèé îáðàçöà P â
òåêñò T.
3. Ïóñòü îáðàçåö P è òåêñò T èìåþò âèä: P = (abcd)t è
T = (abcd)r, ãäå t è r — íàòóðàëüíûå ÷èñëà, ïðè÷åì t < r.
(Íàïðèìåð, ïóñòü t = 2, r = 5, òîãäà P = abcdabcd,
T = abcdabcdabcdabcdabcdabcd.) Ñêîëüêî ñðàâíå-
íèé ïîòðåáóåòñÿ àëãîðèòìó Ä. Êíóòà – Äæ. Ìîððèñà –
Â. Ïðàòòà äëÿ íàõîæäåíèÿ âñåõ âõîæäåíèé P â T?
4. Ðàçðàáîòàéòå ïîëíóþ âåðñèþ ïðîãðàììû ïîèñêà îáðàç-
öà â òåêñòå ïî àëãîðèòìó Ä. Êíóòà – Äæ. Ìîððèñà –
Â. Ïðàòòà.
5. Â àëãîðèòìå Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà îáðàçåö
P «ïðèêëàäûâàåòñÿ» ê ïîäñòðîêå T, è îíè ïîñèìâîëüíî
ñðàâíèâàþòñÿ ñëåâà íàïðàâî. Ïðè íåñîâïàäåíèè â êàêèõ-
ëèáî ïîçèöèÿõ q + 1 â P è i â T ïðè brs[q] > 0 îáðàçåö P
ñäâèãàåòñÿ âïðàâî íà q – brs[q] ìåñò. Ýòîò ñäâèã ãàðàíòè-
ðóåò ñîâïàäåíèå ïðåôèêñà P[1..brs[q]] ñ ïðèëåãàþùåé
ïîäñòðîêîé T, è äàëåå áóäóò ñðàâíèâàòüñÿ ñèìâîëû T[i] è
P[brs[q] + 1]. Ñäâèã, îñíîâàííûé íå íà br[q], à íà brs[q],
ãàðàíòèðóåò, ÷òî P[q + 1]<>P[brs[q] + 1], íî îí íå îáåñ-
ïå÷èâàåò ðàâåíñòâî T[i] è P[brs[q] + 1], ïîýòîìó ñèìâîë
T[i] âíîâü ó÷àñòâóåò â ñðàâíåíèè. Åñëè ââåñòè îãðàíè÷å-
íèå, ÷òî êàæäûé ñèìâîë T ìîæåò ó÷àñòâîâàòü â ñðàâíå-
íèè òîëüêî îäèí ðàç, òî ìîäèôèöèðîâàííûé àëãîðèòì
Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàòòà íàçûâàþò àëãîðèò-
ìîì ðåàëüíîãî âðåìåíè. Èçìåíèòå àëãîðèòì Ä. Êíóòà –
Äæ. Ìîððèñà – Â. Ïðàòòà óêàçàííûì îáðàçîì.
Ïðèìå÷àíèå. Äëÿ ýòîãî íóæíî ïðåîáðàçîâàòü îäíîìåð-
íûé ìàññèâ ãðàíåé brs[1..m] â äâóìåðíûé ìàññèâ
brsa[1..m, |A|], ãäå |A| — ìîùíîñòü êîíå÷íîãî èñïîëüçó-
åìîãî àëôàâèòà A, ñëåäóþùèì îáðàçîì. Ïóñòü x Î A.
Äëÿ êàæäîé ïîçèöèè q îáðàçöà P âû÷èñëèì brsa[q,x]
êàê òàêóþ ãðàíü P[1..q], ÷òî P[brs[q] + 1] = x. Ýòî ïðå-
îáðàçîâàíèå îñóùåñòâëÿåòñÿ çà ëèíåéíîå âðåìÿ. Äàëåå
ïðåäïîëîæèì, ÷òî ïðîèçîøëî íåñîâïàäåíèå ñèìâîëîâ
T[i] è P[q + 1] è ÷òî T[i] = x. Òîãäà îñóùåñòâëÿåòñÿ
ñäâèã P íà q – brsa[q,x] ïîçèöèé âïðàâî.  ýòîì ñëó÷àå
íå òîëüêî ïðåôèêñ P[1..brsa[q,x]] ñîâïàäàåò ñ ñîîòâåò-
ñòâóþùèìè ñèìâîëàìè T, íî è ñèìâîë T[i] ñîâïàäàåò
36 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ñ ñèìâîëîì P[brsa[q,x] + 1], ïîýòîìó ñëåäóþùåå ñðàâ-


íåíèå ñëåäóåò âûïîëíÿòü ìåæäó ñèìâîëàìè
P[brsa[q,x] + 2] è T[i + 1].

2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà


Íî êàê âû ñïåëèñü!
Èç ê/ô «Ïîêðîâñêèå âîðîòà»
 àëãîðèòìå Ð. Áîéåðà – Äæ. Ìóðà îáðàçåö ïåðåìåùàåòñÿ
ïî òåêñòó ñëåâà íàïðàâî, íî (è ýòî îòëè÷èòåëüíàÿ ÷åðòà!)
ñðàâíåíèå ñèìâîëîâ âûïîëíÿåòñÿ ñïðàâà íàëåâî, ò. å. ïåðâû-
ìè (ïðè ïåðâîì ïðèêëàäûâàíèè) ñðàâíèâàþòñÿ ñèìâîëû
P[m] è T[m]. Äàííûé àëãîðèòì ïîñëå åãî ïîÿâëåíèÿ èìååò,
âåðîÿòíî, íàèáîëüøåå êîëè÷åñòâî «ïðîäîëæàòåëåé»: ìíîãî-
÷èñëåííûå àâòîðû ðàçâèâàëè åãî è ïðåäëîæèëè ñâîè ìîäè-
ôèêàöèè ýòîãî àëãîðèòìà, ÿâëÿþùåãîñÿ, åñëè òàê ìîæíî âû-
ðàçèòüñÿ, ïåðåäîâûì, «ïèîíåðñêèì» â îïèñûâàåìîé ïðîáëå-
ìàòèêå.
Ïåðâàÿ ýâðèñòèêà àëãîðèòìà Ð. Áîéåðà – Äæ. Ìóðà çà-
êëþ÷àåòñÿ â òîì, ÷òî åñëè ñèìâîëà T[m] è ëþáîãî äðóãîãî,
ó÷àñòâóþùåãî â ñðàâíåíèè, íåò â P, òî îáðàçåö ìîæíî ñäâè-
íóòü çà ýòîò ñèìâîë. Òàê, åñëè ïðè ïåðâîì ïðèêëàäûâàíèè
P[m]¹T[m] è T[m] íåò â P, òî P ñäâèãàåòñÿ ñðàçó íà m ïîçèöèé,
è ñëåäóþùèìè ñèìâîëàìè, ïîäëåæàùèìè ñðàâíåíèþ, ÿâëÿ-
þòñÿ P[m] è T[2 · m]. Åñëè æå ñèìâîë T[m] åñòü â îáðàçöå P,
òî P ñëåäóåò ñäâèíóòü âïðàâî òàê, ÷òîáû ïîä ýòèì ñèìâîëîì
îêàçàëñÿ ñàìûé ïðàâûé ñèìâîë P, ñîâïàäàþùèé ñ T[m].
È åñëè ñàìîå ïðàâîå âõîæäåíèå T[m] íàõîäèòñÿ â ïîçèöèè q
îáðàçöà, òî âåëè÷èíà ñäâèãà îïðåäåëÿåòñÿ êàê m – q.
Ïðèìåð
 òàáë. 2.6 (ñòðîêè 1 è 2) ïðèâåäåíà èëëþñòðàöèÿ îïè-
ñàííûõ âûøå ñëó÷àåâ. Ñèìâîëà f (T[5]) íåò â îáðàçöå, è ïî-
ñëåäíèé ñäâèãàåòñÿ çà ýòîò ñèìâîë. Ñèìâîë æå b (T[10]) åñòü
â îáðàçöå, ïîýòîìó îñóùåñòâëÿåòñÿ ñäâèã íà 5 – 2 = 3 ïîçè-
öèè.
Ïðåäïîëîæèì, ÷òî ïðîèçîøëî ñðàâíåíèå P[m] è T[i] (íà-
ïðèìåð, êàê â ñòðîêå 3 òàáë. 2.6). Òîãäà äàëåå ñëåäóåò ñðàâ-
íèâàòü ïðåäøåñòâóþùèå ñèìâîëû â îáðàçöå è òåêñòå, ïîêà
âåñü îáðàçåö íå ñîâïàäåò ñ ïîäñòðîêîé òåêñòà (áóäåò íàéäåíî
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 37

Òàáëèöà 2.6

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
T a x b c f a b a x b a d a b a x a x a a d
1 P a b a x a
2 a b a x a
3 a b a x a
4 a b a x a
5 a b a x a
6 a b a x a
7 a b a x a
8 a b a x a

âõîæäåíèå) èëè ïîêà íå áóäåò âñòðå÷åíî íåñîâïàäåíèå.


 ïåðâîì ñëó÷àå (ñòðîêà 4 òàáë. 2.6) ôèêñèðóåòñÿ ôàêò
âõîæäåíèÿ, à çàòåì îáðàçåö ñäâèãàåòñÿ íà îäíó ïîçèöèþ
âïðàâî (ïîêà ïðåäïîëàãàåì ýòîò, íàèõóäøèé, âàðèàíò ñäâè-
ãà), è ïðîöåññ ïîèñêà ïðîäîëæàåòñÿ. Âî âòîðîì ñëó÷àå âîç-
ìîæíû äâà âàðèàíòà. Åñëè ñèìâîëà òåêñòà, íà êîòîðîì ïðî-
èçîøëî íåñîâïàäåíèå, íåò â îáðàçöå, òî ïîñëåäíèé ñäâèãàåò-
ñÿ âïðàâî çà ýòîò ñèìâîë. Â ñèòóàöèè æå, êîãäà ñèìâîë
òåêñòà åñòü â îáðàçöå, ïîä íèì íàäî ðàñïîëîæèòü ñàìûé ïðà-
âûé àíàëîãè÷íûé ñèìâîë îáðàçöà, îáåñïå÷èâ ñîîòâåòñòâóþ-
ùèé ñäâèã (ñòðîêà 5 òàáë. 2.6), íî òîëüêî òîãäà, êîãäà ýòîò
ñèìâîë íàõîäèòñÿ ñëåâà îò ìåñòà íåñîâïàäåíèÿ â îáðàçöå.
Ïðè åãî íàõîæäåíèè ñïðàâà (ñèìâîë x â ñòðîêå 6 òàáë. 2.6)
îáðàçåö ñäâèãàåòñÿ âïðàâî íà îäíó ïîçèöèþ. Îïèñàííàÿ ýâ-
ðèñòèêà íîñèò íàçâàíèå «ïðàâèëî ïëîõîãî ñèìâîëà».
Ïðèìåð
 òàáë. 2.7 ïðèâåäåíû ñäâèãè îáðàçöà P = abcxabcde
â òåêñòå T = ababcxcdedeaxaabcxabcde.
Ïðè ïåðâîì «ïðèêëàäûâàíèè» (ñòðîêà 1 â òàáë. 2.7) íå-
ñîâïàäåíèå ïðîèçîøëî ìåæäó ñèìâîëàìè T[6] = x è P[6] = b.
Ñèìâîë x åñòü â P íà ÷åòâåðòîì ìåñòå, ïîýòîìó âåëè÷èíà
ñäâèãà ðàâíà 6 – 4 = 2. Âî âòîðîé ñòðîêå ïðîèçîøëî íåñîâïà-
äåíèå T[9] ¹ P[7]. Ñèìâîë T[9] = e åñòü â P, íî îí íàõîäèòñÿ
ñïðàâà îò P[7], — çíà÷èò, îáðàçåö ñäâèãàåì íà îäíó ïîçèöèþ
âïðàâî. Â òðåòüåé ñòðîêå ïðîèçîøëî íåñîâïàäåíèå
T[12] ¹ P[9]. Ñàìûé ïðàâûé ñèìâîë a â P íàõîäèòñÿ íà ïÿòîì
38 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Òàáëèöà 2.7

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
T a b a b c x c d e d e a x a a b c x a b c d e
1 P a b c x a b c d e
2 a b c x a b c d e
3 a b c x a b c d e
4 a b c x a b c d e
5 a b c x a b c d e
6 a b c x a b c d e

ìåñòå, ñëåäîâàòåëüíî, âåëè÷èíà ñäâèãà — 9 – 5 = 4.  ÷åò-


âåðòîé ñòðîêå âíîâü ïðîèçîøëî íåñîâïàäåíèå T[16] ¹ P[9].
Ñàìûé ïðàâûé ñèìâîë b â P íàõîäèòñÿ íà øåñòîì ìåñòå —
ñäâèãàåì P íà 9 – 6 = 3 ïîçèöèè. Àíàëîãè÷íûå äåéñòâèÿ
ïðåäñòàâëåíû è â ïÿòîé ñòðîêå. Ïîñëå ñîâïàäåíèÿ P ñ ïîäñòðî-
êîé èç T (ñòðîêà 6) îáðàçåö, åñëè áû òåêñò íå çàêîí÷èëñÿ,
ñäâèíóëñÿ áû íà îäíó ïîçèöèþ âïðàâî (êàê â õóäøåì ñëó÷àå).
Ïåðåéäåì òåïåðü ê ôîðìàëüíîé ðåàëèçàöèè îïèñàííîé
ýâðèñòèêè. Äëÿ ôèêñàöèè ñàìîãî ïðàâîãî âõîæäåíèÿ ñèì-
âîëîâ àëôàâèòà (ïðåäïîëîæèì, ÷òî ýòî áóêâû ëàòèíñêîãî
àëôàâèòà îò a äî z) â P íàì íåîáõîäèì ìàññèâ — îáîçíà÷èì
åãî êàê bs. Ôîðìèðîâàíèå åãî çíà÷åíèé ìîæåò îñóùåñòâ-
ëÿòüñÿ ñëåäóþùèì îáðàçîì.
Procedure ShiftBadSymbol;
{Ìàññèâ bs (bs:Array['a'..'z'] Of Integer),
òàê æå êàê îáðàçåö P è êîëè÷åñòâî ñèìâîëîâ m â P, –
ãëîáàëüíûå ïåðåìåííûå}
Var i:Integer;
q:Char;
Begin
For q:='a' To 'z' Do bs[q]:=0;
{Íà÷àëüíàÿ èíèöèàëèçàöèÿ}
For i:=1 To m Do bs[P[i]]:=i;
End;

Ïðîñòîé àëãîðèòì ïîèñêà îáðàçöà â òåêñòå (ñì. ï. 1.1)


ñ ââîäîì ðàññìîòðåííîé ýâðèñòèêè èçìåíÿåòñÿ íåïðèíöè-
ïèàëüíî. Öèêë For çàìåíÿåòñÿ íà öèêë While (÷òî åñòåñò-
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 39

âåííî), è â ñëó÷àå íåñîâïàäåíèÿ ñèìâîëîâ ïðè î÷åðåäíîì


ïðèêëàäûâàíèè âåëè÷èíà èçìåíåíèÿ èíäåêñà i ôîðìèðóåò-
ñÿ ñ ïîìîùüþ ñôîðìèðîâàííîãî ìàññèâà bs — ìàññèâà ïîçè-
öèé ñàìîãî ïðàâîãî âõîæäåíèÿ ñèìâîëîâ àëôàâèòà â îáðà-
çåö P:
Procedure BadSymbol;
Var i,j:Word;
Begin
i:=1;
While i<=(n-m+1) Do Begin
j:=m;
While (j>=1) And (P[j]=T[i+j-1]) Do j:=j-1;
If j=0 Then Begin
WriteLn('îáðàçåö ',P,' âõîäèò â ',T,
' ñ ïîçèöèè ',i);
i:=i+1;
End
Else i:=i+Max(1,j-bs[t[i+j-1]]);
{Ôóíêöèÿ Max – íàõîæäåíèå ìàêñèìàëüíîãî
èç äâóõ öåëûõ ÷èñåë}
End;
End;
«Ïðàâèëî ïëîõîãî ñèìâîëà» ìîæíî óëó÷øèòü. Â ìàññè-
âå bs õðàíÿòñÿ òîëüêî ïîçèöèè ñàìîãî ïðàâîãî âõîæäåíèÿ
ñèìâîëîâ â îáðàçåö P, ïîýòîìó ýòî ïðàâèëî îáåñïå÷èâàåò
ñäâèã áîëåå ÷åì íà îäíó ïîçèöèþ ïðè íåñîâïàäåíèÿõ, áëèç-
êèõ ê ïðàâîìó êîíöó îáðàçöà. Åñëè æå ïðàâîå âõîæäåíèå
ñèìâîëà ïðîéäåíî, ïðîèçîøëî íåñîâïàäåíèå ëåâåå åãî ïðà-
âîãî âõîæäåíèÿ â îáðàçåö è ñèìâîëîì T ÿâëÿåòñÿ ýòîò ñèì-
âîë, òî ñäâèã âûïîëíÿåòñÿ íà îäíó ïîçèöèþ. Åñëè òåïåðü
ìàññèâ bs ïðåîáðàçîâàòü â äâóìåðíóþ ñòðóêòóðó äëÿ õðàíå-
íèÿ ìåñòà áëèæàéøåãî ïîÿâëåíèÿ ñèìâîëîâ â P ñëåâà îò
êàæäîé ïîçèöèè i, òî òà æå ýâðèñòèêà äàñò âîçìîæíîñòü âû-
ïîëíÿòü áîëüøèå ñäâèãè ïðè ïîèñêå.

Ïðèìåð
Ïóñòü P = abcdabdccbad. Äâóìåðíûé ìàññèâ bs
(òàáë. 2.8) ñîäåðæèò äàííûå î áëèæàéøèõ ëåâûõ âõîæäåíè-
ÿõ ñèìâîëîâ â îáðàçåö. Òàê, P[12] = d, ïðè÷åì ñëåâà â P ñèì-
âîë d ïîâòîðÿåòñÿ íà 7-ì ìåñòå.
40 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Òàáëèöà 2.8

1 2 3 4 5 6 7 8 9 10 11 12
a 0 1 5
b 0 2 6
c 0 3 8
d 0 4 7
...

Ìàññèâ bs ìîæíî îðãàíèçîâàòü è íåñêîëüêî èíà÷å —


òàê, êàê ïîêàçàíî â òàáë. 2.9, êîãäà ôîðìèðóþòñÿ ñïèñêè
âõîæäåíèÿ êàæäîãî ñèìâîëà â îáðàçåö.

Òàáëèöà 2.9

1 2 3 4
a 11 5 1 0
b 10 6 2 0
c 9 8 3 0
d 12 7 4 0

Ëîãèêà ôîðìèðîâàíèÿ ìàññèâà bs äëÿ ðàñøèðåííîãî


«ïðàâèëà ïëîõîãî ñèìâîëà» ïðåòåðïåâàåò íåçíà÷èòåëüíîå
èçìåíåíèå:
Procedure ShiftBadSymbol;
{Ìàññèâ bs (bs:Array['a'..'z',0..NMax] Of Integer),
òàê æå êàê îáðàçåö P è êîëè÷åñòâî ñèìâîëîâ m â P, –
ãëîáàëüíûå ïåðåìåííûå}
Var i:Integer;
q:Char;
Begin
For q:='a' To 'z' Do
For i:=0 To m Do bs[q,i]:=0;
{Íà÷àëüíàÿ èíèöèàëèçàöèÿ}
For i:=m DownTo 1 Do Begin
bs[P[i],0]:=bs[P[i],0]+1;
bs[P[i],bs[P[i],0]]:=i;
End;
End;
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 41

Ôîðìàëèçîâàííàÿ çàïèñü ðàñøèðåííîãî «ïðàâèëà ïëî-


õîãî ñèìâîëà» èìååò âèä:
Procedure BadSymbol;
Var i,j,k:Word;
w:Char;
Begin
i:=1;
While i<=(n-m+1) Do Begin
j:=m;
While (j>=1) And (P[j]=T[i+j-1]) Do j:=j-1;
If j=0 Then Begin
WriteLn('îáðàçåö ',P,' âõîäèò â ',T,
' ñ ïîçèöèè ',i);
i:=i+1;
End
Else Begin
k:=1;
w:=T[i+j-1];
While (k<=bs[w,0]) And (bs[w,k]>j) Do k=k+1;
i:=i+Max(1,j-bs[w,k]]);
{Ôóíêöèÿ Max – íàõîæäåíèå ìàêñèìàëüíîãî
èç äâóõ öåëûõ ÷èñåë}
End;
End;
End;

Ïðåæäå ÷åì ïåðåéòè ê îáñóæäåíèþ âòîðîé ýâðèñòèêè,


ðàçáåðåì ñëó÷àé âõîæäåíèÿ P â T. Äî ýòîãî ìîìåíòà ïðåäïî-
ëàãàëîñü, ÷òî ñäâèã â ýòîé ñèòóàöèè îñóùåñòâëÿåòñÿ íà îäíó
ïîçèöèþ. À ìîæíî ëè ñäåëàòü ýòî áîëåå ýôôåêòèâíî?

Ïðèìåð
Ïóñòü T = abaabaabaababaabaaba, à P = abaaba. Â
òàáë. 2.10 ïîêàçàíû çíà÷åíèÿ ñäâèãîâ ïðè ïîèñêå âõîæäå-
íèé P â T.
Ïðè ïåðâîì ïðèêëàäûâàíèè P ñîâïàëî ñ ïîäñòðîêîé èç T.
Ñäâèã íà îäíó ïîçèöèþ íåðàöèîíàëåí, åñëè ñôîðìèðîâàí
ìàññèâ ãðàíåé (br, ñì. ï. 1.2.1) äëÿ P, — â äàííîì ïðèìåðå
br = (0, 0, 1, 1, 2, 3). Ïðàâäà, â äàííîì ñëó÷àå äîñòàòî÷íî
òîëüêî çíà÷åíèÿ br[m], êîòîðîå ãîâîðèò î òîì, ÷òî ó P åñòü
ñóôôèêñ ýòîé äëèíû, ñîâïàäàþùèé ñ ñîáñòâåííûì ïðåôèê-
42 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Òàáëèöà 2.10

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
T a b a a b a a b a a b a b a a b a a b a
1 P a b a a b a
2 a b a a b a
3 a b a a b a
4 a b a a b a
5 a b a a b a
6 a b a a b a
7 a b a a b a

ñîì, è êàê ýòîò ñóôôèêñ, òàê è ýòîò ïðåôèêñ ñðàâíèâàëèñü


ñ ñîîòâåòñòâóþùèìè ñèìâîëàìè T, èáî ó íàñ çàôèêñèðîâàíî
ñîâïàäåíèå. Ñëåäîâàòåëüíî, ïðè ñäâèãå íà m – br[m] ïîçè-
öèé (à ìåíüøèå ñäâèãè ïðèâîäÿò òàê èëè èíà÷å ê íåñîâïàäå-
íèþ P ñ ñîîòâåòñòâóþùåé ïîäñòðîêîé T) ïåðâûå br[m] ñèì-
âîëîâ P áóäóò ñîâïàäàòü ñ ñèìâîëàìè èç T. Â íàøåì ïðèìåðå
â ñòðîêàõ 1, 2, 3, 6 òàáë. 2.10 P ñäâèãàåòñÿ îòíîñèòåëüíî T íà
òðè ïîçèöèè. Íî èç ýòîãî ïðèìåðà ïðÿìî «áüåò â ãëàçà» åùå
îäíî âîçìîæíîå óëó÷øåíèå àëãîðèòìà! Òàê, â ñòðîêå 1 íàé-
äåíî âõîæäåíèå P â T, è ìû âûïîëíèëè ñäâèã íà
m – br[m] = 6 – 3 = 3 ïîçèöèè. Ñèìâîëû ïðåôèêñà P äëè-
íîé br[m] ñîâïàäàþò ñ ñîîòâåòñòâóþùèìè ñèìâîëàìè T. Òîã-
äà â ñòðîêå 2 ñëåäóåò ñðàâíèâàòü òîëüêî ñèìâîëû T[9] ñ P[6];
T[8] ñ P[5] è T[7] ñ P[4].  îáùåì æå ñëó÷àå, åñëè ïîñëå ñäâèãà
P[m] «ïðèëîæåí» ê T[k], íàäî ñðàâíèâàòü ñèìâîëû P[m] ...
P[m – br[m] + 1] ñ T[k], ..., T[k – br[m] + 1].

Ïóñòü íà ñòàäèè ïðåäâàðèòåëüíîé îáðàáîòêè ó íàñ ñôîð-


ìèðîâàí ìàññèâ ãðàíåé br (ï. 1.2.1, ïðîöåäóðà
MaxBorderArray). Òîãäà ðåàëèçàöèÿ ðàçîáðàííîãî âûøå ñëó-
÷àÿ îáðàáîòêè (ïðè âõîæäåíèè P â T) ïðèâîäèò ê ñëåäóþùèì
èçìåíåíèÿì ïåðâîãî âàðèàíòà ïðîöåäóðû BadSymbol (íàçîâåì
ìîäèôèöèðîâàííóþ ëîãèêó ïðîöåäóðîé BadSymbolJump).
 ïåðåìåííîé jump ìû ôèêñèðóåì ìåñòî â P, äî êîòîðîãî
ñëåäóåò îñóùåñòâëÿòü ñðàâíåíèå ñèìâîëîâ P è T, íà÷èíàÿ ñ
ïîñëåäíåãî ñèìâîëà â ñîîòâåòñòâèè ñ ëîãèêîé ìåòîäà
Ð. Áîéåðà – Äæ. Ìóðà.
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 43

Procedure BadSymbolJump;
Var i,j,jump:Integer;
Begin
i:=1;
jump:=1;
While i<=(n-m+1) Do Begin
j:=m;
While (j>=jump) And (P[j]=T[i+j-1]) Do j:=j-1;
If j=jump-1 Then Begin
WriteLn('îáðàçåö ',P,' âõîäèò â ',
T, ' ñ ïîçèöèè ',i);
i:=i+br[m];
jump:=m-br[m]+1;
{Ïðè íîâîì ïðèêëàäûâàíèè ñðàâíèâàåì P è T
òîëüêî äî ýòîé ïîçèöèè}
End
Else Begin
i:=i+Max(1,j-bs[t[i+j-1]]);
jump:=1;
{Ïîêà íàì íåèçâåñòíî, êàê ðàáîòàòü
ñ ïåðåìåííîé jump â ýòîì ñëó÷àå}
End;
End;
End;

Ïåðåéäåì òåïåðü ê îáñóæäåíèþ âòîðîé ýâðèñòèêè àëãî-


ðèòìà Ð. Áîéåðà – Äæ. Ìóðà — ê «ïðàâèëó õîðîøåãî ñóô-
ôèêñà».  ÷åì ñîñòîèò åãî ñóòü è êàê îáåñïå÷èòü íàèáîëü-
øèå èç âîçìîæíûõ ñäâèãè îáðàçöà îòíîñèòåëüíî òåêñòà?
Ïóñòü îáðàçåö P ïðèëîæåí ê òåêñòó T è îñóùåñòâëÿåòñÿ
ñðàâíåíèå ñèìâîëîâ ñëåâà íàïðàâî. Ïóñòü ïðè ýòîì óñïåø-
íî, ò. å. ñ ïîëîæèòåëüíûì ðåçóëüòàòîì, âûïîëíåíû ñðàâíå-
íèÿ äëÿ ïîäñòðîêè w, è ñèìâîëû íå ñîâïàäàþò â ïîçèöèè q
îáðàçöà (ðèñ. 2.1). Òðåáóåòñÿ âûïîëíèòü ñäâèã P îòíîñè-
òåëüíî T íà êàê ìîæíî áîëüøåå êîëè÷åñòâî ïîçèöèé, íî
òàê, ÷òîáû íå ïðîïóñòèòü âõîæäåíèÿ P â T.

Ðèñ. 2.1. Îñíîâíàÿ èäåÿ «ïðàâèëà õîðîøåãî ñóôôèêñà»


44 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Î÷åâèäíî, ÷òî åñëè áû ìû çíàëè ñàìîå ïðàâîå âõîæäå-


íèå w â P, ò. å. ïîçèöèþ j (ðèñ. 2.1), òî P ìîæíî áûëî
áû ñäâèíóòü âïðàâî íà q + 1 – j ïîçèöèé (èëè íà
m – (j + |w| – 1) ). Òàêèì îáðàçîì, îñíîâíàÿ èäåÿ ñäâèãîâ ïî
«ïðàâèëó õîðîøåãî ñóôôèêñà» â àëãîðèòìå Ð. Áîéåðà –
Äæ. Ìóðà çàêëþ÷àåòñÿ â òîì, ÷òîáû íà ñòàäèè ïðåäâàðè-
òåëüíîé îáðàáîòêè çà ëèíåéíîå âðåìÿ (îò m) ïðîàíàëèçèðî-
âàòü ñòðóêòóðó P íà ïðåäìåò çíàíèÿ î âõîæäåíèè ñóôôèê-
ñîâ â îáðàçåö è èñïîëüçîâàòü ýòè çíàíèÿ íà ñòàäèè ïîèñêà
âõîæäåíèé P â T.
Íà ðèñ. 2.1 â ïîçèöèè q óêàçàí ñèìâîë a, à â ïîçèöèè
j – 1 — ñèìâîë b. Ýòè ñèìâîëû ïðåäøåñòâóþò ïîäñòðîêàì w
â P. Åñëè áû ýòè ñèìâîëû ñîâïàäàëè, òî ñìûñë ñäâèãà íà
q + 1 – j ïîçèöèé òåðÿëñÿ áû, ïîñêîëüêó P[q] íå ñîâïàäàåò ñ
ñîîòâåòñòâóþùèì ñèìâîëîì T. Ïðè P[q] ¹ P[j – 1] îáû÷íî
ãîâîðÿò î «ñèëüíîì ïðàâèëå õîðîøåãî ñóôôèêñà», à åñëè ýòî
óñëîâèå íå ðàññìàòðèâàåòñÿ (êàê â ïåðâîíà÷àëüíîì âàðèàí-
òå àëãîðèòìà Ð. Áîéåðà – Äæ. Ìóðà), òî ïðîñòî î «ïðàâèëå
õîðîøåãî ñóôôèêñà».
Íàïîìíèì ìåòîäû ïðåäâàðèòåëüíîé îáðàáîòêè îáðàçöà
çà ëèíåéíîå âðåìÿ, ðàññìîòðåííûå â ï. 1.2 (ðèñ. 2.2).

Ðèñ. 2.2. Îáùèå ñõåìû ìåòîäîâ ïðåäâàðèòåëüíîé îáðàáîòêè îáðàç-


öà: à) âû÷èñëåíèå ãðàíåé; á) âû÷èñëåíèå áëîêîâ

Ãðàíüþ ñòðîêè S ìû íàçûâàåì ëþáîé ñîáñòâåííûé ïðå-


ôèêñ, ðàâíûé ñóôôèêñó S. Åñòåñòâåííûì îáîáùåíèåì ïðè
ýòîì ÿâëÿåòñÿ ïîíÿòèå íàèáîëüøåé ãðàíè. Âû÷èñëåíèå ãðà-
íåé äëÿ âñåõ ïîäñòðîê S[1..i] (i=1..m) ïðèâîäèò ê ïîíÿòèþ
ìàññèâà ãðàíåé br. Çíà÷åíèå br[q] ãîâîðèò î òîì, ÷òî èìååòñÿ
íàèáîëüøèé ñóôôèêñ w ïîäñòðîêè S[1..q], ñîâïàäàþùèé ñ
ïðåôèêñîì S (ðèñ. 2.2à).
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 45

Áëîê ñòðîêè S â ïîçèöèè q åñòü äëèíà íàèáîëüøåé ïîä-


ñòðîêè S, íà÷èíàþùåéñÿ â ïîçèöèè q è ñîâïàäàþùåé ñ ïðå-
ôèêñîì S (ðèñ. 2.2á).
Êàê ãðàíè ñòðîêè, òàê è åå áëîêè âû÷èñëÿþòñÿ çà ëè-
íåéíîå âðåìÿ, íî â «÷èñòîì» âèäå íå îòâå÷àþò òðåáîâàíèÿì
àëãîðèòìà Ð. Áîéåðà – Äæ. Ìóðà, èáî â äàííîì ñëó÷àå ðå÷ü
äîëæíà èäòè î âõîæäåíèÿõ ñóôôèêñîâ â S.
Âîçìîæåí ñëåäóþùèé ïåðåõîä îò èìåþùèõñÿ ìåòîäîâ
ïðåäâàðèòåëüíîé îáðàáîòêè ê òðåáîâàíèÿì àëãîðèòìà
Ð. Áîéåðà – Äæ. Ìóðà. «Ïåðåâåðíåì» P â P’, íàïðèìåð ñòðî-
êó P = abcdef ïðåîáðàçóåì â P’= fedcba (ýòà îïåðàöèÿ
òðåáóåò ëèíåéíîãî âðåìåíè). Äëÿ P’ ïîäñ÷èòàåì ìàññèâ
áëîêîâ bl (ðèñ. 2.3). Êàêàÿ èíôîðìàöèÿ îòíîñèòåëüíî èñõîä-
íîé ñòðîêè áóäåò ïðè ýòîì çàëîæåíà â bl? Îòíîñèòåëüíî èñ-
õîäíîé ñòðîêè P èç äàííûõ ïî áëîêàì ïåðåâåðíóòîé ñòðîêè
ìîæíî ïîëó÷èòü èíôîðìàöèþ î äëèíàõ íàèáîëüøèõ ñóô-
ôèêñîâ ïîäñòðîê P[1..i], ñîâïàäàþùèõ ñ ñóôôèêñîì ïîëíîé
ñòðîêè P. Ñôîðìèðóåì ýòè äëèíû äëÿ êàæäîé ïîäñòðîêè
P[1..i] â ìàññèâå bsuf. Äëÿ ýòîãî òðåáóåòñÿ:
1) ïîëó÷èòü P’ èç P;
2) âû÷èñëèòü ìàññèâ bl[i] (i = 1..m) äëÿ P’;
3) âûïîëíèòü ôðàãìåíò ëîãèêè:
For i:=1 To m Do bsuf[i]:=bl[m–i+1]
Íà ðèñ. 2.3 ïðèâåäåí ïðèìåð ñòðîêè P. Ìàññèâ bl ñôîð-
ìèðîâàí äëÿ ñòðîêè P’. Çíà÷åíèå bl[4] = 2. Ñ îäíîé ñòîðîíû
(ñì. âåðõíþþ ÷àñòü ðèñ. 2.3), ýòî ãîâîðèò î òîì, ÷òî ñ ïîçè-
öèè 4 â P’ åñòü ïîäñòðîêà äëèíû 2, ñîâïàäàþùàÿ ñ ïðåôèê-
ñîì P’, à ñ äðóãîé — ÷òî â P åñòü ïîäñòðîêà äëèíû 2, ïðàâûé
êîíåö êîòîðîé çàêàí÷èâàåòñÿ â ïîçèöèè 12, è ýòà ïîäñòðîêà

Ðèñ. 2.3. Ïðèìåð, èëëþñòðèðóþùèé, êàê áëîêè ïåðåâåðíóòîé


ñòðîêè îïèñûâàþò âõîæäåíèå ñóôôèêñîâ èñõîäíîé ñòðîêè
46 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ñîâïàäàåò ñ ñóôôèêñîì P èç äâóõ ñèìâîëîâ.  íèæíåé ÷àñòè


ðèñ. 2.3 ýòà ñõåìà èëëþñòðèðóåòñÿ äëÿ çíà÷åíèÿ bl[7].  P’
åñòü ïîäñòðîêà èç ÷åòûðåõ ñèìâîëîâ ñ íà÷àëîì â ïîçèöèè 7,
ñîâïàäàþùàÿ ñ ïðåôèêñîì P’, à â P ñóôôèêñ äëèíîé 4 ïî-
âòîðÿåòñÿ, íà÷èíàÿ ñ ïîçèöèè 9 âëåâî. Ïðè ýòîì ñèìâîëû,
ïðåäøåñòâóþùèå ñóôôèêñó è ïîäñòðîêå, íå ñîâïàäàþò, ÷òî
ñëåäóåò èç ïðàâèëà ôîðìèðîâàíèÿ ìàññèâà áëîêîâ bl. Ìàñ-
ñèâ bsuf äëÿ ïðèìåðà íà ðèñ. 2.3 ðàâåí (1, 0, 2, 0, 2, 1, 0, 0, 4,
1, 0, 2, 0, 0, 0).
Îäíàêî äëÿ ðåàëèçàöèè ëîãèêè Ð. Áîéåðà – Äæ. Ìóðà
òðåáóåòñÿ óêàçàíèå íå íà äëèíû âõîæäåíèé ñóôôèêñîâ, à íà
êðàéíèå ïðàâûå (èëè ëåâûå) ïîçèöèè âõîæäåíèÿ êîïèé
ýòèõ ñóôôèêñîâ (ñì. ðèñ. 2.1). Ïîýòîìó ìàññèâ äëèí ñëåäóåò
ïðåîáðàçîâàòü â ìàññèâ ïîçèöèé (psuf), ïðè÷åì èç âñåõ âîç-
ìîæíûõ äëèí òðåáóåòñÿ âûáèðàòü òó, êîòîðàÿ äàåò íàèáîëü-
øåå çíà÷åíèå ïðàâîé ãðàíèöû âõîæäåíèÿ ñóôôèêñà. Äðóãè-
ìè ñëîâàìè, äëÿ êàæäîé ïîçèöèè i çíà÷åíèå psuf[i] îïðåäå-
ëÿåò íàèáîëüøóþ ïîçèöèþ, òàêóþ, ÷òî P[i..m] ñîâïàäàåò ñ
ñóôôèêñîì ïîäñòðîêè P[1..psuf[i]].
Äëÿ ïðèìåðà íà ðèñ. 2.3 ìàññèâ psuf = (0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 9, 0, 12, 10). Ýòî çíà÷èò, ÷òî ñóôôèêñ
P[1..10] = P[15..15], ñóôôèêñ P[1..12] = P[14..15], à ñóô-
ôèêñ P[1..9] = P[12..15]. Äåéñòâèòåëüíî, bsuf[9] = 4 (j = 9),
ò. å. ïîäñòðîêà èç ÷åòûðåõ ñèìâîëîâ âëåâî îò ïîçèöèè 9 ñî-
âïàäàåò ñ ñóôôèêñîì P. Ëåâàÿ ãðàíèöà ñóôôèêñà P âû÷èñ-
ëÿåòñÿ êàê i = m – bsuf[9] + 1 = 15 – 4 + 1 = 12. Òàêèì îá-
ðàçîì, psuf[i]:=j, èëè psuf[12] = 9.
Èòàê, ôîðìèðîâàíèå psuf îñóùåñòâëÿåòñÿ ïî ñëåäóþ-
ùåé ëîãèêå:
For i:=1 To m Do psuf[i]:=0;
For j:=1 To m-1 Do Begin
i:=m–bsuf[j]+1;
psuf[i]:=j;
End;
Ðåçþìèðóåì ïåðâóþ ÷àñòü «ñèëüíîãî ïðàâèëà õîðîøåãî
ñóôôèêñà». Ïóñòü â íàøåì ïðèìåðå íà ðèñ. 2.3 ïîñëå ïðèêëà-
äûâàíèÿ P ê òåêñòó íåñîâïàäåíèå ïðîèçîøëî â îäèííàäöàòîé
ïîçèöèè (q = 11, ñì. ðèñ. 2.1). Çíà÷åíèå psuf[12] = 9. Ïîñëå
ñäâèãà P íà m – psuf[q+1] ïîçèöèé íà ìåñòå ñóôôèêñà P ðàç-
ìåùàåòñÿ åãî ñàìàÿ ïðàâàÿ êîïèÿ (âûðàæåíèå q – i + 1 —
ñì. ðèñ. 2.1 — ïðåîáðàçóåòñÿ â m – psuf[q+1]).
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 47

À ìîæíî ëè ïîñòðîèòü ëîãèêó ñäâèãîâ â ýòîì ñëó÷àå, èñ-


ïîëüçóÿ èäåþ âû÷èñëåíèÿ ãðàíåé ñòðîêè?  ï. 1.2.1 âû÷èñ-
ëÿëèñü ãðàíè êàê ïîäñòðîê P[1..i] — ãðàíè ïðåôèêñîâ, òàê
è ïîäñòðîê P[i..m] — ãðàíè ñóôôèêñîâ (i = 1..m). Î÷åâèäíî,
ïîñêîëüêó ñðàâíåíèÿ â àëãîðèòìå Ð. Áîéåðà – Äæ. Ìóðà
èäóò ñëåâà íàïðàâî, áîëåå ïðèåìëåì âòîðîé âàðèàíò.
Ïðèìåð
 òàáë. 2.11 ïðèâåäåí ïðèìåð ñòðîêè (îáðàçöà) P.  ìàñ-
ñèâå bw ôèêñèðóþòñÿ ãðàíè ñóôôèêñîâ ñòðîêè. Òàê,
bw[6] = 4 ãîâîðèò î òîì, ÷òî ñ øåñòîé ïîçèöèè íà÷èíàåòñÿ
ïîäñòðîêà P[6..9] äëèíîé â ÷åòûðå ñèìâîëà, êîòîðàÿ ñîâïà-
äàåò ñ ñóôôèêñîì P[12..15]. Ìàññèâ ãðàíåé ñóôôèêñîâ âû-
÷èñëÿåòñÿ ñ ïîìîùüþ ïðîöåäóðû BorderRigth (ñì.
ï. 1.2.1). Â ìàññèâå bwt ôèêñèðóþòñÿ ãðàíè ñóôôèêñîâ, íî
ñ äîïîëíèòåëüíûì óñëîâèåì: ñèìâîëû, ïðåäøåñòâóþùèå
ïîäñòðîêå P[i..m], è ãðàíè ýòîé ïîäñòðîêè íå ñîâïàäàþò,
èëè, äðóãèìè ñëîâàìè, P[i – 1]<>P[m – bw[i]]. Òîãäà ëîãè-
êà âû÷èñëåíèé èìååò ñëåäóþùèé âèä:
Procedure BorderGRigth(P:String);
Var i:Word;
Begin
bwt[m]:=0;
For i:=m-1 DownTo 1 Do
If P[m-bw[i]]<>P[i-1]
Then bwt[i]:=bw[i]
Else bwt[i]:=bwt[bw[i]];
End;

Òàáëèöà 2.11

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
P a b a b a a b b a a b a b b a
bw 1 2 1 2 1 4 3 2 1 1 2 1 0 0 0
bwt 1 2 0 2 0 4 0 0 0 1 2 0 0 0 0
pbwt 0 0 0 0 0 0 0 0 0 0 0 6 0 11 10

Ïîñëå ðàññìîòðåíèÿ ýòîãî ïðèìåðà ñòàíîâèòñÿ ÿñíî, ÷òî


íåîáõîäèìûå âåëè÷èíû ñäâèãîâ â «ïðàâèëå õîðîøåãî ñóô-
ôèêñà» (ìàññèâ pbwt) ôîðìèðóþòñÿ èç çíà÷åíèé bwt çà îäèí
øàã. Ïðè ýòîì äëÿ êàæäîé ïîçèöèè i òðåáóåòñÿ óêàçàòü, åñòü
48 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ëè ñóôôèêñ P[i..m] â P, è åñëè åñòü, òî óêàçàòü ãðàíèöó


(íèæíþþ èëè âåðõíþþ) ñàìîãî ïðàâîãî åãî âõîæäåíèÿ â P,
ïðè÷åì ñèìâîëû, ïðåäøåñòâóþùèå ñóôôèêñó è åãî êîïèè,
äîëæíû íå ñîâïàäàòü. Ëîãèêà ýòîãî øàãà:
Procedure GudSuf(S:String);
Var i,j:Word;
Begin
For i:=1 To m Do pbwt[i]:=0;
For j:=1 To m Do Begin
i:=m-bwt[j]+1;
pbwt[i]:=j;
End;
End;
 ïðèìåðå (òàáë. 2.11) pbwt[12] = 6. Ýòî îçíà÷àåò, ÷òî
P[12..15] = P[6..9] è ñèìâîëû P[11] ¹ P[5]. Òîãäà åñëè ïðè
ñðàâíåíèè P ñ T ñîâïàäåíèå íå ïðîèçîøëî â ïîçèöèè q = 11,
òî P ìîæíî ñäâèíóòü îòíîñèòåëüíî T íà q + 1 – pbwt[q + 1]
ïîçèöèé âïðàâî.
Òåïåðü ó íàñ îñòàëñÿ îòêðûòûì åùå îäèí ëîãè÷åñêè âîç-
ìîæíûé ñëó÷àé (ïî êðàéíåé ìåðå, íà òåêóùèé ìîìåíò ðàñ-
ñìîòðåíèÿ àëãîðèòìà): êîãäà âõîæäåíèÿ êîïèè ñóôôèêñà â
îáðàçåö P íåò, ò. å. ñîîòâåòñòâóþùèé ýëåìåíò ìàññèâà psuf
èëè pbwt ðàâåí íóëþ. Ñäâèã íà îäíó ïîçèöèþ ïðè ýòîì âðÿä
ëè ðàöèîíàëåí. Çäåñü òðåáóåòñÿ íàéòè íàèáîëüøåå çíà÷åíèå
j (ðèñ. 2.4), òàêîå, ÷òî P[1..j] ÿâëÿåòñÿ ñóôôèêñîì ñòðîêè
P[q + 1..m]. Äðóãèìè ñëîâàìè, èùåòñÿ íàèáîëüøàÿ ãðàíü P
ïðè óñëîâèè j < m – q. Òàê êàê ïîäñòðîêà P[q + 1..m] ñîâïà-
ëà ñ ñîîòâåòñòâóþùåé ïîäñòðîêîé T, òî:
1) ìû èìååì ïðàâî ñäâèíóòü îáðàçåö P íà m – j ïîçèöèé,
òàê êàê ìåíüøèå ñäâèãè, èñõîäÿ èç ñòðóêòóðû P è ôàêòà
ïðîèçîøåäøèõ ñðàâíåíèé ñ T, ïðèâåäóò ê íåñîâïàäå-
íèÿì;
2) ïîñëå ñäâèãà ïåðâûå j ñèìâîëîâ P è òå ñèìâîëû T, ê êî-
òîðûì îíè ïðèëîæåíû, áóäóò ñîâïàäàòü.

Ðèñ. 2.4. Íàèáîëüøèé ïðåôèêñ P, ñîâïàäàþùèé ñ ñóôôèêñîì P,


ïðè óñëîâèè, ÷òî j < m – q
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 49

Íàéòè çíà÷åíèå j äëÿ êàæäîãî P[q] (ñôîðìèðîâàòü ýëå-


ìåíòû ìàññèâà, êîòîðûé ìû íàçîâåì brsuf) ñëåäóåò íà ñòàäèè
ïðåäâàðèòåëüíîé îáðàáîòêè. Ïóñòü ìàññèâ ãðàíåé br ïîëó-
÷åí. Äëÿ ôîðìèðîâàíèÿ brsuf òðåáóåòñÿ çíàòü ýëåìåíòû óáû-
âàþùåé ïîñëåäîâàòåëüíîñòè br[m], br2[m], ..., brk[m] = 0.
Òîãäà äëÿ êàæäîãî òàêîãî q, ÷òî 0 < q „ m – br[m], ïîëîæèì
brsuf[q] = br[m]. Òàê, äëÿ çíà÷åíèé q èç èíòåðâàëà m – br[m] <
< q „ m – br2[m] ìû èìååì brsuf[q] = br2[m] è ò. ä. Î÷åâèä-
íî, ÷òî ìàññèâ brsuf ïðè èçâåñòíîì br âû÷èñëÿåòñÿ çà ëèíåé-
íîå âðåìÿ.
Procedure BrSuff;
Var l,t,q:Word;
Begin
l:=0;
t:=br[m];
For q:=1 To m Do Begin
If (q>l) And (q<=m-t) Then brsuf[q]:=t;
If q=m-t Then Begin
l:=m-t;
t:=br[t];
End;
End;
End;
Äîñòàòî÷íî î÷åâèäíî, ÷òî â ýòîì ñëó÷àå, ïî àíàëîãèè
ñ âõîæäåíèåì P â T, ïåðåìåííîé jump, îïðåäåëÿþùåé, äî
êàêîé ïîçèöèè P íåîáõîäèìî âûïîëíÿòü ñðàâíåíèÿ ïðè ñëå-
äóþùåì ïðèêëàäûâàíèè ê T, ñëåäóåò ïðèñâîèòü çíà÷åíèå
brsuf[q].
Ñ ó÷åòîì âñåãî âûøåñêàçàííîãî òðåáóåòñÿ èçìåíèòü ñëå-
äóþùèé ôðàãìåíò ðàññìîòðåííîé ðàíåå ïðîöåäóðû Search:
Begin
i:=i+Max(1,j-bs[t[i+j-1]]);
jump:=1;
{Ïîêà íàì íå èçâåñòíî, êàê ðàáîòàòü
ñ ïåðåìåííîé jump â ýòîì ñëó÷àå}
End;
Âûáåðåì âòîðîé ñïîñîá ðåàëèçàöèè «ïðàâèëà õîðîøåãî
ñóôôèêñà» — ÷åðåç ìàññèâ ãðàíåé — è áóäåì ñ÷èòàòü, ÷òî íà
50 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ñòàäèè ïðåäâàðèòåëüíîé îáðàáîòêè P âû÷èñëåíû çíà÷åíèÿ


ýëåìåíòîâ ìàññèâîâ bs, br, pbwt, brsuf. Òîãäà ìû ïîëó÷èì
ñëåäóþùóþ ëîãèêó ýòîãî ôðàãìåíòà:
Begin
If pbwt[j+1]=0 Then v:=m-brsuf[j+1]
Else v:=j+1-pbwt[j+1];
q:=Max(v,j-bs[t[i+j-1]];
i:=i+q;
If q=m-brsuf[j+1] Then jump:=q
Else jump:=1;
End;
Îöåíêà âðåìåíè ðàáîòû àëãîðèòìà Ð. Áîéåðà – Äæ. Ìóðà —
ýòî áîëåå ñëîæíàÿ çàäà÷à, ÷åì äëÿ àëãîðèòìà Ä. Êíóòà –
Äæ. Ìîððèñà – Â. Ïðàòòà. Åé ïîñâÿùåíû ìíîãî÷èñëåííûå
òåîðåòè÷åñêèå è ïðàêòè÷åñêèå èññëåäîâàíèÿ. Ïîêàçàíî, ÷òî
ñðåäíåå êîëè÷åñòâî âûïîëíÿåìûõ áóêâåííûõ ñðàâíåíèé ÿâ-
ëÿåòñÿ ïî÷òè ëèíåéíîé ôóíêöèåé îò äëèíû òåêñòà. Äëÿ òåê-
ñòîâ íà åñòåñòâåííîì ÿçûêå ýòà îöåíêà èìååò âèä 0,3 · n (ïðè
óñëîâèè, ÷òî äëèíà îáðàçöà áîëüøå 10, íî íàìíîãî ìåíüøå
çíà÷åíèÿ n). Àëãîðèòì æå Ä. Êíóòà – Äæ. Ìîððèñà – Â. Ïðàò-
òà â ýòîé ñèòóàöèè òðåáóåò 1,0 · n áóêâåííûõ ñðàâíåíèé.
Îäíàêî àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà «ïëîõî ñåáÿ âåäåò»
íà êðàòíûõ ñòðîêàõ, à â õóäøåì ñëó÷àå èìååò òî÷íî òàêóþ
æå âðåìåííóþ îöåíêó, ÷òî è ïðîñòîé àëãîðèòì ïîèñêà îáðàç-
öà â òåêñòå, ò. å. O(m · n).

@ Óïðàæíåíèÿ
1. Ðàçðàáîòàéòå ïðîãðàììó ïîèñêà P â T òîëüêî ñ èñïîëüçî-
âàíèåì «ïðàâèëà ïëîõîãî ñèìâîëà» (ðàññìîòðèòå êàê
ïðîñòîé ñëó÷àé, òàê è óëó÷øåííûé). Îöåíèòå âðåìÿ åå
ðàáîòû íà ðàçëè÷íûõ òåñòîâûõ ïðèìåðàõ, âêëþ÷àÿ ñëó-
÷àé, êîãäà P = am, T = an (m < n). Ñðàâíèòå âðåìÿ ðàáîòû
ýòîé ïðîãðàììû ñ âðåìåííûìè õàðàêòåðèñòèêàìè îáû÷-
íîãî àëãîðèòìà ïîèñêà îáðàçöà â òåêñòå.
2. Èçìåíèòå ðåøåíèå óïðàæíåíèÿ 1 òàê, ÷òîáû ïðè íà-
õîæäåíèè P â T ñäâèã P îòíîñèòåëüíî T îñóùåñòâëÿëñÿ
íå íà îäíó ïîçèöèþ, à íà çíà÷åíèå, îïðåäåëÿåìîå ìàêñè-
ìàëüíîé äëèíîé ïðåôèêñà P, ñîâïàäàþùåãî ñ ñóôôèê-
ñîì P.
2.2. Àëãîðèòì Ð. Áîéåðà – Äæ. Ìóðà 51

3. Ïðèâåäèòå ïðèìåð ñòðîêè P è âûïîëíèòå âðó÷íóþ ñëå-


äóþùèå äåéñòâèÿ:
l «ïåðåâåðíèòå» P â P’;
l âû÷èñëèòå ìàññèâ áëîêîâ bl äëÿ P’;
l ïðåîáðàçóéòå ìàññèâ bl â bsuf — ìàññèâ äëèí íàèáîëü-
øèõ ñóôôèêñîâ ïîäñòðîê P[1..i], ñîâïàäàþùèõ ñ ñóô-
ôèêñîì ïîëíîé ñòðîêè P;
l ïðåîáðàçóéòå ìàññèâ bsuf â ìàññèâ ïîçèöèé psuf, îïðå-
äåëÿþùèé êðàéíèå ïðàâûå ïîçèöèè âõîæäåíèÿ ñóô-
ôèêñîâ P â îáðàçåö P (ïðè ýòîì íåîáõîäèìî ó÷åñòü, ÷òî
åñëè ïîçèöèÿ i âõîäèò â íåñêîëüêî âõîæäåíèé, òî ñëå-
äóåò âûáèðàòü âõîæäåíèå, äàþùåå íàèáîëüøåå çíà÷å-
íèå ïðàâîé ãðàíèöû).

4. Ïðèâåäèòå ïðèìåð ñòðîêè P è âûïîëíèòå âðó÷íóþ ñëå-


äóþùèå äåéñòâèÿ:
l âû÷èñëèòå ìàññèâ bw ãðàíåé ñóôôèêñîâ ñòðîêè;
l ïðåîáðàçóéòå ìàññèâ bw â ìàññèâ bwt, îïðåäåëÿþùèé
ãðàíè ñóôôèêñîâ ñòðîêè, íî ñ äîïîëíèòåëüíûì óñëî-
âèåì, ÷òî ñèìâîëû, ïðåäøåñòâóþùèå ïîäñòðîêå
P[i..m], è ãðàíè ýòîé ïîäñòðîêè íå ñîâïàäàþò;
l ïðåîáðàçóéòå ìàññèâ äëèí bwt â ìàññèâ íîìåðîâ ïîçè-
öèé pbwt.
5. Îïðåäåëèòå, èìåþòñÿ ëè îøèáêè â ñëåäóþùåì âàðèàíòå
ðåàëèçàöèè àëãîðèòìà Ð. Áîéåðà – Äæ. Ìóðà. Â ëþáîì
ñëó÷àå íàéäèòå âîçìîæíîñòü îïòèìèçèðîâàòü ïðîãðàìì-
íûé êîä:
Procedure Search;
Var i, j, jump, v, q: Integer;
Begin
jump:=1;
i:=1;
While (i<=n–m+1) Do Begin
j:=m;
While (j>=jump) And (P[j]=T[i+j–1]) Do
j:=j+1;
If j=jump–1 Then Begin
WriteLn('îáðàçåö âõîäèò â òåêñò
ñ ïîçèöèè: ',i);
i:=i+Max(1, br[m]);
jump:=m–br[m]+1;
52 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

End
Else Begin
If pbwt[j+1]=0 Then v:=m–brsuf[j+1]
Else v:=j+1–pbwt[j+1];
q:=Max(v,j–bs[t[i+j-1]]);
i:=i+q;
If q=m–brsuf[j+1] Then jump:=q
Else jump:=1;
End;
End;
End;

2.3. Àëãîðèòì Ð. Êàðïà – Ì. Ðàáèíà


Ìàòåìàòèêà ìîæåò îòêðûòü
îïðåäåëåííóþ ïîñëåäîâàòåëüíîñòü
äàæå â õàîñå.
Ãåðòðóäà Ñòàéí

Àëãîðèòì Ð. Êàðïà – Ì. Ðàáèíà â «èäåéíîì» ïëàíå êàð-


äèíàëüíî îòëè÷àåòñÿ îò ðàññìîòðåííûõ ðàíåå ìåòîäîâ, è åãî
èçó÷åíèå — ýòî íåîáõîäèìàÿ ñîñòàâëÿþùàÿ îáðàçîâàíèÿ
ñïåöèàëèñòà ïî èíôîðìàòèêå, ïîêàçûâàþùàÿ, êàê, êàçà-
ëîñü áû, «íà ðîâíîì ìåñòå» ìîæíî íàõîäèòü íîâûå ðåçóëü-
òàòû ïî ïðåîäîëåíèþ îãðàíè÷åííîñòè êîìïüþòåðà.
Îãðàíè÷åíèå íà àëôàâèò — A = {0, 1}. Ýòî íå ñòîëü
ïðèíöèïèàëüíî, èáî, â êîíå÷íîì ñ÷åòå, ñòðîêó âïîëíå ìîæ-
íî òðàêòîâàòü êàê äâîè÷íóþ ïîñëåäîâàòåëüíîñòü. Ïóñòü P
åñòü äâîè÷íàÿ ïîñëåäîâàòåëüíîñòü äëèíû m, à T — äâîè÷-
íàÿ ïîñëåäîâàòåëüíîñòü äëèíû n. Êàê ìîæíî ðåàëèçîâàòü
ïîèñê âõîæäåíèÿ P â T?
Îáðàçåö P ïðåîáðàçóåì â äåñÿòè÷íîå ÷èñëî òðàäèöèîííûì
îáðàçîì (ïåðåâîä ÷èñëà èç äâîè÷íîé ñèñòåìû ñ÷èñëåíèÿ â
m
äåñÿòè÷íóþ íàçîâåì ïðåîáðàçîâàíèåì H) — H(P) = å 2m - i P[i].
i =1
Àíàëîãè÷íóþ îïåðàöèþ âûïîëíèì è äëÿ T, íà÷èíàÿ ñ ïîçè-
m
öèè r, — H(Tr ) = å 2m - i P[r + i - 1]. Î÷åâèäíî, ÷òî åñëè
i =1
H(P) = H(Tr), òî P âõîäèò â T, íà÷èíàÿ ñ ïîçèöèè r.
2.3. Àëãîðèòì Ð. Êàðïà – Ì. Ðàáèíà 53

Ïðèìåð
Ð = 10101, m = 5 è H(P) = 1 · 2 4 + 0 · 2 3 + 1 · 2 2 + 0 · 2 1 +
+ 1 · 20 = 21. Åñëè Ò = 1011010101, r = 2, òî H(T2) =
= 0 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = 13, à ïðè r = 6
çíà÷åíèå H(T6) = 21. Âûâîä: îáðàçåö P âõîäèò â T ñ øåñòîé
ïîçèöèè (è ñ òðåòüåé).
Òàêèì îáðàçîì, çàäà÷à ïîèñêà âõîæäåíèÿ P â T çäåñü
ôàêòè÷åñêè ñâåäåíà ê âû÷èñëèòåëüíîé çàäà÷å, â êîòîðîé
ñðàâíèâàþòñÿ äâà ÷èñëà H(P) è H(Tr). Íî îïðåäåëåíèå Tr
äëÿ êàæäîãî çíà÷åíèÿ r — òðóäîåìêàÿ çàäà÷à, à êðîìå òîãî,
ñòåïåíè äâîéêè áûñòðî âîçðàñòàþò, ïîýòîìó ïðåîáðàçîâà-
íèå H äëÿ ðåàëüíûõ îáðàçöîâ P ñòàíîâèòñÿ ìàëîýôôåêòèâ-
íûì.
Ðàçâèòèåì ýòîé èäåè — ïðåîáðàçîâàíèÿ ñòðîêè â ÷èñ-
ëî — ñòàëî èñïîëüçîâàíèå îäíîãî èç êëàññè÷åñêèõ ðàçäåëîâ
òåîðèè ÷èñåë, à èìåííî ìîäóëüíîé àðèôìåòèêè. ( ïðèí-
öèïå, è êîìïüþòåðíîå âûïîëíåíèå àðèôìåòè÷åñêèõ îïåðà-
öèé — ýòî âû÷èñëåíèÿ ïî ìîäóëþ ìàêñèìàëüíî äîïóñòèìî-
ãî ÷èñëà â èíòåðâàëå, îïðåäåëåííîì òèïîì äàííûõ.) Ïðè
ýòîì âìåñòî ðàáîòû ñî ñëèøêîì áîëüøèìè ÷èñëàìè H(P) è
H(Tr) ïðåäëàãàåòñÿ âûïîëíÿòü äåéñòâèÿ ñ îñòàòêàìè ïî ìî-
äóëþ íåêîòîðîãî ÷èñëà q (îòíîñèòåëüíî íåáîëüøîãî, ÷òî ïî-
çâîëÿåò èñïîëüçîâàòü ìàëîå êîëè÷åñòâî áèòîâ). Íî â ýòîì
ñëó÷àå âîçíèêàåò äðóãàÿ ïðîáëåìà: ðàçëè÷íûå ÷èñëà ìîãóò
èìåòü îäèí è òîò æå îñòàòîê, ÷òî íåèçáåæíî ïðèâîäèò ê
ëîæíûì ñîâïàäåíèÿì P è T. Ïîýòîìó ñëåäóåò âûáèðàòü q
òàê, ÷òîáû âåðîÿòíîñòü ëîæíîãî ñîâïàäåíèÿ áûëà ìèíè-
ìàëüíîé. Èòàê, H(P) ïåðåâîäèòñÿ â Hq(P) ïóòåì íàõîæäå-
íèÿ H(P) Mod q è Hq(Tr) = H(Tr) Mod q. Îäíàêî òàêàÿ ïîñëå-
äîâàòåëüíîñòü äåéñòâèé, êàê âû÷èñëåíèå H(P) è H(Tr), à çà-
òåì íàõîæäåíèå îñòàòêîâ ïî ìîäóëþ q, åùå íå ðåøàåò
ïðîáëåìû, èáî ïðîìåæóòî÷íûå ðåçóëüòàòû îñòàþòñÿ ïðåæ-
íèìè (áîëüøèìè), à íå â äèàïàçîíå îò 0 äî q – 1. Êàê æå
áûòü? Ðàññìîòðèì ïðîñòîé ïðèìåð.

Ïðèìåð
Ïóñòü q = 7. Âû÷èñëèì 25 Mod 7 = 32 Mod 7 = 4. Ýòî ïðÿ-
ìîå âû÷èñëåíèå. À òåïåðü âû÷èñëèì ((((2 · 2 Mod 7 · 2) Mod
7) · 2) Mod 7 · 2)=4, ò. å. áóäåì âûïîëíÿòü îïåðàöèþ äàëü-
íåéøåãî âîçâåäåíèÿ â ñòåïåíü íàä îñòàòêîì ïðåäûäóùåãî
54 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

âû÷èñëåíèÿ, Êàê âèäèì, ïðîìåæóòî÷íûå ðåçóëüòàòû ïðè


ýòîì ñóùåñòâåííî ìåíüøå.
Ìîäóëüíàÿ àðèôìåòèêà1) äàåò âîçìîæíîñòü îïåðèðî-
âàòü ïðè àðèôìåòè÷åñêèõ âû÷èñëåíèÿõ (ëþáûõ, íå îáÿçà-
òåëüíî òîëüêî ñ âîçâåäåíèåì â ñòåïåíü) ñ îñòàòêàìè ïî ìîäó-
ëþ q, ïîýòîìó ïðîìåæóòî÷íûå ðåçóëüòàòû íèêîãäà íå ïðå-
âûñÿò çíà÷åíèå 2 · q.
Âòîðîé èñïîëüçóåìûé ìàòåìàòè÷åñêèé ôàêò — âñåì èç-
âåñòíàÿ ñõåìà Ãîðíåðà äëÿ âû÷èñëåíèÿ çíà÷åíèé ïîëèíî-
ìîâ:
am–1 · xm–1 + ... a2 · x2 + a1 · x1 + a0 = ((…(((am–1 · x +
+ am–2) · x + am–3) · x) + ... + a1) · x + a0).
Äðóãèìè ñëîâàìè, âîçâåäåíèÿ â ñòåïåíü çäåñü óæå íåò.
Ñõåìà Ãîðíåðà ïîçâîëÿåò îáîéòèñü îïåðàöèÿìè óìíîæåíèÿ
è ñëîæåíèÿ, à êðîìå òîãî, ïðîìåæóòî÷íûå ðåçóëüòàòû â
ïðîöåññå âû÷èñëåíèé îñòàþòñÿ íåáîëüøèìè.
 ðàññìàòðèâàåìîé íàìè çàäà÷å x ðàâíî 2, à êîýôôèöè-
åíòû ai — ýòî äâîè÷íûå ðàçðÿäû â ïðåäñòàâëåíèè P è Tr.
Èíòåãðèðóÿ îáà óêàçàííûõ âûøå ìàòåìàòè÷åñêèõ ôàêòà â
åäèíîå öåëîå, âû÷èñëåíèå H(P) ìîæíî îñóùåñòâèòü ïî ñõå-
ìå: H(P) = ((...(((P[1] · 2 Mod q + P[2]) · 2 Mod q + P[3]) · 2
Mod q + P[4])...) · 2 Mîd q+P[m]) Mod q. Îòìåòèì, ÷òî îïåðà-
öèÿ óìíîæåíèÿ íà 2 ïðè êîìïüþòåðíîé ðåàëèçàöèè çàìåíÿ-
åòñÿ ïðîñòûì ñäâèãîì ÷èñëà íà îäèí ðàçðÿä âëåâî, íåîáõî-
äèìî òîëüêî èñêëþ÷èòü ïîòåðþ ñòàðøåãî ðàçðÿäà â ðåçóëü-
òàòå òàêîãî ñäâèãà.
Ïðèìåð
Åñëè Ð = 1010111 è q = 11, òî H(P) = 87 è H(P) = 87 Mod
11 = 10. Âû÷èñëåíèÿ ïî ïðèâåäåííîé âûøå ñõåìå èìåþò âèä:
1 · 2 Mod 11 + 0 = 2; 2 · 2 Mod 11 + 1 = 5;
5 · 2 Mod 11 + 0 = 10; 10 · 2 Mod 11 + 1 = 10;
10 · 2 Mod 11 + 1 = 10; 10 · 2 Mod 11 + 1 = 10.
Àíàëîãè÷íî âû÷èñëÿåòñÿ è H(Tr) äëÿ ëþáîãî çíà÷åíèÿ r.
Îäíàêî ñõåìó âû÷èñëåíèÿ ïðè r>1 ìîæíî óïðîñòèòü (ïîâû-
ñèòü åå ýôôåêòèâíîñòü), ïîëó÷àÿ çíà÷åíèå H(Tr) èç H(Tr–1) çà
ïîñòîÿííîå íåáîëüøîå êîëè÷åñòâî îïåðàöèé. Òîãäà
H(Tr) = H(Tr) Mod q è H(Tr) = 2 · H(Tr–1) – 2m · T[r – 1] +
+ T[r + m – 1]. Ïîäîáíàÿ ñèòóàöèÿ ïîêàçàíà íà ðèñ. 2.5.
1)
Ñì., íàïðèìåð, Âèíîãðàäîâ È. Ì. Îñíîâû òåîðèè ÷èñåë. — Ì.: Íàóêà, 1972.
2.3. Àëãîðèòì Ð. Êàðïà – Ì. Ðàáèíà 55

Ðèñ. 2.5. Ñõåìà ïðåîáðàçîâàíèÿ H(Tr–1) â H(Tr)


Åñëè êàæäóþ ïîñëåäóþùóþ ñòåïåíü äâîéêè áðàòü ïî ìî-
äóëþ 2, ò. å. (2m Mod q) = 2 · (2m–1 Mod q) Mod q, òî H(Tr) =
= (2 · H(Tr–1) Mod q) – (2m Mod q) · T[r – 1] + T[r + m – 1] Mod q
âû÷èñëÿåòñÿ èç H(Tr–1) çà ïîñòîÿííîå âðåìÿ.
Î÷åâèäíî, ÷òî åñëè Ð âõîäèò â Ò íà÷èíàÿ ñ ïîçèöèè r, òî
Hq(P) = Hq(Tr), íî îáðàòíîå âåðíî íå âñåãäà. Â äàííîé ñõåìå
ïîèñêà P â T âîçìîæíû ëîæíûå ñîâïàäåíèÿ.
Ïðèìåð
P = 1010111, q = 5, H(P) Mod q = 2, T = 010101110010110.
Ïîëó÷àåì, ÷òî H5(P) = H5(T2) = H5(T9).  ïåðâîì ñëó÷àå ñî-
âïàäåíèå èñòèííîå, âî âòîðîì — ëîæíîå.
Êëþ÷ ê ðåøåíèþ ïðîáëåìû ëîæíûõ ñîâïàäåíèé
îïÿòü-òàêè äàåò òåîðèÿ ÷èñåë: ñëåäóåò â êà÷åñòâå q âûáèðàòü
ïðîñòîå ÷èñëî è èñïîëüçîâàòü ñâîéñòâà ïðîñòûõ ÷èñåë. Çíà-
÷åíèå p(q)1) îïðåäåëèì êàê êîëè÷åñòâî ïðîñòûõ ÷èñåë, íå
ïðåâîñõîäÿùèõ ïîëîæèòåëüíîãî öåëîãî q. Äëÿ p(q) èçâåñòíà
q
òàêàÿ îöåíêà: „ p(q) „ 1.26p(q) 2).
ln q
Ïðèâåäåì (áåç äîêàçàòåëüñòâà) îñíîâíóþ òåîðåìó
Ð. Êàðïà – Ì. Ðàáèíà3).
Òåîðåìà. Ïóñòü Ð è Ò — íåêîòîðûå ñòðîêè, ïðè÷åì
n · m … 29, ãäå m = |P| è n = |T|. Ïóñòü I — íåêîòîðîå ïîëî-
æèòåëüíîå ÷èñëî. Åñëè q — ñëó÷àéíî âûáðàííîå ïðîñòîå
÷èñëî, íå ïðåâîñõîäÿùåå I, òî âåðîÿòíîñòü ëîæíîãî ñîâïàäå-
p(nm)
íèÿ Ð è Ò íå ïðåâîñõîäèò .
p( I)
1)
Çäåñü ãðå÷åñêàÿ áóêâà p èñïîëüçîâàíà òîëüêî êàê óñëîâíîå îáîçíà÷åíèå è íå
èìååò îòíîøåíèÿ ê ÷èñëó p = 3,1415926... — Ïðèì. ðåä.
2)
Áóõøòàá À. À. Òåîðèÿ ÷èñåë. — Ì.: Ó÷ïåäãèç, 1960.
3)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ. — ÑÏá.: Íåâñêèé Äèàëåêò; ÁÕ–Ïåòåð-
áóðã, 2003. Ñ. 110–111.
56 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Óäèâèòåëüíûì ÿâëÿåòñÿ òîò ôàêò, ÷òî äàííàÿ òåîðåìà


âåðíà ïðè ëþáîì âûáîðå îáðàçöà Ð è òåêñòà Ò, òàêèõ, ÷òî
m · n … 29. «Âåðîÿòíîñòü» â ýòîé òåîðåìå îòíîñèòñÿ íå ê
ñëó÷àéíîìó âûáîðó Ð è Ò, à ê ñëó÷àéíîìó âûáîðó ïðîñòîãî
q, íå ïðåâîñõîäÿùåãî çíà÷åíèå I.
Èç ïðèâåäåííîé òåîðåìû íåòðóäíî âèäåòü, ÷òî ïðè âîç-
ðàñòàíèè I âåðîÿòíîñòü ëîæíîãî ñîâïàäåíèÿ óáûâàåò. Îäíà-
êî â ýòîì ñëó÷àå óâåëè÷èâàåòñÿ è çíà÷åíèå q, ÷òî ïðèâîäèò ê
óâåëè÷åíèþ çàòðàò âðåìåíè íà âû÷èñëåíèå Hq(P) è Hq(Tr).
À âîò åùå îäèí ëþáîïûòíûé ôàêò1). Åñëè I = m · n2, òî
âåðîÿòíîñòü ëîæíîãî ñîâïàäåíèÿ íå ïðåâîñõîäèò 2.53/n.
Äåéñòâèòåëüíî:
p(mn) mn ln(mn2 ) 1 æ ln m + 2 ln n ö 2.53
„1.26 = 1.26 ç ÷„ .
p(mn )
2
mn2 ln(mn) n è ln m + ln n ø n

Ïðèìåð
Ïóñòü m = 100, à n = 2000, òîãäà I = 102 · (2 · 103)2 =
= 4 · 108 < 4 · (103)2.7 = 22 · (210)2.7 = 229 < 232. Ïîëó÷àåì,
÷òî 32 áèòîâ äîñòàòî÷íî äëÿ ïðåäñòàâëåíèÿ ïðîñòîãî ÷èñëà q,
ïðè÷åì ìîäóëüíàÿ àðèôìåòèêà áóäåò ýôôåêòèâíî ðàáîòàòü,
à âåðîÿòíîñòü ëîæíîãî ñîâïàäåíèÿ íå áóäåò ïðåâîñõîäèòü
2.53/2000 < 0,001265.
Èòàê, àëãîðèòì Ð. Êàðïà – Ì. Ðàáèíà èìååò âðåìåííóþ
îöåíêó O(n). Íà ñòàäèè ïðåäâàðèòåëüíîé îáðàáîòêè ñëåäóåò
âûáðàòü ïðîñòîå ÷èñëî q, íå ïðåâîñõîäÿùåå ïîëîæèòåëüíî-
ãî öåëîãî I, è âû÷èñëèòü H(P). Äàëüíåéøèå äåéñòâèÿ ñâî-
äÿòñÿ ê ïîñëåäîâàòåëüíîìó âû÷èñëåíèþ H(Tr) è åãî ñðàâíå-
íèþ ñ H(P). Èç-çà âîçìîæíîñòè ëîæíîãî ñîâïàäåíèÿ ïðè ðà-
âåíñòâå H(P) è H(Tr) ìîæíî îðãàíèçîâàòü ïîáèòîâîå
ñðàâíåíèå ýòîé ïîäñòðîêè T ñ P.

@ Óïðàæíåíèÿ
1. Ïðè çàäàííîì m (íàïðèìåð, 100) îïðåäåëèòå ìèíèìàëü-
íî âîçìîæíîå çíà÷åíèå n, ïðè êîòîðîì 32 ðàçðÿäîâ íå
áóäåò õâàòàòü äëÿ ïðåäñòàâëåíèÿ I.
1)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ. — ÑÏá.: Íåâñêèé Äèàëåêò; ÁÕ–Ïåòåð-
áóðã, 2003. Ñ. 112.
2.4. Àëãîðèòì Shift-And 57

2. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà


Ð. Êàðïà – Ì. Ðàáèíà. Âûáîð ïðîñòîãî ÷èñëà îñóùåñòâè-
òå ñ ïîìîùüþ èçâåñòíûõ âàì àëãîðèòìîâ. Íà ñëó÷àéíûõ
òåñòàõ îöåíèòå êîëè÷åñòâî ëîæíûõ ñîâïàäåíèé.

2.4. Àëãîðèòì Shift-And


Òû íå çàáûâàé, ÷òî ó ìåíÿ â ãîëîâå
îïèëêè, è äëèííûå ñëîâà ìåíÿ òîëüêî
îãîð÷àþò...
Àëàí Ìèëí. «Âèííè-Ïóõ è âñå-âñå-âñå»
Ýòî — óäèâèòåëüíûé àëãîðèòì, ÿâëÿþùèéñÿ îñíîâîé
öåëîãî êëàññà ìåòîäîâ ðåøåíèÿ çàäà÷ íà ñòðîêàõ, âêëþ÷àÿ
ïðèáëèæåííûé ïîèñê îáðàçöà â òåêñòå. Åäèíñòâåííîå ïðèí-
öèïèàëüíîå åãî îãðàíè÷åíèå — íåáîëüøîå çíà÷åíèå m, ò. å.
îáðàçåö íå äîëæåí áûòü î÷åíü äëèííûì.
Èòàê, ïóñòü îáðàçåö Ð èìååò äëèíó m, òåêñò Ò — n. Áó-
äåì èñêàòü íåñêîëüêî áîëüøå, ÷åì îò íàñ òðåáóåòñÿ, — íå
òîëüêî âñå âõîæäåíèÿ P â T, íî è âõîæäåíèÿ â T âñåõ âîç-
ìîæíûõ ïðåôèêñîâ P.
Ïðèìåð
Ïóñòü îáðàçåö P = acacd, à òåêñò T = acacdfafacacda.
Ïðè ýòîì P èìååò ïÿòü ïðåôèêñîâ: a, ac, aca, acac è acacd.
Äëÿ êàæäîé ïîçèöèè òåêñòà íåîáõîäèìî çíàòü, ÿâëÿåòñÿ ëè
îíà êîíöîì âõîæäåíèÿ íå òîëüêî îáðàçöà, íî è ëþáîãî èç åãî
ïðåôèêñîâ. Ñ ýòîé öåëüþ äëÿ êàæäîé ïîçèöèè òåêñòà i ìû
ïîñòðîèì m-ýëåìåíòíûé ìàññèâ èç íóëåé è åäèíèö, â êîòî-
ðîì j–é ýëåìåíò ðàâåí 1, åñëè j-é ïðåôèêñ ñëîâà âõîäèò â
ïðåäûäóùèé òåêñò è çàêàí÷èâàåòñÿ íà ýòîé ïîçèöèè, à èíà-
÷å j-é ýëåìåíò ðàâåí 0.  èòîãå ìû ïîëó÷èì äâóìåðíûé ìàñ-
ñèâ R èç n ñòðîê è m ñòîëáöîâ, êîòîðûé ïðåäñòàâëåí â
òàáë. 2.12. (Ââåäåíèå íóëåâîãî ñòîëáöà R, çàïîëíåííîãî åäè-
íèöàìè, áóäåò îáúÿñíåíî ÷óòü ïîçæå.)
Ðàññìîòðèì ôîðìèðîâàíèå ÷åòâåðòîé ñòðîêè R (äëÿ ÷åò-
âåðòîé ïîçèöèè òåêñòà), â òàáë. 2.12 îíà âûäåëåíà êóðñè-
âîì. Ïåðâûé ïðåôèêñ a íå âõîäèò â ïðåäûäóùèé òåêñò, çà-
êàí÷èâàÿñü íà äàííîé ïîçèöèè, ïîýòîìó ïåðâûé ýëåìåíò
ìàññèâà ðàâåí 0. Âòîðîé ïðåôèêñ ac âõîäèò â òåêñò è çàêàí-
÷èâàåòñÿ íà äàííîé ïîçèöèè, ïîýòîìó âòîðîé ýëåìåíò ðà-
58 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Òàáëèöà 2.12

Cèìâîë Ñèìâîë
R a ñ a ñ d
T¯ P ®
Íîìåð Íîìåð
ñèìâîëà ñèìâîëà 0 1 2 3 4 5
T¯ P®
1 a 1 1 0 0 0 0
2 c 1 0 1 0 0 0
3 a 1 1 0 1 0 0
4 c 1 0 1 0 1 0
5 d 1 0 0 0 0 1
6 f 1 0 0 0 0 0
7 a 1 1 0 0 0 0
8 f 1 0 0 0 0 0
9 a 1 1 0 0 0 0
10 c 1 0 1 0 0 0
11 a 1 1 0 1 0 0
12 c 1 0 1 0 1 0
13 d 1 0 0 0 0 1
14 f 1 0 0 0 0 0

âåí 1. Äàëåå àíàëîãè÷íî ðàññìàòðèâàþòñÿ ïðåôèêñû aca (íå


âõîäèò), acac (âõîäèò) è acacd (íå âõîäèò) è çàïîëíÿþòñÿ
òðåòèé, ÷åòâåðòûé è ïÿòûé ýëåìåíòû ñòðîêè, êîòîðûå ðàâ-
íû 0, 1 è 0 ñîîòâåòñòâåííî. Åäèíèöû æå â ïÿòîé è òðèíàäöà-
òîé ñòðîêàõ òàáë. 2.12 îçíà÷àþò, ÷òî â òåêñò T âõîäèò âåñü
îáðàçåö P.
Îñòàëîñü íàó÷èòüñÿ áûñòðî ôîðìèðîâàòü R, ñòðîêà çà
ñòðîêîé. Ïóñòü R[i] — i-ÿ ñòðîêà òàáëèöû. Íà ñàìîì äåëå
êàæäàÿ ñòðîêà R[i] çàâèñèò òîëüêî îò ïðåäûäóùåé ñòðîêè
R[i – 1], îò P è îò òåêóùåãî ñèìâîëà òåêñòà T[i]. Èòàê, ïóñòü
ó íàñ óæå èìååòñÿ ñòðîêà R[i – 1] è íà îáðàáîòêó ïîñòóïèë
ñèìâîë òåêñòà T[i]. Ñòðîèì ñëåäóþùóþ ñòðîêó R[i]. Òàê, â
ðàññìàòðèâàåìîì ïðèìåðå Ri[5] = 1, ò. å. ïÿòûé ïðåôèêñ
acacd âõîäèò â òåêñò è çàêàí÷èâàåòñÿ íà òåêóùåé ïîçè-
öèè i, òîëüêî åñëè îäíîâðåìåííî âûïîëíÿþòñÿ äâà óñëîâèÿ:
1) â òåêñò âõîäèò è çàêàí÷èâàåòñÿ íà ïðåäûäóùåé ïîçèöèè
i – 1 ìåíüøèé ïðåôèêñ acac, èëè R[i – 1,4] = 1;
2) òåêóùèé ñèìâîë òåêñòà T[i] ñîâïàäàåò ñ ïÿòûì ñèìâî-
ëîì P, èëè T[i] = P[5].
2.4. Àëãîðèòì Shift-And 59

Ïåðâîå óñëîâèå îçíà÷àåò, ÷òî âñå ïðåäûäóùèå ñèìâîëû


ïðåôèêñà acacd äî ïîñëåäíåãî, êîòîðûé ðàññìàòðèâàåòñÿ â
äàííûé ìîìåíò, âõîäÿò â òåêñò, à âòîðîå — ÷òî è ïîñëåäíèé
ñèìâîë ïðåôèêñà acacd âõîäèò â òåêñò. Àíàëîãè÷íî,
R[i,4] = 1 òîëüêî òîãäà, êîãäà îäíîâðåìåííî R[i – 1, 3] = 1
è T[i] = P[4] è ò. ä. Äðóãèìè ñëîâàìè, î÷åðåäíàÿ ñòðîêà R
äëÿ âñåõ 1 „ j „ m ñòðîèòñÿ èç ïðåäûäóùåé ïî ôîðìóëå:

ì1, åñëè R[i - 1, j - 1] = 1 è T [i] = P[j];


R[i, j] = í
î0, â îñòàëüíûõ ñëó÷àÿõ.
Åäèíñòâåííîå èñêëþ÷åíèå âîçíèêàåò ïðè çàïîëíåíèè
ïåðâîé ïîçèöèè R[i,1], äëÿ êîòîðîé ïåðâîå óñëîâèå, î÷åâèä-
íî, âñåãäà èñòèííî, ïîñêîëüêó ïðåäûäóùèõ ñèìâîëîâ ïî-
ïðîñòó íåò. ×òîáû óêàçàííàÿ ôîðìóëà ðàáîòàëà è â ýòîì
ñëó÷àå, áóäåì õðàíèòü â äîïîëíèòåëüíîì íóëåâîì ýëåìåíòå
êàæäîé ñòðîêè åäèíèöó, ò. å. R[i,0] = 1 äëÿ âñåõ 1 „ i „ n
(ýòî òîò ñàìûé íóëåâîé ñòîëáåö, ñóùåñòâîâàíèå êîòîðîãî ìû
îáåùàëè îáúÿñíèòü â ïðåäûäóùåì ïðèìåðå).
 ðåçóëüòàòå ìû ïîëó÷èì ñëåäóþùèé àëãîðèòì ïîèñêà
ïîäñòðîêè â ñòðîêå:
l ïðîñìàòðèâàåì òåêñò;
l íà îñíîâàíèè ïðåäøåñòâóþùåé èíôîðìàöèè äëÿ êàæ-
äîé åãî ïîçèöèè i ñòðîèì áèòîâûé ìàññèâ;
l ïðîâåðÿåì, ïîÿâèëàñü ëè åäèíèöà â êîíöå íîâîãî ìàñ-
ñèâà: åñëè äà, òî ñëîâî âõîäèò â òåêñò è çàêàí÷èâàåòñÿ
íà òåêóùåé ïîçèöèè i, à íà÷èíàåòñÿ ñ ïîçèöèè
i – m + 1.
Procedure Search(P,T:String);
Const Wsize=...;
{Ìàêñèìàëüíûé ðàçìåð ñëîâà w}
Var R:Array [0..Wsize] of Byte;
{Áèòîâûé ìàññèâ}
n,m,i,j:Byte;
Begin
n:=Length(T);
m:=Length(P);
R[0]:=1;
For j:=1 To m Do R[j]:=0;
For i:=1 To n Do Begin
For j:=m DownTo 1 Do
60 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

{Âû÷èñëÿåì áèòîâûé ìàññèâ äëÿ òåêóùåãî ñèìâîëà


òåêñòà, èñïîëüçóÿ ñòàðûé ìàññèâ. Êñòàòè,
ñàìîñòîÿòåëüíî îòâåòüòå íà âîïðîñ: ïî÷åìó
ìû âû÷èñëÿåì åãî, íà÷èíàÿ ñ ïîñëåäíåãî
ýëåìåíòà?}
If (R[j-1]=1) And (T[i]=P[j]) Then R[j]:=1
Else R[j]:=0;
If R[m]=1 Then WriteLn(i-m+1);
{Åñëè ïîñëåäíèé ýëåìåíò - åäèíè÷íûé,
òî ñëîâî íàéäåíî}
End;
End;
Èòàê, íà êàæäîì øàãå òàêîé àëãîðèòì ïîçâîëÿåò ïîëó-
÷èòü èíôîðìàöèþ î âõîæäåíèè íå òîëüêî âñåãî ñëîâà, íî è
ëþáîãî èç åãî ïðåôèêñîâ. Îäíàêî âî âðåìåííîé ýôôåêòèâ-
íîñòè âûèãðûøà ïîêà íåò: äëÿ êàæäîãî çíà÷åíèÿ i âñåãäà
âûïîëíÿåòñÿ m ñðàâíåíèé, òàê ÷òî âðåìåííàÿ ñëîæíîñòü â
ëþáîì ñëó÷àå ñîñòàâëÿåò O(m · n).
Íà ïåðâûé âçãëÿä, ïîïûòêà îêàçàëàñü íåóäà÷íîé, íî äà-
âàéòå ñäåëàåì ñëåäóþùèé øàã. Åñëè äëèíà èñêîìîãî ñëîâà
íå ïðåâûøàåò 32, òî ëþáóþ èç ñòðîê òàáëèöû (à ýòî — ìàñ-
ñèâ èç íóëåé è åäèíèö) ìîæíî ïðåäñòàâèòü â âèäå îäíîé öå-
ëî÷èñëåííîé ïåðåìåííîé òèïà LongInt: öåëîå ÷èñëî âåäü
òîæå ñîñòîèò èç íóëåé è åäèíèö (â åãî äâîè÷íîì ïðåäñòàâëå-
íèè)! Îêàçûâàåòñÿ, ÷òî òîãäà î÷åðåäíóþ áèòîâóþ ñòðîêó
ìîæíî âû÷èñëÿòü âñþ ñðàçó, áåç öèêëà ïî íåé, çà íåñêîëüêî
áèòîâûõ îïåðàöèé.
Ðàññìîòðèì, íàïðèìåð, êàê ïî òðåòüåé ñòðîêå 10100
ñòðîèòñÿ ÷åòâåðòàÿ — 01010. Íàïîìíèì, ÷òî åäèíèöà â ÷åò-
âåðòîé ñòðîêå íà íåêîòîðîé ïîçèöèè j ìîæåò ïîÿâèòüñÿ
òîëüêî ïðè îäíîâðåìåííîì âûïîëíåíèè äâóõ óñëîâèé:
1) â òðåòüåé ñòðîêå ñëåâà îò ïîçèöèè j ñòîèò åäèíèöà (ò. å.
â òåêñò âõîäÿò âñå ïåðâûå ñèìâîëû j-ãî ïðåôèêñà äî ïî-
ñëåäíåãî);
2) òåêóùèé ñèìâîë òåêñòà (äëÿ íàøåãî ïðèìåðà ýòî c) ñî-
âïàäàåò ñ j-ì ñèìâîëîì îáðàçöà (ò. å. â òåêñò âõîäèò è ïî-
ñëåäíèé ñèìâîë j-ãî ïðåôèêñà).
Äëÿ ïðîâåðêè ïåðâîãî óñëîâèÿ äîñòàòî÷íî ñäâèíóòü
âïðàâî òðåòüþ ñòðîêó 10100. À òàê êàê â äîïîëíèòåëüíîì
íóëåâîì ýëåìåíòå âñåãäà õðàíèòñÿ åäèíèöà, ïîëó÷àåì
11010. Âñïîìíèì, ÷òî îáû÷íûé ñäâèã ShR çàïîëíÿåò îñâîáî-
äèâøèéñÿ ðàçðÿä íóëåì, ïîýòîìó ïîñëå ñäâèãà åùå íåîáõî-
2.4. Àëãîðèòì Shift-And 61

äèìî óñòàíîâèòü åäèíèöó â ïåðâîì ýëåìåíòå. Â òåõ ïîçèöè-


ÿõ ïîëó÷èâøåéñÿ íîâîé ñòðîêè, ãäå ñòîÿò åäèíèöû, âîç-
ìîæíî, áóäóò ñòîÿòü åäèíèöû è èñêîìîé íàìè ÷åòâåðòîé
ñòðîêè: äëÿ âñåõ ïðåôèêñîâ, ïîìå÷åííûõ ýòèìè åäèíèöàìè,
èõ ïåðâûå ñèìâîëû äî ïîñëåäíåãî óæå òî÷íî âõîäÿò â òåêñò.
Äëÿ ïðîâåðêè âòîðîãî óñëîâèÿ äëÿ êàæäîãî ñèìâîëà àë-
ôàâèòà ìû çàðàíåå ïîäãîòîâèì õàðàêòåðèñòè÷åñêèé âåê-
òîð äëèíîé m (îáîçíà÷èì åãî êàê V).  íåì j-é ýëåìåíò ðàâåí
1, åñëè äàííûé ñèìâîë ñîâïàäàåò ñ ïîñëåäíèì ñèìâîëîì j-ãî
ïðåôèêñà (èëè ïðîñòî ñîâïàäàåò ñ j-ì ñèìâîëîì îáðàçöà), è
ðàâåí 0 â ïðîòèâíîì ñëó÷àå. Äëÿ ðàññìàòðèâàåìîãî ïðèìåðà
õàðàêòåðèñòè÷åñêèå âåêòîðû ïðåäñòàâëåíû â òàáë. 2.13

Òàáëèöà 2.13

V a c a ñ d
a 1 0 1 0 0
c 0 1 0 1 0
d 0 0 0 0 1

Äëÿ âñåõ îñòàëüíûõ ñèìâîëîâ àëôàâèòà õàðàêòåðèñòè-


÷åñêèå âåêòîðû áóäóò íóëåâûìè (00000), òàê êàê ýòèõ ñèì-
âîëîâ âîîáùå íåò â ñëîâå.
Ïóñòü íàì èçâåñòåí õàðàêòåðèñòè÷åñêèé âåêòîð òåêó-
ùåãî ñèìâîëà òåêñòà. Äëÿ ñèìâîëà c ýòî 01010. Â òåõ ïîçè-
öèÿõ âåêòîðà, ãäå ñòîÿò åäèíèöû, âîçìîæíî, áóäóò ñòîÿòü
åäèíèöû è èñêîìîé ÷åòâåðòîé ñòðîêè. Äëÿ âñåõ ïðåôèêñîâ,
ïîìå÷åííûõ ýòèìè åäèíèöàìè, ïîñëåäíèé ñèìâîë ñîâïàäà-
åò ñ òåêóùèì ñèìâîëîì òåêñòà.
Îñòàëîñü îáúåäèíèòü îáà ýòèõ óñëîâèÿ — âåäü îíè äîëæ-
íû âûïîëíÿòüñÿ îäíîâðåìåííî. Ïðè ýòîì ïîçèöèè, äëÿ êî-
òîðûõ è â òðåòüåé ñòðîêå, ñäâèíóòîé âïðàâî, è â âåêòîðå ñòî-
èò åäèíèöà (ò. å. ïðåôèêñ ïîëíîñòüþ âõîäèò â òåêñò), ïîëó-
÷àþò òàêæå åäèíè÷íîå çíà÷åíèå, à îñòàëüíûå ïîçèöèè
îáíóëÿþòñÿ. Èñïîëüçóåòñÿ äëÿ ýòîãî, êîíå÷íî æå, áèòîâàÿ
îïåðàöèÿ And. À ïîëó÷àåìàÿ â ðåçóëüòàòå ñòðîêà è ñòàíî-
âèòñÿ ÷åòâåðòîé: 11010 And 01010 = 01010.
Èòàê, ó íàñ âñå ãîòîâî, ÷òîáû ñôîðìóëèðîâàòü îêîí÷à-
òåëüíûé âàðèàíò àëãîðèòìà Shift-And. Âíà÷àëå äëÿ êàæ-
äîãî ñèìâîëà àëôàâèòà ìû âû÷èñëÿåì åãî õàðàêòåðèñòè÷åñ-
êèé âåêòîð — öåëîå ÷èñëî òèïà LongInt. Äàëåå ïðîñìàòðè-
âàåì òåêñò: êàê è ðàíüøå, äëÿ êàæäîé åãî ïîçèöèè i ñòðîèì
62 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

áèòîâóþ ñòðîêó (âåêòîð), íî õðàíèì åå óæå â îäíîé ïåðåìåí-


íîé òèïà LongInt. Ñäâèãàåì ñòàðóþ ñòðîêó âïðàâî, â åå ïåð-
âûé ýëåìåíò óñòàíàâëèâàåì åäèíèöó è îáúåäèíÿåì ÷åðåç
And ñ õàðàêòåðèñòè÷åñêèì âåêòîðîì òåêóùåãî ñèìâîëà òåê-
ñòà. Îïÿòü æå, íî ñ ïîìîùüþ áèòîâûõ îïåðàöèé, ïðîâåðÿåì,
ïîÿâèëàñü ëè 1 â êîíöå íîâîé ñòðîêè. Åñëè äà, òî ñëîâî âõî-
äèò â òåêñò è çàêàí÷èâàåòñÿ íà òåêóùåé ïîçèöèè i, à çíà÷èò,
íà÷èíàåòñÿ ñ ïîçèöèè i – m + 1. (Ïåðâîíà÷àëüíî æå áèòî-
âàÿ ñòðîêà íóëåâàÿ.)
Procedure SearchShiftAnd(P,T:String);
Var V:Array [Chr(0)..Chr(255)] Of LongInt;
{Ìàññèâ äëÿ õðàíåíèÿ õàðàêòåðèñòè÷åñêèõ âåêòîðîâ
âñåõ ñèìâîëîâ òàáëèöû ASCII, îò 0-ãî äî 255-ãî}
n,m,i:Byte;
R,first:LongInt;
j:Ñhar;
Begin
n:=Length(T);
m:=Length(P);
For j:=Chr(0) To Chr(255) Do V[j]:=0;
For i:=1 To m Do V[P[i]]:=V[P[i]] Or
(1 ShL (m-i));
{Âû÷èñëÿåì õàðàêòåðèñòè÷åñêèå âåêòîðû}
first:=1 ShL (m-1);
{×èñëî âèäà 10..0, èñïîëüçóåòñÿ äëÿ óñòàíîâêè 1
â ïåðâóþ ïîçèöèþ áèòîâîé ñòðîêè}
R:=0;
For i:=1 To n Do Begin
R:=((R ShR 1) Or first) And V[T[i]];
{Âû÷èñëÿåì áèòîâóþ ñòðîêó äëÿ òåêóùåé ïîçèöèè}
If R And 1=1 Then WriteLn(i-m+1);
{Åñëè ïîñëåäíèé áèò åäèíè÷íûé, òî ñëîâî
íàéäåíî}
End;
End;
Àëãîðèòì, ïî ñóùåñòâó, ïîëó÷èëñÿ ëèíåéíûì, ñ âðå-
ìåííîé ñëîæíîñòüþ O(n). Âíóòðåííèé öèêë â íåì çàìåíåí
òðåìÿ áèòîâûìè îïåðàöèÿìè, à îíè âûïîëíÿþòñÿ äàæå áûñ-
òðåå îáû÷íûõ àðèôìåòè÷åñêèõ îïåðàöèé! Îãðàíè÷åíèå æå
íà äëèíó ñëîâà (ìàêñèìóì 32 ñèìâîëà) ïðèåìëåìî äëÿ ðÿäà
ïðàêòè÷åñêèõ ïðèìåíåíèé.
2.4. Àëãîðèòì Shift-And 63

Ðàññìîòðèì òåïåðü îäíó èç âîçìîæíûõ ìîäèôèêàöèé


àëãîðèòìà Shift-And äëÿ ïðèáëèæåííîãî ïîèñêà P â T.
Çàäà÷à. Ïðåäïîëîæèì, ÷òî èñêîìûé îáðàçåö â òåêñòå ñî-
äåðæèòñÿ, âîçìîæíî, ñ îäíèì íåñîâïàäàþùèì ñèìâîëîì.
Íåîáõîäèìî, íåñìîòðÿ íà ýòî íåñîâïàäåíèå, íàéòè âõîæäå-
íèå îáðàçöà.
Ïðèìåð
Ïóñòü P = acacd è T = acacafacacda. Òîãäà âõîæäå-
íèÿ P â T áóäóò íà÷èíàòüñÿ ñ ïåðâîãî è ñåäüìîãî ñèìâîëîâ,
ïðè÷åì ïåðâîå èç íèõ áóäåò íåòî÷íûì, à âòîðîå — òî÷íûì
âõîæäåíèåì.
Äëÿ ïîèñêà òî÷íûõ âõîæäåíèé ñôîðìèðóåì ìàññèâ R0
(òàáë. 2.14), àíàëîãè÷íûé òîìó, ÷òî ïðåäñòàâëåí â àëãîðèò-
ìå Shift-And. Äëÿ ïîèñêà æå íåòî÷íûõ âõîæäåíèé îïðåäå-
ëèì ìàññèâ R1 (òàáë. 2.15), êîòîðûé ïîõîæ íà ïåðâûé ñ òîé
ëèøü ðàçíèöåé, ÷òî îòðàæàåò êàê òî÷íûå âõîæäåíèÿ, òàê è
âõîæäåíèÿ ïðè îäíîì èçìåíåííîì ñèìâîëå.

Òàáëèöà 2.14

R0 Ñèìâîë Ñèìâîë
a c a c d
T¯ P®
Íîìåð Íîìåð
ñèìâîëà ñèìâîëà 0 1 2 3 4 5
T¯ P®
1 a 1 1 0 0 0 0
2 c 1 0 1 0 0 0
3 a 1 1 0 1 0 0
4 c 1 0 1 0 1 0
5 a 1 1 0 1 0 0
6 f 1 0 0 0 0 0
7 a 1 1 0 0 0 0
8 c 1 0 1 0 0 0
9 a 1 1 0 1 0 0
10 c 1 0 1 0 1 0
11 d 1 0 0 0 0 1
12 a 1 1 0 0 0 0
64 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ïðèìå÷àíèå. Ìû ãîâîðèì î ìàññèâàõ R0 è R1 äëÿ íà-


ãëÿäíîñòè èçëîæåíèÿ. Ôàêòè÷åñêè, êàê è ðàíåå, äëÿ ôîð-
ìèðîâàíèÿ î÷åðåäíîé ñòðîêè R[i] íåîáõîäèìî çíàòü òîëüêî
R[i – 1].
Êàê è ïðåæäå, äëÿ êàæäîé ïîçèöèè òåêñòà ìû ñîñòàâ-
ëÿåì áèòîâóþ ñòðîêó (âåêòîð) äëèíîé m. Â íåé j-é ýëåìåíò
ðàâåí 1, åñëè j-é ïðåôèêñ îáðàçöà âõîäèò â ïðåäûäóùèé
òåêñò (âîçìîæíî, ñ îäíèì èçìåíåííûì ñèìâîëîì) è çàêàí-
÷èâàåòñÿ íà ýòîé ïîçèöèè, èíà÷å j-é ýëåìåíò ðàâåí 0. Åäè-
íèöà â êîíöå ïÿòîé è îäèííàäöàòîé ñòðîê R1 îçíà÷àåò, ÷òî
â òåêñò âõîäèò (âîçìîæíî, ñ îäíèì èçìåíåííûì ñèìâîëîì)
âåñü îáðàçåö, è äàííàÿ ïîçèöèÿ ÿâëÿåòñÿ êîíöîì åãî âõîæ-
äåíèÿ.

Òàáëèöà 2.15

R1 Ñèìâîë Ñèìâîë
a c a c d
T¯ P®
Íîìåð Íîìåð
ñèìâîëà ñèìâîëà 0 1 2 3 4 5
T¯ P®
1 a 1 1 0 0 0 0
2 c 1 1 1 0 0 0
3 a 1 1 0 1 0 0
4 c 1 1 1 0 1 0
5 a 1 1 0 1 0 1
6 f 1 1 1 0 1 0
7 a 1 1 0 1 0 0
8 c 1 1 1 0 1 0
9 a 1 1 0 1 0 0
10 c 1 1 1 0 1 0
11 d 1 1 0 1 0 1
12 a 1 1 0 0 0 0

Êàê ìîæíî áûñòðî ïîñòðîèòü òàáëèöó R1?


Ïóñòü ó íàñ óæå èìåþòñÿ ñòðîêè R1[i – 1] è R0[i – 1], à íà
îáðàáîòêó ïîñòóïèë ñèìâîë òåêñòà T[i]. Ïîñòðîèì ñëåäóþ-
ùóþ ñòðîêó R1[i]. Åäèíèöà â íîâîé ñòðîêå R1 äëÿ íåêîòîðîãî
j-ãî ïðåôèêñà ìîæåò ïîÿâèòüñÿ òîëüêî â äâóõ ñëó÷àÿõ:
2.4. Àëãîðèòì Shift-And 65

l åñëè âñå ïåðâûå ñèìâîëû j-ãî ïðåôèêñà, êðîìå ïî-


ñëåäíåãî ñèìâîëà, òî÷íî ñîâïàäàþò ñ òåêñòîì, ò. å.
R0[i – 1,j – 1] = 1 (ïðîâåðÿòü íà ñîâïàäåíèå ïîñëåäíèé
ñèìâîë íå òðåáóåòñÿ, îí ìîæåò áûòü è îòëè÷àþùèì-
ñÿ — ýòî äîïóñòèìî);
l åñëè â ïåðâûõ ñèìâîëàõ j-ãî ïðåôèêñà óæå èìååòñÿ
îäèí èçìåíåííûé ñèìâîë, íî ïîñëåäíèé ñèìâîë ýòîãî
ïðåôèêñà ñîâïàäàåò ñ òåêóùèì ñèìâîëîì òåêñòà, ò. å.
R1[i – 1, j – 1] = 1 è T[i] = P[j].
Åñëè ñäâèíóòü âïðàâî (ñ äîïîëíåíèåì åäèíèöåé) ïðåäû-
äóùóþ ñòðîêó òàáëèöû R0, òî ìû ïîëó÷èì âñå åäèíèöû íî-
âîé ñòðîêè R1 ïî ïåðâîìó ñëó÷àþ, è äëÿ âñåõ ïðåôèêñîâ, ïî-
ìå÷åííûõ ýòèìè åäèíèöàìè, èçìåíåíèå ìîæåò áûòü òîëüêî
â ïîñëåäíåì ñèìâîëå. Åñëè æå ñäâèíóòü âïðàâî (ñ äîïîëíå-
íèåì åäèíèöåé) ïðåäûäóùóþ ñòðîêó R1 è ñîåäèíèòü åå ÷åðåç
And ñ õàðàêòåðèñòè÷åñêèì âåêòîðîì òåêóùåãî ñèìâîëà òåê-
ñòà, òî ìû ïîëó÷èì âñå åäèíèöû íîâîé ñòðîêè R1 ïî âòîðîìó
ñëó÷àþ. Äëÿ âñåõ ïðåôèêñîâ, ïîìå÷åííûõ ýòèìè åäèíèöà-
ìè, èçìåíåíèå ñèìâîëà, âîçìîæíî, ïðîèçîøëî ãäå-òî âíóò-
ðè. Îñòàåòñÿ òîëüêî ñîáðàòü âñå åäèíèöû â íîâîé ñòðîêå R1
ïðè ïîìîùè îïåðàöèè Or.

Ðàññìîòðèì, êàê â îáñóæäàåìîì ïðèìåðå ñòðîèòñÿ âîñü-


ìàÿ ñòðîêà R1. Ñåäüìàÿ ñòðîêà R0 ðàâíà 10000, ïîñëå ñäâèãà
è äîïîëíåíèÿ åäèíèöåé îíà ïåðåõîäèò â 11000. ×àñòü åäè-
íèö âîñüìîé ñòðîêè R1 óæå åñòü. Ñåäüìàÿ ñòðîêà R1 10100
ïîñëå ñäâèãà, äîïîëíåíèÿ åäèíèöåé è îïåðàöèè And ñ õàðàê-
òåðèñòè÷åñêèì âåêòîðîì òåêóùåãî ñèìâîëà c (01010) ñòàíî-
âèòñÿ ðàâíîé 01010. Òåïåðü ó íàñ åñòü è äðóãàÿ ÷àñòü åäè-
íèö. Ñîåäèíèì ïîëó÷åííûå ñòðîêè ÷åðåç Or, òàê êàê íàì
íóæíû åäèíèöû èç îáåèõ ñòðîê: 11000 Or 01010 = 11010.
Ýòî è áóäåò âîñüìàÿ ñòðîêà R1.
Procedure SearchShiftCh(P,T:String);
Var V:Array [Chr(0)..Chr(255)] Of LongInt;
n,m,i:Byte;
R0,R1,first: LongInt;
j:Char;
Begin
n:=Length(T);
m:=Length(P);
For j:=Chr(0) To Chr(255) Do V[j]:=0;
66 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

For i:=1 To m Do V[P[i]]:=V[P[i]] Or


(1 ShL (m-i));
R0:=0;
R1:=0;
first:=1 ShL (m-1);
For i:=1 To n Do Begin
{Âû÷èñëÿåì áèòîâûå ñòðîêè}
R0:=(R0 ShR 1) Or first;
R1:= R0 Or ((R1 ShR 1) And V[T[i]]);
{Äîïîëíåíèå åäèíèöåé ìîæíî íå äåëàòü,
òàê êàê îíà óæå åñòü â R0}
R0:=R0 And V[T[i]];
If R1 And 1 = 1 Then WriteLn(i-m+1);
End;
End;
Ìîæíî ëè îáîáùèòü ðàññìîòðåííóþ çàäà÷ó íà ñëó÷àé
áîëåå ÷åì îäíîãî íåñîâïàäåíèÿ ñèìâîëîâ?
Ïðåäïîëîæèì, ÷òî çàäàíî âîçìîæíîå êîëè÷åñòâî íåñîâ-
ïàäåíèé w è íåîáõîäèìî íàéòè âñå âõîæäåíèÿ P â T ñ òî÷-
íîñòüþ äî ýòèõ w íåñîâïàäåíèé.
Îïðåäåëèì çíà÷åíèå Rk[i, j] ðàâíûì åäèíèöå, åñëè j-é
ïðåôèêñ P ñîâïàäàåò ñ òî÷íîñòüþ äî k ñèìâîëîâ ñ ïîäñòðî-
êîé T, çàêàí÷èâàþùåéñÿ â ïîçèöèè i.  ïðîòèâíîì ñëó÷àå
Rk[i, j] ðàâíî íóëþ. Î÷åâèäíî, ÷òî ìàññèâû R âû÷èñëÿþòñÿ
ïîñëåäîâàòåëüíî: R0, R1, ..., Rk, ..., Rw. Ïðè ýòîì ïðè âû÷èñ-
ëåíèè çíà÷åíèÿ Rk[i, j] ëîãè÷åñêè âîçìîæíû ñëåäóþùèå âà-
ðèàíòû:
l ïåðâûå j – 1 ñèìâîëîâ Ð ñîâïàäàþò ñ ïîäñòðîêîé Ò,
êîí÷àþùåéñÿ â ïîçèöèè i – 1 ñ íå áîëåå ÷åì k íåñîâ-
ïàäåíèÿìè, è Ð[j] ðàâíî Ò[i]; ýòî óñëîâèå çàïèñûâàåò-
ñÿ êàê Rk[i – 1] ®1 ðàçðÿä And V[T[i]];
l ïåðâûå j – 1 ñèìâîëîâ Ð ñîâïàäàþò ñ ïîäñòðîêîé Ò,
êîí÷àþùåéñÿ â ïîçèöèè i – 1, ñ íå áîëåå ÷åì k – 1
íåñîâïàäåíèÿìè; ýòî óñëîâèå çàïèñûâàåòñÿ êàê
Rk–1[i – 1] ®1 ðàçðÿä.
Îñòàåòñÿ îáúåäèíèòü óêàçàííûå óñëîâèÿ ñ ïîìîùüþ
îïåðàöèè Or.
Ïðèìåð
Ïóñòü P = abcd è T = abceabfeakrt. Ïîñëåäîâàòåëüíîå
âû÷èñëåíèå ìàññèâîâ R ïîêàçàíî â òàáë. 2.16.
2.4. Àëãîðèòì Shift-And 67

Òàáëèöà 2.16

Ñèì- Íîìåð R0 R1 R2 R3
âîë ñèìâîëà
a 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
b 2 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
c 3 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0
e 4 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1
a 5 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0
b 6 0 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0
f 7 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0
e 8 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1
a 9 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0
k 10 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0
r 11 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 0
t 12 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1

Åäèíèöà â ïîñëåäíåì ñòîëáöå Rk ãîâîðèò î âõîæäåíèè P


â T ñ íå áîëåå ÷åì k íåñîâïàäåíèÿìè.

@ Óïðàæíåíèÿ
1. Âûïîëíèòå òðàññèðîâêó àëãîðèòìà Shift-And, íàïðè-
ìåð, ïðè P = abac è T = aabañcababacab.
2. Ýêñïåðèìåíòàëüíî ñðàâíèòå âðåìÿ ðàáîòû ïðîñòîãî àë-
ãîðèòìà ïîèñêà îáðàçöà â òåêñòå è àëãîðèòìà Shift-And.
3. Â àëãîðèòìå Shift-And íà âõîæäåíèå ïðåôèêñîâ óêàçû-
âàåò 1. Èçìåíèì óñëîâèå: ïóñòü íà âõîæäåíèå ïðåôèêñà
óêàçûâàåò çíà÷åíèå 0. Òîãäà ýòî óæå áóäåò àëãîðèòì íå
Shift-And, à «Shift-Or». Ðàçáåðèòå ïðèâåäåííûé íèæå
ëèñòèíã è ïðîâåðüòå åãî ðàáîòîñïîñîáíîñòü.
Procedure SeachShiftOr(P,T:String);
Var V:Array [Chr(0)..Chr(255)] Of LongInt;
n,m,i:Byte;
h,R: LongInt;
j:Ñhar;
68 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Begin
n:=Length(T);
m:=Length(P);
h:=1 ShL m-1;
For j:= Chr(0) To Chr(255) Do V[j]:=h;
For i:=1 To m Do V[P[i]]:=V[P[i]] And
(Not(1 ShL (m-i)));
R:=h;
For i:=1 To n Do Begin
R:=(R ShR 1) Or V[T[i]];
If R And 1 = 0 Then WriteLn(i-m+1);
End;
End;
Ïðèìå÷àíèå.  îñíîâíîì öèêëå íà îäíó áèòîâóþ îïåðà-
öèþ çäåñü ñòàëî ìåíüøå, òàê êàê äîïîëíåíèå åäèíèöåé
ïðè ñäâèãå íå òðåáóåòñÿ. (Îáúÿñíèòå ïî÷åìó.)
4. Ðàçðàáîòàéòå ìåòîä «ðåãèñòðîíåçàâèñèìîãî» (ò. å. âíå
çàâèñèìîñòè îò ðåãèñòðà áóêâ) ïîèñêà îáðàçöà â òåêñòå.
Ïðèìå÷àíèå. Äëÿ ýòîãî äîñòàòî÷íî äëÿ îäíèõ è òåõ æå
áóêâ ðàçíîãî ðåãèñòðà ïîñòðîèòü îäèíàêîâûå õàðàêòå-
ðèñòè÷åñêèå âåêòîðû. Îñíîâíàÿ æå ÷àñòü àëãîðèòìà
Shift-And îñòàíåòñÿ áåç èçìåíåíèé.
5. Èçâåñòíî, ÷òî â òåêñòå áåç öèôð íåêîòîðûå áóêâû áûëè
çàìåíåíû öèôðàìè. Íàéäèòå âõîæäåíèå îáðàçöà â òà-
êîì «èñïîð÷åííîì» òåêñòå.
Ïðèìå÷àíèå. Äëÿ ýòîãî ñëåäóåò õàðàêòåðèñòè÷åñêèå
âåêòîðû öèôð ñäåëàòü åäèíè÷íûìè: ýòî áóäåò îçíà÷àòü,
÷òî öèôðà ìîæåò ïîÿâèòüñÿ â ëþáîé ïîçèöèè ñëîâà.
6. Àâòîìîáèëüíûå íîìåðà èìåþò âèä: «áóêâà, òðè öèôðû,
äâå áóêâû», íàïðèìåð «ì815òê». Íàéäèòå â òåêñòå âñå
òàêèå àâòîìîáèëüíûå íîìåðà.
Ïðèìå÷àíèå. Õàðàêòåðèñòè÷åñêèå âåêòîðû äëÿ âñåõ
áóêâ íóæíî ïîëîæèòü ðàâíûìè 100011, äëÿ öèôð —
011100, à äëÿ âñåõ îñòàëüíûõ ñèìâîëîâ — íóëåâûìè.
7. Â òåêñòå íåêîòîðûå áóêâû, íàïðèìåð o, áûëè çàìåíåíû
áóêâîé a. Êàê íàéòè ñëîâî â òàêîì «èñïîð÷åííîì» òåê-
ñòå?
Ïðèìå÷àíèå. Íóæíî ñôîðìèðîâàòü õàðàêòåðèñòè÷åñ-
êèå âåêòîðû äëÿ âñåõ ñèìâîëîâ àëôàâèòà, à çàòåì ñêîð-
2.4. Àëãîðèòì Shift-And 69

ðåêòèðîâàòü âåêòîð äëÿ áóêâû à, ñîåäèíÿÿ åãî ÷åðåç Or ñ


âåêòîðîì äëÿ áóêâû î. Òåì ñàìûì îïðåäåëÿåòñÿ, ÷òî
áóêâà à ìîæåò ñòîÿòü â ñëîâå è íà ìåñòå áóêâû î.
8. Íåîáõîäèìî íàéòè â òåêñòå íå êîíêðåòíûé îáðàçåö, à îá-
ðàçåö ïî íåêîòîðîìó øàáëîíó, íàïðèìåð ïî øàáëîíó
c*c*s, â êîòîðîì ñèìâîë * çàìåíÿåò ëþáîé ñèìâîë. Òî
åñòü òðåáóåòñÿ íàéòè âñå ñëîâà èç ïÿòè áóêâ, â ïåðâîé è
òðåòüåé ïîçèöèÿõ êîòîðûõ íàõîäèòñÿ ñèìâîë ñ, à â ïî-
ñëåäíåé — ñèìâîë s.
Ïðèìå÷àíèå. Ïîñëå ôîðìèðîâàíèÿ õàðàêòåðèñòè÷åñ-
êèõ âåêòîðîâ èõ ñëåäóåò ïîäâåðãíóòü êîððåêòèðîâêå: âî
âòîðîé è ÷åòâåðòîé ïîçèöèÿõ (ò. å. â ïîçèöèÿõ ñ ñèìâî-
ëîì *) â ýòèõ âåêòîðàõ ñëåäóåò ïîñòàâèòü åäèíèöû. Ýòî
îçíà÷àåò, ÷òî â ýòèõ ïîçèöèÿõ ìîæåò íàõîäèòüñÿ ëþáîé
ñèìâîë.
9. Ïóñòü êâàäðàòíûå ñêîáêè óêàçûâàþò ãðóïïó ñèìâîëîâ
äëÿ ïîèñêà. Íàïðèìåð, ïî çàïðîñó á[àè]ðæà äîëæíû
áûòü íàéäåíû ñëîâà áàðæà è áèðæà, ò. å. ñëîâà, íà÷èíà-
þùèåñÿ ñ ñèìâîëà á è çàêàí÷èâàþùèåñÿ íà ðæà, ãäå
âòîðûì ñèìâîëîì ìîæåò áûòü êàê à, òàê è è. Âûïîëíè-
òå ñîîòâåòñòâóþùóþ ìîäèôèêàöèþ àëãîðèòìà Shift-
And.
Ïðèìå÷àíèå. Êâàäðàòíûå ñêîáêè îïðåäåëÿþò îäíó íå-
êîòîðóþ ïîçèöèþ ñëîâà.  õàðàêòåðèñòè÷åñêèõ âåêòî-
ðàõ äëÿ âñåõ ñèìâîëîâ, çàïèñàííûõ â êâàäðàòíûõ ñêîá-
êàõ, íàäî óñòàíîâèòü åäèíèöó â äàííîé ïîçèöèè.
10. Ïóñòü ôèãóðíûå ñêîáêè óêàçûâàþò ãðóïïó ñèìâîëîâ,
êîòîðûõ íå äîëæíî ñîäåðæàòüñÿ â èñêîìîì îáðàçöå.
Íàïðèìåð, ïî çàïðîñó {àâñ}ããó íåîáõîäèìî íàéòè âñå
ñëîâà èç ÷åòûðåõ áóêâ, íå íà÷èíàþùèåñÿ íà à, â èëè ñ è
çàêàí÷èâàþùèåñÿ íà ããó. Âûïîëíèòå ñîîòâåòñòâóþùóþ
ìîäèôèêàöèþ àëãîðèòìà Shift-And.
Ïðèìå÷àíèå. Ôèãóðíûå ñêîáêè òîæå îïðåäåëÿþò îäíó
íåêîòîðóþ ïîçèöèþ ñëîâà.  õàðàêòåðèñòè÷åñêèõ âåê-
òîðàõ äëÿ âñåõ ñèìâîëîâ, çàïèñàííûõ â ôèãóðíûõ ñêîá-
êàõ, íàäî çàïèñàòü íóëü â äàííîé ïîçèöèè.
11. Ïðåäïîëîæèì, ÷òî èñêîìûé îáðàçåö â òåêñòå ñîäåðæèò-
ñÿ, âîçìîæíî, ñ îäíèì ëèøíèì ñèìâîëîì. Ðàçðàáîòàéòå
ëîãèêó ïîñòðîåíèÿ ñîîòâåòñòâóþùèõ òàáëèö ïî àíàëî-
70 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ãèè ñ òàáë. 2.14 è 2.15. Ïðîâåðüòå ðàáîòîñïîñîáíîñòü


ñëåäóþùåãî ëèñòèíãà:
Procedure SearchShiftIns(P,T:String);
Var V:Array [Chr(0)..Chr(255)] Of LongInt;
n,m,i:Byte;
R0,R1,first:LongInt;
j:Char;
Begin
n:=Length(T);
m:=Length(P);
For j:=Chr(0) To Chr(255) Do V[j]:=0;
For i:=1 To m Do V[P[i]]:=V[P[i]] Or
(1 ShL (m-i));
R0:=0;
R1:=0;
first:=1 ShL (m-1);
For i:=1 To n Do Begin
R1:= R0 Or (((R1 ShR 1) Or first) And
V[T[i]]);
R0:=((R0 ShR 1) Or first) And V[t[i]];
If R1 And 1 = 1 Then WriteLn(i-m);
End;
End;
12. Ïðåäïîëîæèì, ÷òî èñêîìûé îáðàçåö â òåêñòå ñîäåðæèò-
ñÿ, âîçìîæíî, ñ îäíèì óäàëåííûì ñèìâîëîì. Êàê, íå-
ñìîòðÿ íà ýòó «îøèáêó óäàëåíèÿ», íàéòè âõîæäåíèå îá-
ðàçöà? Ïðîâåðüòå ïðàâèëüíîñòü ñëåäóþùåãî ëèñòèíãà:
Procedure SearchShiftDel(w,t:String);
Var V:Array [Ñhr(0)..Ñhr(255)] Of LongInt;
n,m,i:Byte;
R0,R1,first:LongInt;
j:Char;
Begin
n:=Length(T);
m:=Length(P);
For j:=Chr(0) To Chr(255) Do V[j]:=0;
For i:=1 To m Do V[P[i]]:=V[P[i]] Or
(1 ShL (m-i));
R0:=0;
R1:=0;
2.4. Àëãîðèòì Shift-And 71

first:=1 ShL (m-1);


For i:=1 To n Do Begin
R0:=((R0 ShR 1) Or first) And V[T[i]];
R1:=((R0 ShR 1)Or first) Or (((R1 ShR 1)
Or first) And V[T[i]]);
If R1 And 1 = 1 Then WriteLn(i-m+2);
End;
End;
13. Ðàññòîÿíèå Ð. Õåììèíãà ìåæäó äâóìÿ ñòðîêàìè îäèíà-
êîâîé äëèíû îïðåäåëÿåòñÿ êàê êîëè÷åñòâî ïîçèöèé, â
êîòîðûõ ñèìâîëû íå ñîâïàäàþò. Äàíî ñëîâî è íåêîòîðîå
÷èñëî d. Íåîáõîäèìî íàéòè âñå ñëîâà â òåêñòå, óäàëåí-
íûå îò äàííîãî ñëîâà íå áîëåå ÷åì íà ðàññòîÿíèå d. Ðàç-
áåðèòå ïðèâåäåííîå ðåøåíèå è ïðîâåðüòå åãî ïðàâèëü-
íîñòü.
Ïðèìå÷àíèå. Ïåðåôîðìóëèðóåì çàäà÷ó: òðåáóåòñÿ íàéòè
ñëîâà, êîòîðûå ñîäåðæàòñÿ â òåêñòå íå áîëåå ÷åì ñ d
«îøèáêàìè çàìåíû». Ñëó÷àé ñ îäíîé «îøèáêîé çàìåíû»
(ñ îäíèì èçìåíåííûì ñèìâîëîì) óæå áûë ðàññìîòðåí.
Íåîáõîäèìî ââåñòè ïî îäíîé äîïîëíèòåëüíîé òàáëèöå íà
êàæäóþ «îøèáêó çàìåíû» è ïðîâîäèòü àíàëîãè÷íûå
ïðåîáðàçîâàíèÿ îäíîé òàáëèöû â äðóãóþ.
Procedure SearchShiftChk(P,T:String;d:Byte);
Const Maxd=...;
Var V:Array [Chr(0)..Chr(255)] Of LongInt;
R:Array [0..Maxd] Of LongInt;
n,m,k,i:Byte;
first,OldR0,tmp:LongInt;
j:Char;
Begin
n:=Length(T);
m:=Length(P);
For j:=Chr(0) To Chr(255) Do V[j]:=0;
For i:=1 To m Do V[P[i]]:=V[P[i]]
Or (1 ShL (m-i));
For k:=0 To d Do R[k]:=0;
first:=1 ShL (m-1);
For i:=1 To n Do Begin
OldR0:=R[0];
R[0]:=((R[0] ShR 1) Or first) And V[T[i]];
72 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

For k:=1 To d Do Begin


tmp:=R[k];
R[k]:=((R[k] Shr 1) And V[T[i]])
Or (OldR0 Shr 1) Or first;
OldR0:=tmp;
End;
If R[d] And 1=1 Then WriteLn(i-m+1);
End;
End;
14. Êàê èçìåíèòñÿ ðåøåíèå â óïðàæíåíèè 13, åñëè íåîáõî-
äèìî íàéòè âñå ñëîâà, óäàëåííûå îò äàííîãî ñëîâà òî÷íî
íà ðàññòîÿíèå d?
15. Â ñëîâå âîçìîæíà îäíà çàìåíà, îäíî óäàëåíèå è îäíà
âñòàâêà ñèìâîëà, ò. å. âñå òðè «îøèáêè» ñðàçó, íî òîëüêî
ïî îäíîé êàæäîãî òèïà. Êàêèå èçìåíåíèÿ ïîòðåáóåòñÿ
âíåñòè â àëãîðèòì Shift-And äëÿ ïîèñêà òàêèõ ñëîâ?
16. Âî âñåõ âàðèàíòàõ àëãîðèòìà Shift-And íà âõîæäåíèå
ïðåôèêñîâ óêàçûâàåò çíà÷åíèå 1. Ïóñòü òåïåðü íà âõîæ-
äåíèå óêàçûâàåò çíà÷åíèå 0. Èçìåíèòå ðåøåíèÿ â
óïðàæíåíèÿõ 8, 11, 12, 13 è 15 ñ ó÷åòîì çàìåíû 1 íà 0.
Ïðèìå÷àíèå. Ïðèìåð ïîäîáíîé ìîäèôèêàöèè áûë ðàñ-
ñìîòðåí äëÿ òî÷íîãî ïîèñêà. Ïðè ýòîì äîïîëíåíèå åäè-
íèöåé îêàçàëîñü ëèøíèì. Áûòü ìîæåò, è çäåñü ýòî ïðè-
âåäåò ê ñîêðàùåíèþ êîëè÷åñòâà áèòîâûõ îïåðàöèé?
17. Ïóñòü óãëîâûå ñêîáêè óêàçûâàþò ãðóïïó ñèìâîëîâ, â
êîòîðûõ, âîçìîæíî, åñòü îäíà «îøèáêà çàìåíû». Íà-
ïðèìåð, ïóñòü íåîáõîäèìî íàéòè àâòîìîáèëüíûé íîìåð
ì815òê è åñòü óâåðåííîñòü â òîì, ÷òî áóêâû ïðàâèëüíû,
à â öèôðàõ âîçìîæíà îäíà îøèáêà, òîãäà çàïðîñ íà ïî-
èñê ìîæíî çàïèñàòü êàê ì<815>òê. Êàê ìîäèôèöèðî-
âàòü àëãîðèòì Shift-And äëÿ ïîèñêà ñëîâ ïî òàêîìó øàá-
ëîíó?
18. Îäíèì èç ñòàíäàðòíûõ çíàêîâ â øàáëîíàõ ÿâëÿåòñÿ
ñèìâîë #, îçíà÷àþùèé, ÷òî íà åãî ìåñòî ìîæåò áûòü
ïîäñòàâëåíî ëþáîå ñëîâî. Íàïðèìåð, øàáëîí ab#cd
îçíà÷àåò, ÷òî èùåòñÿ ïîäñòðîêà ab, çà íåé ñëåäóåò ëþ-
áîé íàáîð ñèìâîëîâ, à çàòåì íà ëþáîì ðàññòîÿíèè èäåò
ïîäñòðîêà cd. Ìîæíî ëè èçìåíèòü àëãîðèòì Shift-And
òàê, ÷òîáû îñóùåñòâëÿëàñü ïðîâåðêà íàëè÷èÿ â òåêñòå
ñëîâ, ñîîòâåòñòâóþùèõ ïîäîáíûì øàáëîíàì?
2.5. Èñïîëüçîâàíèå ýëåìåíòîâ òåîðèè àâòîìàòîâ 73

2.5. Èñïîëüçîâàíèå ýëåìåíòîâ òåîðèè


àâòîìàòîâ â ðåøåíèè çàäà÷
îáðàáîòêè ñòðîê
Íåò íè÷åãî ïðàêòè÷íåå õîðîøåé
òåîðèè.
Ðîáåðò Êèðõãîô

2.5.1. Îñíîâíîé ôîðìàëèçì òåîðèè àâòîìàòîâ


Ïðèåõàë èç Ãåðìàíèè Âîéíîâè÷. Ïîñå-
ëèëñÿ â ãîñòèíèöå íà Áðîäâåå. Ïîíàäî-
áèëîñü åìó ñäåëàòü êîïèè. Çàøëè îíè ñ
æåíîé â ñïåöèàëüíóþ êîíòîðó. Ïðîòÿ-
íóëè êîïèðîâùèêó íåñêîëüêî ñòðà-
íèö. Òîò ñïðàøèâàåò:
— One of each? («Êàæäóþ ïî îäíîé?»)
Âîéíîâè÷ ãîâîðèò æåíå:
— Èðêà, òû ñëûøàëà? Îí ñïðîñèë:
«Âîéíîâè÷?» Îí ìåíÿ óçíàë! Òû ïðåä-
ñòàâëÿåøü? Âîò îíà, ïîïóëÿðíîñòü!
Ñåðãåé Äîâëàòîâ

Ïóñòü A — êîíå÷íîå ìíîæåñòâî ñèìâîëîâ (àëôàâèò).


Îïðåäåëèì A* êàê ìíîæåñòâî âñåõ ñòðîê àëôàâèòà A. Êàê è
ðàíåå, ñèìâîëîì e îáîçíà÷èì ïóñòóþ ñòðîêó (îíà ïðèíàäëå-
æèò A*). Ïî ñâîåé ñóòè, àâòîìàò M — ýòî íåêîå óñòðîéñòâî,
ðàñïîçíàþùåå îïðåäåëåííûå ýëåìåíòû èç A*. Äëÿ çàäàííî-
ãî A àâòîìàò M ñîñòîèò èç ìíîæåñòâà ñîñòîÿíèé Q è ôóíê-
öèè ïåðåõîäîâ F:A · Q ® Q. Àâòîìàò M èìååò íà÷àëüíîå ñî-
ñòîÿíèå q0 Î Q è îäíî èëè íåñêîëüêî êîíå÷íûõ ñîñòîÿíèé
(E — ìíîæåñòâî êîíå÷íûõ ñîñòîÿíèé, E Í Q).
Èòàê, M = (A, Q, q0, E, F). Âõîäîì ôóíêöèè F ÿâëÿåòñÿ
ïàðà — ñèìâîë a, ñîñòîÿíèå q. Àâòîìàò íàõîäèòñÿ â ñîñòîÿ-
íèè q è ÷èòàåò ñèìâîë a; â ðåçóëüòàòå îí ïåðåõîäèò â íîâîå
ñîñòîÿíèå, îïðåäåëÿåìîå F[a, q].

Ïðèìåð
A = {a, b}, Q = {q0, q1, q2}, E = {q2}. Ôóíêöèÿ F ïðèâåäå-
íà â òàáë. 2.17.
74 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Òàáëèöà 2.17

F a b
q0 q1 q0
q1 q1 q2
q2 q1 q2

Òðàêòóþòñÿ äàííûå òàáë. 2.17 ñëåäóþùèì îáðàçîì: àâ-


òîìàò M íàõîäèòñÿ â ñîñòîÿíèè q0 è ÷èòàåò ñèìâîë a, â ðå-
çóëüòàòå ÷åãî îí ïåðåõîäèò â ñîñòîÿíèå q1 (F(a, q0) = q1),
ëèáî àâòîìàò M íàõîäèòñÿ â ñîñòîÿíèè q2 è ÷èòàåò ñèìâîë b,
â ðåçóëüòàòå ÷åãî îí ïåðåõîäèò â ñîñòîÿíèå q2, òàê êàê
F(b, q2) = q2.
Ðàáîòó àâòîìàòà M ìîæíî íàãëÿäíî èçîáðàçèòü â âèäå
îðèåíòèðîâàííîãî ãðàôà (äèàãðàììû ñîñòîÿíèé), ó êîòîðî-
ãî ìåòêàìè âåðøèí ÿâëÿþòñÿ ñîñòîÿíèÿ àâòîìàòà q, à ìåò-
êàìè äóã — ñèìâîëû àëôàâèòà A (ðèñ. 2.6).

Ðèñ. 2.6. Ïðèìåð äèàãðàììû ñîñòîÿíèé àâòîìàòà

Åñëè àâòîìàò M îáðàáàòûâàåò ñòðîêè ab, aab, aabb,


a...ab...b, bab, b...ba...ab...b, òî â èòîãå M ïåðåéäåò
â êîíå÷íîå ñîñòîÿíèå q2, è ýòè ñòðîêè ñ÷èòàþòñÿ äîïóñòè-
ìûìè èëè ðàñïîçíàâàåìûìè. Ïðè îáðàáîòêå æå ñòðîêè aba
M â èòîãå îêàæåòñÿ â ñîñòîÿíèè q1, ïîýòîìó òàêàÿ ñòðîêà
íåäîïóñòèìà èëè íåðàñïîçíàâàåìà äàííûì àâòîìàòîì.
(Àíàëîãè÷íà ñèòóàöèÿ è ñî ñòðîêàìè òèïà b...b èëè
b...ba...a.)
Àâòîìàòû M, ó êîòîðûõ äëÿ ëþáîãî ñîñòîÿíèÿ q è ëþáî-
ãî ñèìâîëà àëôàâèòà A, ïîñòóïàþùåãî íà îáðàáîòêó, ñó-
ùåñòâóåò îäíî è òîëüêî îäíî ñîñòîÿíèå — îäèí âîçìîæíûé
ïåðåõîä, îïðåäåëÿþò êàê äåòåðìèíèðîâàííûå àâòîìàòû.
Ñâîéñòâî äåòåðìèíèðîâàííîñòè ñëåäóåò èç òîãî, ÷òî F —
2.5. Èñïîëüçîâàíèå ýëåìåíòîâ òåîðèè àâòîìàòîâ 75

ôóíêöèÿ. Åñëè æå ðàññìàòðèâàòü F êàê ìíîæåñòâî ïðàâèë,


òî â ýòîì ñëó÷àå äëÿ íåêîòîðîãî a Î A è q Î Q ïðàâèëà ìî-
æåò íå ñóùåñòâîâàòü. Àâòîìàò êàê áû «çàâèñàåò» è íå ìîæåò
ðàáîòàòü; î òàêèõ àâòîìàòàõ ãîâîðÿò, ÷òî îíè íåäåòåðìèíè-
ðîâàííû.
Íà ðèñ. 2.7 ïðèâåäåíà äèàãðàììà íåäåòåðìèíèðîâàííî-
ãî àâòîìàòà (q2 — êîíå÷íîå ñîñòîÿíèå). Îí êîððåêòíî îáðà-
áàòûâàåò ñòðîêè òèïà ab...bc, íî, íàïðèìåð, ñòðîêà aa
ïðèâîäèò ê åãî «çàâèñàíèþ».

Ðèñ. 2.7. Ïðèìåð íåäåòåðìèíèðîâàííîãî àâòîìàòà

Èçâåñòíî, ÷òî äëÿ êàæäîãî íåäåòåðìèíèðîâàííîãî àâòî-


ìàòà ñóùåñòâóåò ýêâèâàëåíòíûé åìó äåòåðìèíèðîâàííûé
àâòîìàò, ðåøàþùèé òó æå çàäà÷ó1).
Êîíå÷íûé àâòîìàò M ôàêòè÷åñêè îïðåäåëÿåò íåêóþ
ôóíêöèþ j: A* ® Q. Çíà÷åíèå j(S) åñòü ñîñòîÿíèå, â êîòîðîå
ïåðåéäåò àâòîìàò ïîñëå îáðàáîòêè ñòðîêè S. Àâòîìàò äîïóñ-
êàåò ñòðîêó S, åñëè j(S) Î E.
Ôóíêöèÿ j äîïóñêàåò ðåêóððåíòíîå îïðåäåëåíèå:
j(å) = q0;
j(Sa) = F[j(S),a], äëÿ ëþáûõ S Î A* è a Î A (ãäå Sa — «ñêëåé-
êà» ñòðîêè S è ñèìâîëà a).

@ Óïðàæíåíèÿ
1. Äëÿ êàæäîãî èç ïðèâåäåííûõ íà ðèñ. 2.8 àâòîìàòîâ (äè-
àãðàìì ñîñòîÿíèé) îïðåäåëèòå ìíîæåñòâî äîïóñòèìûõ
ñëîâ.
Ïðèìå÷àíèå. Íà÷àëüíîå ñîñòîÿíèå — q0, êîíå÷íûå ñî-
ñòîÿíèÿ âûäåëåíû ñåðûì öâåòîì.
1)
Àíäåðñîí Ä. Äèñêðåòíàÿ ìàòåìàòèêà è êîìáèíàòîðèêà. — Ì.: Èçäàòåëüñêèé
äîì «Âèëüÿìñ», 2003. Ñ. 736–737.
76 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ðèñ. 2.8. Ïðèìåðû äèàãðàìì ñîñòîÿíèé àâòîìàòîâ

2. Ïîñòðîéòå àâòîìàòû, äëÿ êîòîðûõ ìíîæåñòâà äîïóñòè-


ìûõ ñëîâ èìåþò âèä:
l aa...abb...bcc...c;
l a...aba...aba...ab;
l a...ab è b...ba;
l aa...abac...c è bb...baac...c.
Ïðèìå÷àíèå. ×åðåç ìíîãîòî÷èå ìåæäó ñèìâîëàìè (íà-
ïðèìåð a...a), îáîçíà÷àåòñÿ ëþáîå êîëè÷åñòâî òàêèõ
æå ñèìâîëîâ, âïëîòü äî èõ îòñóòñòâèÿ.

2.5.2. Êîíå÷íûé àâòîìàò äëÿ ïîèñêà îáðàçöà


Ñëó÷àéíûå îòêðûòèÿ äåëàþò òîëü-
êî ïîäãîòîâëåííûå óìû.
Áëåç Ïàñêàëü
Äëÿ ïîèñêà îáðàçöà P â òåêñòå T êîíå÷íûé àâòîìàò M
êîíñòðóèðóåòñÿ ñëåäóþùèì îáðàçîì. Ïóñòü P = aabbabcaa.
Äèàãðàììà ïåðåõîäîâ òàêîãî êîíå÷íîãî àâòîìàòà (îðèåíòè-
2.5. Èñïîëüçîâàíèå ýëåìåíòîâ òåîðèè àâòîìàòîâ 77

ðîâàííûé ãðàô) äëÿ çàäàííîãî P ïðèâåäåíà íà ðèñ. 2.9. Ñîñ-


òîÿíèå q0 çäåñü îáîçíà÷åíî êðóæêîì (âåðøèíà îðèåíòèðî-
âàííîãî ãðàôà) ñ ìåòêîé q0 è ÿâëÿåòñÿ íà÷àëüíûì. Êîíå÷íîå
ñîñòîÿíèå — âåðøèíà ñ ìåòêîé q9. Äóãè, èäóùèå ñëåâà íà-
ïðàâî, èìåþò ìåòêè, ñîîòâåòñòâóþùèå ñèìâîëàì P, è íà-
ïðàâëåíû îò âåðøèí ñ ìåòêàìè qj ê âåðøèíàì ñ ìåòêàìè
qj+1; ýòè äóãè ñîîòâåòñòâóþò óñïåøíûì ýòàïàì ïîèñêà P â T.
Íàõîæäåíèå â ñîñòîÿíèè qj (âåðøèíå ñ ìåòêîé qj) ãîâîðèò î
òîì, ÷òî j ñèìâîëîâ P ñîâïàëè ñ j ïîñëåäíèìè ñèìâîëàìè T.
Ïåðåõîä â ñîñòîÿíèå qj+1 ãîâîðèò îá óñïåøíîñòè ñðàâíåíèÿ
j + 1 ñèìâîëîâ îáðàçöà P è ñîîòâåòñòâóþùåãî ñèìâîëà T.
Äîñòèæåíèå êîíå÷íîãî ñîñòîÿíèÿ ñîîòâåòñòâóåò óñïåøíîìó
ïîèñêó P â T.

Ðèñ. 2.9. Äèàãðàììà ïåðåõîäîâ êîíå÷íîãî àâòîìàòà


äëÿ P = aabbabcaa

Îñòàëîñü ïîíÿòü íàçíà÷åíèå äóã, èäóùèõ ñïðàâà íàëåâî


(îáðàòíûõ äóã). Ïóñòü ìû íàõîäèìñÿ â ñîñòîÿíèè q6. Åñëè íà
îáðàáîòêó èç T ïîñòóïèë ñèìâîë c, òî ìû ïåðåõîäèì â ñî-
ñòîÿíèå q7 (÷òî î÷åâèäíî èç âûøåèçëîæåííîãî òåêñòà). À
åñëè íà îáðàáîòêó ïîñòóïèë ñèìâîë a? Ó ñòðîêè aabbaba
äëèíà ìàêñèìàëüíîãî ñóôôèêñà, ñîâïàäàþùåãî ñ ïðåôèê-
ñîì P, ðàâíà åäèíèöå (ýòî ñèìâîë a), ïîýòîìó è äóãà èäåò â
ñîñòîÿíèå q1. Åñëè æå ïîñòóïèë ñèìâîë b, òî ýòî áóäåò äóãà,
èäóùàÿ â ñîñòîÿíèå q0, — íà ðèñ. 2.9 îíà íå ïðèâåäåíà, òàê
êàê äëèíà ìàêñèìàëüíîãî ñóôôèêñà aabbabb, ñîâïàäàþùå-
ãî ñ ïðåôèêñîì P, ðàâíà íóëþ — ïóñòàÿ ñòðîêà. (Ñîîòâåò-
ñòâåííî, è âñå äóãè, èäóùèå â ñîñòîÿíèå q0, íå ïðèâåäåíû íà
ðèñ. 2.9.)
Ïåðåõîä â ñîñòîÿíèå q1 ãîâîðèò î òîì, ÷òî ñëåäóþùåå
ñðàâíåíèå î÷åðåäíîãî ñèìâîëà T áóäåò îñóùåñòâëÿòüñÿ ñ
ñèìâîëîì P[2]. Ïåðåõîä ïî îáðàòíîé äóãå ãîâîðèò î íàëè÷èè
ïðåôèêñà P, ñîâïàäàþùåãî ñ ñóôôèêñîì ïðîéäåííîé ÷àñòè
òåêñòà T.
78 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ïóñòü ñðàâíèâàëñÿ ñèìâîë òåêñòà T[i], è àâòîìàò ïåðå-


øåë â ñîñòîÿíèå j — ôàêòè÷åñêè ýòè ïàðàìåòðû îïðåäåëÿþò
âåëè÷èíó ñäâèãà P îòíîñèòåëüíî T. Ê j ïîñëåäíèì ñèìâîëàì
T ñëåäóåò ïðèëîæèòü j ïåðâûõ ñèìâîëîâ P, à ñëåäóþùåå
ñðàâíåíèå (åñëè åãî äåëàòü) ñëåäóåò âûïîëíÿòü ìåæäó ñèì-
âîëàìè T[i + 1] è P[j + 1].
Òåì ñàìûì ìû ïðèáëèçèëèñü ê ïîíèìàíèþ ôóíêöèè ïå-
ðåõîäîâ F îïèñûâàåìîãî àâòîìàòà. Äëÿ ðàññìàòðèâàåìîãî
ïðèìåðà îíà ïðèâåäåíà â òàáë. 2.18.

Òàáëèöà 2.18

Ñîñòîÿíèå
F
0 1 2 3 4 5 6 7 8 9
a 1 2 2 1 5 2 1 8 9 2
Âõîäíîé
b 0 0 3 4 0 6 0 0 0 3
ñèìâîë
c 0 0 0 0 0 0 7 0 0 0

Ëîãèêà ôîðìèðîâàíèÿ ôóíêöèè ïåðåõîäîâ (åñëè íå êà-


ñàòüñÿ âîïðîñà åå ýôôåêòèâíîñòè) çäåñü äîñòàòî÷íî î÷åâèä-
íà. Äëÿ êàæäîé ïîçèöèè j îáðàçöà P è ñèìâîëà àëôàâèòà A
ìû îïðåäåëÿåì ìàêñèìàëüíóþ äëèíó ïðåôèêñà P, ñîâïàäà-
þùåãî ñ ñóôôèêñîì ñòðîêè (P[1..j] + <ñèìâîë àëôàâè-
òà>). Ýòà «ôðàçà» â ôîðìàëèçîâàííîì âèäå çàïèñûâàåòñÿ
òàê:
Procedure Automat;
Var j,k:Integer;
q:Char;
Begin
For j:=0 To m Do
For qÎA Do Begin
{Öèêë ïî ñèìâîëàì àëôàâèòà A}
k:=Min(m,j+1);
{Íà÷èíàåì ñ ìàêñèìàëüíîãî çíà÷åíèÿ k}
While Not MaxSuf(k,j,q) And (k>0) Do k:=k-1;
{Åñëè ïðåôèêñ P[1..k] íå ÿâëÿåòñÿ ñóôôèêñîì
P[1..j]+q, òî óìåíüøàåì çíà÷åíèå k}
F[j,q]:=k;
{F - ìàññèâ òèïà F : Array [1..Length
(MaxString),A] Of Integer. Ïåðâûé åãî èíäåêñ
2.5. Èñïîëüçîâàíèå ýëåìåíòîâ òåîðèè àâòîìàòîâ 79

èçìåíÿåòñÿ îò 1 äî <äëèíà ìàêñèìàëüíî


âîçìîæíîé ñòðîêè>, à âòîðîé èíäåêñ –
ïî ñèìâîëàì àëôàâèòà A}
End;
End;
Ïðîâåðêà ñîâïàäåíèÿ ñèìâîëîâ âîçëîæåíà íà ôóíêöèþ
MaxSuf:
Function MaxSuf(k,j:Integer;q:Char):Boolean;
Var l:Integer;
W:String;
Begin
{Ïðîâåðÿåì: ÿâëÿåòñÿ ëè ïðåôèêñ P[1..k] ñóôôèêñîì
ñòðîêè P[1..j]+q}
W:=Copy(P,1,j);
W:=W+q;
l:=1;
While (P[k-l+1]=W[j+1-l+1]) And (l<=k) Do l:=l+1;
If l=k+1 Then MaxSuf:=True
Else MaxSuf:=False;
End;
Âðåìåííàÿ ñëîæíîñòü ëîãèêè — O(m3 · |A|) — âëîæåí-
íûå öèêëû ïî P è ñèìâîëàì A, à çàòåì äëÿ êàæäîé ïàðû (ïî-
çèöèÿ, ñèìâîë) — O(m2) íà ïîèñê äëèíû ìàêñèìàëüíîãî
ïðåôèêñà P, ñîâïàäàþùåãî ñ ñóôôèêñîì ñòðîêè. Îñòàâèì
ïîêà ýòîò ñïîñîá âû÷èñëåíèÿ ôóíêöèè F, èáî ìû ñîçíàòåëü-
íî íå âñïîìèíàëè ïðî ìàòåðèàë èç ï. 1.2 (ïîíÿòèÿ ãðàíè è
ìàññèâà ãðàíåé), è ïðèâåäåì àëãîðèòì ïîèñêà P â T ñ ïî-
ìîùüþ êîíå÷íîãî àâòîìàòà M, ïîñòðîåííîãî äëÿ îáðàçöà P.
Procedure SearchAutomat;
Var i,q:Integer;
{Èäåíòèôèöèðóåì ñîñòîÿíèå qj ñ åãî íîìåðîì j}
Begin
n:=Length(T);
q:=0;
For i:=1 To n Do Begin
q:=F[q,T[i]];
If q=m Then <îáðàçåö P âõîäèò â T ñ ïîçèöèè
i–m+1>
End;
End;
80 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Êàê âèäèì, ïðè íàëè÷èè àâòîìàòà M äëÿ P âðåìÿ ïîèñ-


êà P â T åñòü O(n).
Ïðèìåð
Ïóñòü P = abaababa è T = abaaababaababaa. Äèàãðàì-
ìà ïåðåõîäîâ M ïðèâåäåíà íà ðèñ. 2.10, à ôóíêöèÿ F — â
òàáë. 2.19.

Ðèñ. 2.10. Äèàãðàììà ïåðåõîäîâ êîíå÷íîãî àâòîìàòà äëÿ ñòðîêè


P = abaababa
Òàáëèöà 2.19

Ñîñòîÿíèå
F
0 1 2 3 4 5 6 7 8
Âõîäíîé a 1 1 3 4 1 6 4 8 4
ñèìâîë b 0 2 0 2 5 0 7 0 2

Èçìåíåíèå çíà÷åíèÿ ïåðåìåííîé q (ñîñòîÿíèÿ àâòîìàòà)


â ïðîöåññå ïîèñêà P â T ïðèâåäåíî â òàáë. 2.20.

Òàáëèöà 2.20

T a b a a a b a b a a b a b a a
q 0 1 2 3 4 1 2 3 2 3 4 5 6 7 8 4

À òåïåðü âñïîìíèì î ìàññèâå ãðàíåé br (ñì. ï. 1.2.1). Îí


âû÷èñëÿåòñÿ çà âðåìÿ O(m) è ôàêòè÷åñêè ñîäåðæèò äàííûå î
äëèíàõ ñóôôèêñîâ ñòðîê P[1..i], ñîâïàäàþùèõ ñ ïðåôèêñîì
P. (Òàê, äëÿ ïîñëåäíåãî ïðèìåðà br = (0, 0, 1, 1, 2, 3, 2, 3).)
Çíà÷åíèå br[j] ãîâîðèò î òîì, ÷òî ó ñòðîêè P[1..j] ñóôôèêñ
ýòîé äëèíû ñîâïàäàåò ñ ïðåôèêñîì P, èëè, äðóãèìè ñëîâàìè,
åñëè â ñîñòîÿíèè j àâòîìàòà îáðàáàòûâàåòñÿ ñèìâîë w, òî íàì
ñëåäóåò ïðîñòî óçíàòü, êàê ýòîò ñèìâîë îáðàáàòûâàëñÿ â ñî-
ñòîÿíèè br[j], ïîñêîëüêó åãî îáðàáîòêà èäåíòè÷íà äëÿ ýòèõ
ñîñòîÿíèé. (Â ðàññìàòðèâàåìîì ïðèìåðå br[6] = 3 è
F[6,a] = F[3,a].) Òîãäà ëîãèêà ôîðìèðîâàíèÿ ôóíêöèè ïåðå-
õîäîâ F àâòîìàòà M çà âðåìÿ O(m · |A|) áóäåò ñëåäóþùåé:
2.6. Àëãîðèòì Ì. Êðî÷åìîðà 81

Procedure Automat;
Var j:Integer;
q:Char;
Begin
For qÎA Do
If P[1]=q Then F[0,q]:=1 Else F[0,q]:=0;
For j:=1 To m Do
For qÎA Do
{Öèêë ïî ñèìâîëàì àëôàâèòà A}
If P[j+1]=q Then F[j,q]:=j+1
Else F[j,q]:=F[br[j],q];
End;
Ïðèìå÷àíèå. Ïðåäïîëàãàåòñÿ, ÷òî ê êîíöó P ïðèïèñàí
ñèìâîë, îòñóòñòâóþùèé â A, íàïðèìåð $.

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåð îáðàçöà è ïîñòðîéòå äëÿ íåãî àâòîìàò
ðàñïîçíàâàíèÿ.
2. Ïîñòðîéòå àâòîìàò ðàñïîçíàâàíèÿ îáðàçöà â òåêñòå íà
îñíîâå ìàññèâà ãðàíåé ñóôôèêñîâ.
3. Ñêîíñòðóèðóéòå àâòîìàò (åñëè ýòî âîçìîæíî) äëÿ ðàñ-
ïîçíàâàíèÿ îáðàçöà â òåêñòå ñ èñïîëüçîâàíèåì äàííûõ,
ïðåäñòàâëåííûõ â ìàññèâå áëîêîâ.

2.6. Àëãîðèòì Ì. Êðî÷åìîðà


Íåâîçìîæíî ðåøèòü ïðîáëåìó íà òîì
æå óðîâíå, íà êîòîðîì îíà âîçíèêëà.
Íóæíî ñòàòü âûøå ýòîé ïðîáëåìû,
ïîäíÿâøèñü íà ñëåäóþùèé óðîâåíü.
Àëüáåðò Ýéíøòåéí

Ïóñòü èìååòñÿ ñòðîêà S èç m ñèìâîëîâ. Ïîíÿòèå ãðàíè


îïðåäåëåíî â ï. 1.2.2 — ýòî ëþáîé ñóôôèêñ S[i..m] (i ¹ 1), ñî-
âïàäàþùèé ñ ïðåôèêñîì S. Îáîçíà÷èì äëèíó íàèáîëüøåé
ãðàíè ñòðîêè S ÷åðåç z. Òîãäà âåëè÷èíà r = m Div (m – z)
îïðåäåëÿåò êðàòíîñòü ñòðîêè, à ïîäñòðîêó U = S[1..m – z]
íàçûâàþò îáðàçóþùåé ïîäñòðîêîé. Åñëè äëÿ ñòðîêè S ïàðà-
ìåòð r — öåëîå ÷èñëî è r … 2, òî S ñ÷èòàåòñÿ êðàòíîé ñòðî-
êîé.
82 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ïðèìåðû
1) S = abcabcabcabc; z = 9; Þ r = 4; U = abc;
2) S = abab; z = 2; Þ r = 2; U = ab;
3) S = bbbbb; z = 4; Þ r = 5; U = b;
4) S = ababa; z = 3; Þ r = 5/2, ñòðîêà íå ÿâëÿåòñÿ êðàò-
íîé.
Êðàòíóþ ñòðîêó ìîæíî çàïèñàòü â âèäå S = (U)r. Ó ëþ-
áîé êðàòíîé ñòðîêè S îáðàçóþùàÿ U íå ÿâëÿåòñÿ êðàòíîé.
Ïîñòàíîâêà çàäà÷è. Ïóñòü äàí òåêñò T[1..n]. Òðåáóåòñÿ
íàéòè âñå êðàòíûå ïîäñòðîêè T.
Îïèñûâàòü âõîæäåíèå êðàòíîé ñòðîêè S â T ìîæíî
òðîéêîé ÷èñåë (i, p, r), ãäå i — èíäåêñ ïîçèöèè ñèìâîëà â T,
ñ êîòîðîãî íà÷èíàåòñÿ S; p — êîëè÷åñòâî ñèìâîëîâ â îáðàçó-
þùåé; r — êðàòíîñòü.

Ïðèìåð
S = aababbbaa.
Îòâåò: (1, 1, 2), (2, 2, 2), (5, 1, 3), (8, 1, 2).
Àëãîðèòì Ì. Êðî÷åìîðà ïîäâåðãàåò òåêñò äåêîìïîçè-
öèè. Äëÿ ýòîãî íà êàæäîì øàãå (óðîâíå) L àëãîðèòì íàõîäèò
óíèêàëüíûå ïîäñòðîêè äëèíîé L. Ïðè L = 1 âû÷èñëÿþòñÿ
ïîñëåäîâàòåëüíîñòè ïîçèöèé, â êîòîðûõ âñòðå÷àþòñÿ îäè-
íàêîâûå ñèìâîëû. Äàëåå äëÿ óðîâíåé L > 1 íàõîäÿòñÿ ïî-
ñëåäîâàòåëüíîñòè ïîçèöèé, ñ êîòîðûõ íà÷èíàþòñÿ îäèíàêî-
âûå ïîäñòðîêè äëèíîé L.

Ïðèìåð
Òåêñò T ïðèâåäåí â òàáë. 2.21 (â ïåðâîé ñòðîêå óêàçàíû
íîìåðà ïîçèöèè ñèìâîëîâ â òåêñòå).

Òàáëèöà 2.21

i 1 2 3 4 5 6 7 8 9 10
T a a b a b b b a b $

Íà ðèñ. 2.11 ïîêàçàíà ðàçáèâêà òåêñòà íà óíèêàëüíûå


ïîäñòðîêè.
2.6. Àëãîðèòì Ì. Êðî÷åìîðà 83

Ðèñ. 2.11. Ðàçáèâêà òåêñòà T íà óíèêàëüíûå ïîäñòðîêè

Âûñêàæåì óòâåðæäåíèå î òîì, ÷òî ïåðåõîä îò L ê L + 1


âîçìîæåí òîëüêî íà îñíîâå ïîñëåäîâàòåëüíîñòåé òåêóùåãî
óðîâíÿ.
Ïî î÷åâèäíîé ëîãèêå, äëÿ äåêîìïîçèöèè íåêîòîðîé ïî-
ñëåäîâàòåëüíîñòè óðîâíÿ L, ïðåäñòàâëåííîé ïîñëåäîâàòåëü-
íîñòüþ èíäåêñîâ {i1, i2, ..., ik}, òðåáóåòñÿ ïðîâåðèòü ñîâïàäå-
íèå ñèìâîëîâ T[i1 + L], T[i2 + L], ..., T[ik + L]. Òîãäà ïðè ñîâ-
ïàäåíèè êàêîé-ëèáî ïàðû ñèìâîëîâ (íàïðèìåð, T[i1 + L] =
= T[i2 + L]) èíäåêñû i1 è i2 ïîìåùàþòñÿ â îäíó è òó æå ïîñëå-
äîâàòåëüíîñòü óðîâíÿ L + 1 (ðèñ. 2.12). Òàêàÿ ëîãèêà èìååò
âðåìåííóþ ñëîæíîñòü O(n2).

Ðèñ. 2.12. Îáû÷íàÿ ñõåìà ïåðåõîäà îò îäíîãî óðîâíÿ ê äðóãîìó.


A — íåêîòîðàÿ ïîäñòðîêà; Àài — êîíêàòåíàöèÿ ïîäñòðîêè À
ñ ñèìâîëîì ai. Âñå ñèìâîëû ai (i = 1..t) ðàçëè÷íû

Íàáëþäåíèå 1.
Âîçüìåì èíäåêñû èç îäíîé ïîñëåäîâàòåëüíîñòè óðîâíÿ
L (íàïðèìåð, i1 è i2) è ïðèáàâèì ê íèì ïî åäèíèöå:
j1 = i1 + 1, j2=i2+1. Åñëè îêàæåòñÿ, ÷òî j1 è j2 ïðèíàäëåæàò
îäíîé ïîñëåäîâàòåëüíîñòè óðîâíÿ L, òî íà óðîâíå L + 1 èí-
äåêñû i1 è i2 ñëåäóåò âêëþ÷èòü â îäíó ïîäïîñëåäîâàòåëü-
íîñòü.
Îáîñíîâàíèå ýòîãî ôàêòà «ëåæèò íà ïîâåðõíîñòè». Äåé-
ñòâèòåëüíî, ïóñòü A — ñòðîêà, ñîîòâåòñòâóþùàÿ îäíîé ïî-
84 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

ñëåäîâàòåëüíîñòè óðîâíÿ L + 1. Óáðàâ èç íåå ïåðâûé ñèì-


âîë (îí îáùèé), ìû ïîëó÷àåì ïîñëåäîâàòåëüíîñòü äëèíû L,
õàðàêòåðèçóåìóþ ñâîåé ïîñëåäîâàòåëüíîñòüþ èíäåêñîâ.
È ýòè èíäåêñû îáÿçàíû èìåòü îäíó ïðèíàäëåæíîñòü; â ïðî-
òèâíîì ñëó÷àå íàðóøàåòñÿ ëîãèêà äåêîìïîçèöèè òåêñòà.
Âåðíåìñÿ ê ïðèìåðó íà ðèñ. 2.11. Çäåñü åñòü ïîñëåäîâà-
òåëüíîñòü {2, 4, 8} íà óðîâíå 2. Ïðèáàâëåíèå åäèíèöû äàåò
÷èñëà 3, 5 è 8. Íè îäíà ïàðà èç ýòèõ ÷èñåë íå ïðèíàäëåæèò
îäíîé èç ïîñëåäîâàòåëüíîñòåé âòîðîãî óðîâíÿ. Òîãäà èñõîä-
íàÿ ïîñëåäîâàòåëüíîñòü ðàçáèâàåòñÿ íà òðè ïîäïîñëåäîâà-
òåëüíîñòè. Åùå îäíà ïîñëåäîâàòåëüíîñòü — {3, 7}.
Àíàëîãè÷íàÿ îïåðàöèÿ ïðèáàâëåíèÿ åäèíèöû äàåò ÷èñëà 4
è 8. Îíè ïðèíàäëåæàò îäíîé ïîñëåäîâàòåëüíîñòè, ïîýòîìó
èñõîäíóþ ïîñëåäîâàòåëüíîñòü ìû îñòàâëÿåì áåç èçìåíåíèé.
Ïðîâåðèòü ýòî íàáëþäåíèå ìîæíî ñ ïîìîùüþ åùå îäíîãî
ïðèìåðà, ïðèâåäåííîãî íà ðèñ. 2.13 (íà ïîä÷åðêíóòûå ïî-
ñëåäîâàòåëüíîñòè è ïóíêòèðíûå ëèíèè ïîêà íå îáðàùàåì
âíèìàíèÿ).

Ðèñ. 2.13. Ïðèìåð äåêîìïîçèöèè

Íàáëþäåíèå 2.
Ñíîâà îáðàòèìñÿ ê ïðèìåðó íà ðèñ. 2.13. Ïóñòü íåîáõî-
äèìî ðàçáèòü ïîñëåäîâàòåëüíîñòü {2, 4, 7, 10} íà âòîðîì
óðîâíå. Ýòà ïîñëåäîâàòåëüíîñòü ñîîòâåòñòâóåò ïîäñòðîêå bc,
èìåþùåé ñóôôèêñ c. Ïîñëåäîâàòåëüíîñòü, ñîîòâåòñòâóþ-
ùàÿ ñóôôèêñó c íà ïåðâîì óðîâíå, áûëà ðàçáèòà íà äâå ïîä-
ïîñëåäîâàòåëüíîñòè: {3} è {5, 8, 11}. Îäíà èç íèõ — êîðîò-
2.6. Àëãîðèòì Ì. Êðî÷åìîðà 85

êàÿ, à äðóãàÿ — äëèííàÿ. Ïîýòîìó, âî-ïåðâûõ, ìîæíî


óòâåðæäàòü, ÷òî ïîñëåäîâàòåëüíîñòü èíäåêñîâ {2, 4, 7, 10}
òîæå áóäåò ðàçáèòà íà äâå ïîäïîñëåäîâàòåëüíîñòè ïðè ïåðå-
õîäå íà òðåòèé óðîâåíü, à âî-âòîðûõ, ÷òî ýòî ðàçáèåíèå ìîæ-
íî ïîëó÷èòü, èñïîëüçóÿ òîëüêî êîðîòêóþ ïîäïîñëåäîâà-
òåëüíîñòü {3} (ìàëóþ), óæå èìåþùóþñÿ íà âòîðîì óðîâíå.
Ñ åå ïîìîùüþ ïîëó÷àåòñÿ êîðîòêàÿ ïîäïîñëåäîâàòåëüíîñòü
{2}, à èíäåêñû äëèííîé (áîëüøîé) ïîäïîñëåäîâàòåëüíîñ-
òè — {4, 7, 10}, — åñëè ýòî íåîáõîäèìî, ïðîñòî ïåðåïèñûâà-
þòñÿ èç èñõîäíîé ïîñëåäîâàòåëüíîñòè. Ðàçóìååòñÿ, äîïóñ-
òèìî ïîëó÷àòü è ïîäïîñëåäîâàòåëüíîñòü {4, 7, 10} ñ èñïîëü-
çîâàíèåì ïîñëåäîâàòåëüíîñòè {5, 8, 11}, à «â îñòàòêå» èìåòü
{2}, íî ýòî — áîëåå çàòðàòíûé âàðèàíò.

 äåêîìïîçèöèè ïîñëåäîâàòåëüíîñòè óðîâíÿ L íà ïîä-


ïîñëåäîâàòåëüíîñòè óðîâíÿ L + 1 îäíó ïîäïîñëåäîâàòåëü-
íîñòü ñ íàèáîëüøèì êîëè÷åñòâîì ýëåìåíòîâ ìû îïðåäåëèì
êàê áîëüøóþ è ñîñòîÿùóþ èç áîëüøåãî êîëè÷åñòâà èíäåê-
ñîâ, à îñòàëüíûå ïîäïîñëåäîâàòåëüíîñòè — êàê ìàëûå (ìà-
ëûå èíäåêñû). Äëÿ ïåðâîãî óðîâíÿ âñå ïîñëåäîâàòåëüíîñòè
ñîñòîÿò èç ìàëûõ èíäåêñîâ.
Îñíîâíàÿ èäåÿ àëãîðèòìà Ì. Êðî÷åìîðà çàêëþ÷àåòñÿ â
òîì, ÷òîáû íà êàæäîì óðîâíå âûïîëíÿòü äåêîìïîçèöèþ òîëü-
êî ìàëûõ èíäåêñîâ. Ïðè èñïîëüçîâàíèè òîëüêî èõ (ïðè óñëî-
âèè, ÷òî îáðàáîòêà êàæäîãî òðåáóåò êîíñòàíòíîãî âðåìåíè)
âåñü òåêñò ïîäâåðãàåòñÿ äåêîìïîçèöèè çà âðåìÿ O(n · log2(n)).
Äåéñòâèòåëüíî, ïîäñ÷èòàåì, ñêîëüêî ðàç çà âñþ äåêîì-
ïîçèöèþ èíäåêñ i áóäåò ïðèíàäëåæàòü ìàëîé ïîñëåäîâà-
òåëüíîñòè, ò. å. áóäåò ìàëûì. Ïóñòü íà óðîâíå L = 1 îí ïðè-
íàäëåæèò ìàëîé ïîñëåäîâàòåëüíîñòè, â êîòîðîé ñîäåðæèòñÿ
n èíäåêñîâ.  íàèõóäøåì ñëó÷àå ïîñëåäîâàòåëüíîñòü, êîòî-
ðîé ïðèíàäëåæèò i, áóäåò ðàçáèòà íà äâå ðàâíûå ïîñëåäîâà-
òåëüíîñòè, è èíäåêñ i ïîïàäàåò â îäíó èç íèõ. Îòñþäà ñëåäó-
åò, ÷òî èíäåêñ i íå âõîäèò â áîëüøå ÷åì log2(n) + 1 ìàëûõ ïî-
ñëåäîâàòåëüíîñòåé. Âñåãî ó íàñ n èíäåêñîâ, ñëåäîâàòåëüíî,
â ìàëûõ ïîñëåäîâàòåëüíîñòÿõ íà âñåõ óðîâíÿõ ñîäåðæèòñÿ
O(n · log2(n)) èíäåêñîâ.
Îáùèé âèä àëãîðèòìà Ì. Êðî÷åìîðà:
L:=1;
<âû÷èñëåíèå âñåõ ïîñëåäîâàòåëüíîñòåé ïåðâîãî
óðîâíÿ>;
While <åñòü ìàëûå èíäåêñû íà óðîâíå L> Do Begin
86 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

<âûâîä êðàòíûõ ñòðîê ñ ïåðèîäîì L (ïðè èõ


íàëè÷èè)>;
<ñ èñïîëüçîâàíèåì òîëüêî ìàëûõ èíäåêñîâ
ïðîâåäåíèå äåêîìïîçèöèè óðîâíÿ L
â óðîâåíü L+1>;
L:=L+1;
<âû÷èñëåíèå ìàëûõ èíäåêñîâ óðîâíÿ L>;
End;
Ïîêàçàííàÿ ôîðìàëèçàöèÿ ëîãèêè îãîâàðèâàåò òîëüêî
îáùåå óïðàâëåíèå âû÷èñëèòåëüíûì ïðîöåññîì. Ïîëó÷åíèå
âðåìåííîé îöåíêè O(n · log2(n)) çàâèñèò îò èñêóññòâà ñèíòå-
çà ñòðóêòóð äàííûõ è óïðàâëÿþùåé ëîãèêè òîãî, ÷òî íàçû-
âàþò ïðîãðàììîé. Â äàííîì àëãîðèòìå ýòî íåòðèâèàëüíàÿ
çàäà÷à, ÷àñòè÷íî îíà âûíåñåíà â óïðàæíåíèÿ, íî â öåëîì ýòî
ïðåäìåò äîñòîéíîãî èññëåäîâàíèÿ è ïðîâåðêè óðîâíÿ ïðî-
ôåññèîíàëèçìà ÷èòàòåëÿ!

@ Óïðàæíåíèÿ
1. Äàíà ñòðîêà S èç n ñèìâîëîâ (àëôàâèò A óïîðÿäî÷åí,
êàæäûé ñèìâîë èìååò èíäåêñ). Çà âðåìÿ O(n) ïîäñ÷èòàé-
òå êîëè÷åñòâî âõîæäåíèé êàæäîãî ñèìâîëà â ñòðîêó S.
2. Ðàçðàáîòàéòå àëãîðèòì ðàçáèâêè òåêñòà íà óíèêàëüíûå
ïîäñòðîêè ñ âðåìåííîé ñëîæíîñòüþ O(n2).
3. Ïðèâåäèòå ïðèìåð òåêñòà. Âûïîëíèòå åãî äåêîìïîçèöèþ
ñ èñïîëüçîâàíèåì òîëüêî ïîñëåäîâàòåëüíîñòåé èíäåêñîâ
íà êàæäîì óðîâíå (ê ñèìâîëàì òåêñòà ìîæíî îáðàùàòüñÿ
òîëüêî íà ïåðâîì óðîâíå). Ïðîâåðüòå ðåçóëüòàò.
4. Ïðèâåäèòå ïðèìåð òåêñòà. Âûïîëíèòå åãî äåêîìïîçè-
öèþ òàê, êàê ýòî óêàçàíî â ïðåäûäóùåì óïðàæíåíèè, à
òàêæå ñ ó÷åòîì ïðèíöèïà ìàëûõ èíäåêñîâ.
5. Äëÿ âûâîäà êðàòíûõ ñòðîê ñ ïåðèîäîì L íåîáõîäèìî â
êàæäîé ïîñëåäîâàòåëüíîñòè èíäåêñîâ óðîâíÿ L íàéòè
ãðóïïû èäóùèõ ïîäðÿä èíäåêñîâ ñ ïåðèîäîì L. Íàïðè-
ìåð, íà ðèñ. 2.6 ïðè L = 1 ýòî 1, 2 (a2) èç ïåðâîé ïîñëåäî-
âàòåëüíîñòè è 5, 6, 7 (b3) èç âòîðîé, à ïðè L = 2 — 2, 4
(ab2). Ïðåäëîæèòå ñòðóêòóðó äàííûõ äëÿ õðàíåíèÿ èí-
äåêñîâ ïîñëåäîâàòåëüíîñòåé è ðàçðàáîòàéòå ïðîãðàììó
âûâîäà êðàòíûõ ïîäñòðîê.
6. Ïðåäïîëîæèì, ÷òî äëÿ õðàíåíèÿ ïîñëåäîâàòåëüíîñòåé
íà êàæäîì óðîâíå èñïîëüçóåòñÿ ìàññèâ sq âèäà
2.6. Àëãîðèòì Ì. Êðî÷åìîðà 87

Array[1..n] Of Record num, mark End (äëÿ ïðèìåðà íà


ðèñ. 2.6 ïðè L = 1 è L = 2 îí ïðèâåäåí â òàáë. 2.22).
 ïîëå num õðàíèòñÿ èíäåêñ ñèìâîëà, à â ïîëå mark —
íîìåð ïîñëåäîâàòåëüíîñòè.

Òàáëèöà 2.22

num 1 2 3 4 5 6 7 8 9 10
L=1
mark 1 1 2 1 2 2 2 1 2 3
num 1 2 3 4 5 6 7 8 9 –
L=2
mark 1 2 3 2 4 4 3 2 5 –

Âîçìîæíà ëè ïðè âûáîðå òàêîé ñòðóêòóðû äàííûõ ðåà-


ëèçàöèÿ ïåðâîãî íàáëþäåíèÿ çà âðåìÿ O(n)?
7. Ïðåäïîëîæèì, ÷òî äëÿ õðàíåíèÿ ïîñëåäîâàòåëüíîñòåé
íà êàæäîì óðîâíå èñïîëüçóåòñÿ ìàññèâ sq èç çàïèñåé
âèäà:
Record
<ìåòêà ïîñëåäîâàòåëüíîñòè (mark)>;
<êîëè÷åñòâî ýëåìåíòîâ â ïîñëåäîâàòåëüíîñòè>;
<óêàçàòåëü íà ñïèñîê ïàð âèäà (èíäåêñ ýëåìåíòà
(num), ñâÿçü ïî èíäåêñó), ãäå "ñâÿçü ïî èíäåêñó"
– ýòî ìåòêà ïîñëåäîâàòåëüíîñòè, ê êîòîðîé
ïðèíàäëåæèò ñëåäóþùèé èíäåêñ – mark(num+1)>;
End.
Âîçìîæíà ëè ïðè âûáîðå îïèñàííîé ñòðóêòóðû äàííûõ
ðåàëèçàöèÿ âòîðîãî íàáëþäåíèÿ çà âðåìÿ O(n)?
8. Äëÿ ñâÿçè èíäåêñîâ ïîñëåäîâàòåëüíîñòåé îäíîãî óðîâíÿ
èñïîëüçîâàëàñü îïåðàöèÿ ïðèáàâëåíèÿ åäèíèöû. Âîç-
ìîæíî ëè èñïîëüçîâàíèå äëÿ ýòîãî îïåðàöèè âû÷èòàíèÿ
åäèíèöû?
9. Ïðè ïåðåõîäå îò óðîâíÿ ê óðîâíþ ïîÿâëÿþòñÿ íåèñïîëü-
çóåìûå èíäåêñû. Êàêóþ ñòðóêòóðó äàííûõ ñëåäóåò âû-
áðàòü äëÿ èõ õðàíåíèÿ?
10. Êàêóþ ñòðóêòóðó äàííûõ ñëåäóåò âûáðàòü äëÿ õðàíåíèÿ
ìàëûõ èíäåêñîâ?
11. Ðàçðàáîòàéòå ïîëíóþ ïðîãðàììíóþ ðåàëèçàöèþ àëãî-
ðèòìà Ì. Êðî÷åìîðà.
88 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà


...äåëèòü êàæäóþ èç ðàññìàòðèâàåìûõ
ìíîþ òðóäíîñòåé íà ñòîëüêî ÷àñòåé,
íàñêîëüêî ïîòðåáóåòñÿ, ÷òîáû ëó÷øå
èõ ðàçðåøèòü...
Ðåíå Äåêàðò.
Ðàññóæäåíèå î ìåòîäå
Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà ïðåäíàçíà÷åí äëÿ
âû÷èñëåíèÿ âñåõ êâàäðàòîâ ïîäñòðîê ñòðîêè S (|S| = n).

Ïðèìåð
S = babaabab. Ðàçîáüåì S íà äâå ðàâíûå ïîäñòðîêè (ïî-
ëîâèíû): u = baba è v = abab, ò. å. S = uv. Òîãäà â S ñóùåñò-
âóþò êâàäðàòû òðåõ òèïîâ:
2
l ïîëíîñòüþ íàõîäÿùèåñÿ â u – (ba) ;
2
l ïîëíîñòüþ íàõîäÿùèåñÿ â v – (ab) ;
2
l íà÷èíàþùèåñÿ â u è çàêàí÷èâàþùèåñÿ â v – (aba) ;
2
(a) .
Èäåÿ àëãîðèòìà.
Âû÷èñëèì âñå êâàäðàòû ñòðîêè S ïóòåì ðåêóðñèâíîé
ðàçáèâêè ñòðîêè S ïîïîëàì è âû÷èñëåíèÿ êâàäðàòîâ òðåòüå-
ãî òèïà. (Î÷åâèäíî, ÷òî â ýòîì ñëó÷àå îïðåäåëÿþòñÿ êâàäðà-
òû è ïåðâûõ äâóõ òèïîâ.) Åñëè ïðè ýòîì øàã ðåêóðñèè áóäåò
âûïîëíÿòüñÿ çà ëèíåéíîå âðåìÿ, òî îáùåå âðåìÿ ðàáîòû òà-
êîãî àëãîðèòìà áóäåò èìåòü îöåíêó O(n · log2n) — àíà-
ëîãè÷íî áèíàðíîìó ïîèñêó.
Çàïèøåì ñêàçàííîå â äðóãîì âèäå.
Procedure Solve(S:String); {n=Length(S)}
Begin
If n>1 Then Begin
<âû÷èñëåíèå êâàäðàòîâ òðåòüåãî òèïà
äëÿ u=S[1..ën/2û] è v=S[ën/2û+1..n]>;
Solve(u);
Solve(v);
End;
End;

Ââåäåì äâà íîâûõ ïîíÿòèÿ: êâàäðàòû ïðàâîãî è ëåâîãî


âèäà (ðèñ. 2.14).
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 89

Ðèñ. 2.14. Èëëþñòðàöèÿ ïîíÿòèé ïðàâîãî è ëåâîãî êâàäðàòîâ

Ïóñòü w2 — êâàäðàò ñ îáðàçóþùåé w, à u è v — ïîäñòðî-


êè ñòðîêè S (u = S[1..ën/2û], v = S[ën/2û + 1..n]). Òîãäà ïðà-
âûé êâàäðàò — ýòî ïîäñòðîêà w2, â êîòîðîé âòîðîå âõîæäå-
íèå w â ñòðîêó S ïîëíîñòüþ íàõîäèòñÿ â ïîäñòðîêå v. Ëåâûé
êâàäðàò — ýòî ïîäñòðîêà w2, â êîòîðîé âòîðîå âõîæäåíèå w
â ñòðîêó S èìååò íåïóñòîé ïðåôèêñ â ïîäñòðîêå u.
Ïðèìåð
S = ababaa, u = aba, v = baa. Èìåþòñÿ ïðàâûé êâàäðàò
(ba)2 è ëåâûé — (ab)2.

Ïåðâàÿ ñõåìà ðàññóæäåíèé.


Ðàçáåðåìñÿ ñî ñòðóêòóðîé ïðàâîãî êâàäðàòà (ðèñ. 2.15).
Ïóñòü äàíà ïîçèöèÿ i â v (i = 1..n – ën/2û). ßâëÿåòñÿ ëè ýòà
ïîçèöèÿ îêîí÷àíèåì êâàäðàòà w2 (ãäå w — äëèíà êâàäðàòà)?
Ïðåäïîëîæèì, ÷òî äà, è ñíà÷àëà âû÷èñëèì çíà÷åíèÿ èíäåê-
ñîâ, îïðåäåëÿþùèõ âõîæäåíèå w â S.

Ðèñ. 2.15. Ñòðóêòóðà ïðàâîãî êâàäðàòà

Ïðàâîå âõîæäåíèå w íà÷èíàåòñÿ ñ ïîçèöèè j + 1 â v, ãäå


j = i – w (ðèñ. 2.15à). Ëåâîå âõîæäåíèå w íà÷èíàåòñÿ ñ ïîçè-
90 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

öèè k â u: k = n1 + j – w + 1 = n1 + i – w – w + 1 = n1 –
– (2w – i – 1). ×òîáû â ïîçèöèè i çàêàí÷èâàëñÿ êâàäðàò
äëèíîé w, òðåáóåòñÿ âûïîëíåíèå ðàâåíñòâà: u[k..n1]v[1..j] =
= v[j + 1..i], à îíî ðàçáèâàåòñÿ íà äâå ÷àñòè (ðèñ. 2.15á):
l v[1..j] = v[i – j + 1..i] èëè v[1..i – w] = v[w + 1..i];
l u[k..n1] = v[j + 1..i – j] èëè u[n1 – (2w – i – 1)..n1] =
= v[i – w + 1..w].
Ïåðâîå ðàâåíñòâî — ýòî íå ÷òî èíîå, êàê ãðàíü ñòðîêè v â
ïîçèöèè i (ñì. ï. 1.2.1), êîòîðàÿ âû÷èñëÿåòñÿ çà ëèíåéíîå
âðåìÿ. (Íàïîìíèì, ÷òî ãðàíü v[1..i] — ýòî äëèíà íàèáîëü-
øåãî ïðåôèêñà ñòðîêè, ñîâïàäàþùåãî ñ åå ñóôôèêñîì.)
Èòàê, íàì íåîáõîäèìî âû÷èñëèòü ìàññèâ ãðàíåé äëÿ v (îáîç-
íà÷èì åãî êàê brv). Âòîðàÿ æå ÷àñòü ðàâåíñòâà òðåáóåò çíà-
íèÿ îáùèõ ñóôôèêñîâ ñòðîêè u è ïîäñòðîê v (îáîçíà÷èì
ìàññèâ îáùèõ ñóôôèêñîâ êàê csv), ò. å. csv[t] — ýòî äëèíà íà-
èáîëüøåãî ñóôôèêñà ñòðîêè u è ïîäñòðîêè v[1..t]. Ïðåäïî-
ëîæèì, ÷òî çà ëèíåéíîå âðåìÿ âû÷èñëÿåòñÿ íå òîëüêî ìàñ-
ñèâ ãðàíåé brv, íî è csv. Êàê íà îñíîâå ýòîé èíôîðìàöèè
îïðåäåëèòü íàëè÷èå ïðàâûõ êâàäðàòîâ?
Ïðèìåðû
 òàáë. 2.23 è 2.24 äàíû ñòðîêè S = uv, äëÿ êîòîðûõ
ïîäñ÷èòàíû çíà÷åíèÿ ýëåìåíòîâ ìàññèâîâ brv è csv.
Òàáëèöà 2.23

u v
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
a b c a b d a b c a b d a b c a b d a b c a b c
i 1 2 3 4 5 6 7 8 9 0 1 2
brv 0 0 0 1 2 0 1 2 3 4 5 3
csv 0 0 0 0 0 6 0 0 0 0 0 0

Òàáëèöà 2.24

u v
1 2 3 4 5 6 7 8 9 10 11 12 13
a b a a b a b a a b a b a
i 1 2 3 4 5 6 7
brv 0 0 0 1 2 1 2
csv 0 2 1 0 5 0 3
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 91

Âûñêàæåì ïðåäïîëîæåíèå: ÷òîáû ïðàâûé êâàäðàò çà-


êàí÷èâàëñÿ â ïîçèöèè i, íåîáõîäèìî âûïîëíåíèå óñëîâèÿ
2brv[i] + csv[i – brv[i]] … i.
Äëÿ ïåðâîé ñòðîêè èìååì øåñòèêðàòíîå âûïîëíåíèå
ýòîãî óñëîâèÿ:
l 2brv[6] + csv[6 – brv[6]] = 2 · 0 + 6 = 6 … 6 — êâàäðàò
abcabdabcabd;
l 2brv[7] + csv[7 – brv[7]] = 2 · 1 + 6 = 8 … 7 — êâàäðàò
bcabdabcabda;
l 2brv[8] + csv[8 – brv[8]] = 2 · 2 + 6 = 10 … 8 — êâàä-
ðàò cabdabcabdab;
l 2brv[9] + csv[9 – brv[9]] = 2 · 3 + 6 = 12 … 9 — êâàä-
ðàò abdabcabdabc;
l 2brv[10] + csv[10 – brv[10]] = 2 · 4 + 6 = 14 … 10 —
êâàäðàò bdabcabdabca;
l 2brv[11] + csv[11 – brv[11]] = 2 · 5 + 6 = 16 … 11 —
êâàäðàò dabcabdabcab.
Äëÿ âòîðîé ñòðîêè óêàçàííîå âûøå óñëîâèå âûïîëíÿåò-
ñÿ ÷åòûðå ðàçà:
l 2brv[2] + csv[2 – brv[2]] = 2 · 0 + 2 = 2 … 2 — êâàäðàò
baba;
l 2brv[5] + csv[5 – brv[5]] = 2 · 2 + 1 = 5 … 5 — êâàäðàò
abaaba;
l 2brv[6] + csv[6 – brv[6]] = 2 · 1 + 5 = 7 … 6 — êâàäðàò
aababaabab;
l 2brv[7] + csv[7 – brv[7]] = 2 · 2 + 5 = 9 … 7 — êâàäðàò
ababaababa.
Ðàçáåðåìñÿ òåïåðü ñî ñòðóêòóðîé ëåâîãî êâàäðàòà
(ðèñ. 2.16). Ïóñòü äàíà ïîçèöèÿ i â u (i = 1..n1, n1 = n Div 2).
ßâëÿåòñÿ ëè ýòà ïîçèöèÿ íà÷àëîì êâàäðàòà w2 (ãäå w — äëè-
íà êâàäðàòà), çàêàí÷èâàþùåãîñÿ â ïîäñòðîêå v (ðèñ. 2.16à)?
Îïÿòü-òàêè ïðåäïîëîæèì, ÷òî äà, è ñíà÷àëà âû÷èñëèì çíà-
÷åíèÿ èíäåêñîâ, îïðåäåëÿþùèõ âõîæäåíèå w â S.

Ðèñ. 2.16. Ñòðóêòóðà ëåâîãî êâàäðàòà


92 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ïðàâîå âõîæäåíèå w íà÷èíàåòñÿ ñ ïîçèöèè j â u, ãäå


j = i + w (ðèñ. 2.16à), çàêàí÷èâàåòñÿ â ïîçèöèè k â v, ãäå
k = j + w – 1 – n1 = i + 2w – 1 – n1. ×òîáû â ïîçèöèè i íà-
÷èíàëñÿ êâàäðàò äëèíîé w, òðåáóåòñÿ âûïîëíåíèå ðàâåí-
ñòâà: u[i..j – 1] = u[j..n1]v[1..k], à îíî ðàçáèâàåòñÿ íà äâå
÷àñòè (ðèñ. 2.16á):
l u[i..j – k – 1] = u[j..n1] èëè u[i..i + w – i – 2w +1 +
+ n1 – 1] = u[i..n1 – w] = u[i + w..n1];
l u[i + w – k..j – 1] = v[1..k] èëè u[n1 – w + 1..i +
+ w – 1] = v[1..i + 2w – 1 – n1].
Èçâåñòíî (ñì. ï. 1.2.1), ÷òî ãðàíè ìîæíî âû÷èñëÿòü îò-
íîñèòåëüíî íå òîëüêî ïðåôèêñîâ, íî è ñóôôèêñîâ ñòðîêè.
 ï. 1.2.1 ìàññèâ ãðàíåé ñóôôèêñîâ (ìû îáîçíà÷àëè åãî êàê
bw) îïðåäåëÿåòñÿ çà ëèíåéíîå âðåìÿ, à ïåðâàÿ ÷àñòü ðàâåí-
ñòâà — ýòî íå ÷òî èíîå, êàê ìàññèâ ãðàíåé ñóôôèêñîâ ïîä-
ñòðîêè u (îáîçíà÷èì åãî êàê bwu). Âòîðàÿ ÷àñòü ðàâåíñòâà
òðåáóåò çíàíèÿ îáùèõ ïðåôèêñîâ ñòðîêè v è ïîäñòðîê u
(îáîçíà÷èì ìàññèâ îáùèõ ïðåôèêñîâ êàê cpu), ò. å. cpu[t] —
ýòî äëèíà íàèáîëüøåãî ïðåôèêñà ñòðîêè v è ïîäñòðîêè
u[t..n1]. Ïðåäïîëîæèì, ÷òî çà ëèíåéíîå âðåìÿ âû÷èñëÿåòñÿ
íå òîëüêî ìàññèâ ãðàíåé bwu, íî è cpu.
Ïðèìåðû
 òàáë. 2.25 è 2.26 äàíû ñòðîêè S = uv, äëÿ êîòîðûõ
ïîäñ÷èòàíû çíà÷åíèÿ ýëåìåíòîâ ìàññèâîâ bwu è cpu.

Òàáëèöà 2.25

u v
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
a b a b c a b a d a b c a b a d a a b c a b c a
1 2 3 4 5 6 7 8 9 0 1 2 i
0 0 3 2 1 0 0 0 0 0 0 0 bwu
3 0 2 0 0 5 0 1 0 2 0 0 cpu

Òàáëèöà 2.26

u v
1 2 3 4 5 6 7 8 9 10 11 12 13
a b a a b a b a a b a b a
1 2 3 4 5 6 i
1 2 1 1 0 0 bwu
0 5 0 0 2 0 cpu
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 93

Âûñêàæåì ïðåäïîëîæåíèå: ÷òîáû ëåâûé êâàäðàò íà÷è-


íàëñÿ â ïîçèöèè i, íåîáõîäèìî âûïîëíåíèå óñëîâèÿ
2bwu[i] + cpu[i + bwu[i]] … n1 – i + 1.
Äëÿ ïåðâîé ñòðîêè ìû èìååì äâóêðàòíîå âûïîëíåíèå
ýòîãî óñëîâèÿ:
l 2bwu[3] + cpu[3 + bwu[3]] = 2 · 3 + 5 = 11 … 12 – 3 + 1 =
= 10 — êâàäðàò abcabadabcabad;
l 2bwu[4] + cpu[4 + bwu[4]] = 2 · 2 + 5 = 9 … 12 – 4 + 1 =
= 9 — êâàäðàò bcabadabcabada.
À âîò ïðè i = 5 óñëîâèå óæå íå âûïîëíÿåòñÿ:
2bwu[5] + cpu[5 + bwu[5]] = 2 · 1 + 5 = 7 … 12 – 5 + 1 = 8.
Äëÿ âòîðîé ñòðîêè (ñì. òàáë. 2.26):
l 2bwu[1] + cpu[1 + bwu[1]] = 2 · 1 + 5 = 7 … 6 – 1 + 1 =
= 6 — êâàäðàò abaababaab;
l 2bwu[4] + cpu[4 + bwu[4]] = 2 · 1 + 2 = 4 … 6 – 4 + 1 =
= 3 — êâàäðàò abab;
l 2bwu[5] + cpu[5 + bwu[5]] = 2 · 0 + 2 = 2 … 6 – 5 + 1 =
= 2 — êâàäðàò baba.
Ïðèìå÷àíèå. Ïåðåä ïåðâûì ñèìâîëîì u äîáàâëÿåòñÿ íå-
ñóùåñòâóþùèé â àëôàâèòå ñèìâîë.
Åñëè èñõîäèòü èç âåðíîñòè ïðèíÿòûõ íàìè ïðåäïîëîæå-
íèé, òî äëÿ çàâåðøåíèÿ îáñóæäåíèÿ íåîáõîäèìî ïîíèìàíèå
òîãî, êàê çà ëèíåéíîå âðåìÿ âû÷èñëÿòü çíà÷åíèÿ ýëåìåíòîâ
ìàññèâîâ csv — äëèí íàèáîëüøèõ ñóôôèêñîâ ñòðîêè u è ïîä-
ñòðîê v[1..i] (i = 1..n2), è cpu — äëèí íàèáîëüøèõ ïðåôèêñîâ
ñòðîêè v è ïîäñòðîêè u[i..n1] (i = 1..n1).
Íà÷íåì ñ ïîñëåäíåãî ìàññèâà (ðèñ. 2.17). Ïðåäïîëîæèì,
÷òî äëÿ íåêîòîðîãî çíà÷åíèÿ i âû÷èñëåí îáùèé ïðåôèêñ, è
îí çàêàí÷èâàåòñÿ â ïîçèöèè t, ò. å. èçâåñòíî çíà÷åíèå cpu[i].
Ñòðóêòóðà ýòîãî ïðåôèêñà îïðåäåëÿåòñÿ çíà÷åíèåì ìàññèâà
ãðàíåé brv â ïîçèöèè t – i + 1, ÷òî ïîçâîëÿåò, âî-ïåðâûõ,
âû÷èñëÿòü ñëåäóþùèì çíà÷åíèå cpu[q] (âñå îñòàëüíûå ñäâè-
ãè íå èìåþò ñìûñëà), à âî-âòîðûõ (è ýòî ãëàâíîå!), âûïîë-
íÿòü ñðàâíåíèå ñèìâîëîâ u[t + 1] è v[brv[t – i + 1] + 1]. Òà-
êèì îáðàçîì, âîçâðàòîâ ïî ñòðîêå u íåò, ÷òî äàåò ïðåäïîñûë-
êè äëÿ ïîëó÷åíèÿ ëèíåéíîãî àëãîðèòìà.
Òàê ÷òî ïðèíöèï èñïîëüçîâàíèÿ brv äëÿ ïîëó÷åíèÿ cpu
óæå ïðîñìàòðèâàåòñÿ, îñòàëîñü ïðîðàáîòàòü äåòàëè.
Àíàëîãè÷íàÿ ñèòóàöèÿ — è ñ ìàññèâîì csv — äëèíàìè
íàèáîëüøèõ ñóôôèêñîâ ñòðîêè u è ïîäñòðîê v[1..i]
94 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ðèñ. 2.17. Ïðèíöèï âû÷èñëåíèÿ ìàññèâà cpu

(i = 1..n2). Îíà ïðèâåäåíà íà ðèñ. 2.18; ïðè ýòîì èñïîëüçóåò-


ñÿ óæå âû÷èñëåííûé ìàññèâ bwu — ãðàíè ñóôôèêñîâ ïîä-
ñòðîêè u. Ïðåäïîëîæèì, ÷òî âû÷èñëåíî çíà÷åíèå csv[i], è
îáùèé ñóôôèêñ çàêàí÷èâàåòñÿ â ïîçèöèè t. Ñòðóêòóðà ñóô-
ôèêñà îïðåäåëåíà ñîîòâåòñòâóþùèì ýëåìåíòîì ìàññèâà
bwu, ÷òî ïîçâîëÿåò ïåðåéòè ê âû÷èñëåíèþ çíà÷åíèÿ csv[q] è
âûïîëíÿòü ñðàâíåíèå ýëåìåíòîâ v[t – 1] è u[n1 – bwu[n1 –
– (i – t)]].

Ðèñ. 2.18. Ïðèíöèï âû÷èñëåíèÿ ìàññèâà csv

Âòîðàÿ ñõåìà ðàññóæäåíèé.


Êàçàëîñü áû, ëîãèêà ðåøåíèÿ çàäà÷è óæå âûñòðîåíà.
Îäíàêî âñïîìíèì, ÷òî ñëåäóåò âñå ïîäâåðãàòü ñîìíåíèþ —
ýòî îäèí èç ïðèíöèïîâ ðàáîòû ñïåöèàëèñòà ïî èíôîðìàòè-
êå, — óæ î÷åíü (â äàííîì ñëó÷àå) ïðîñòà ïîëó÷àåìàÿ «êîí-
ñòðóêöèÿ» äëÿ äîñòàòî÷íî ñëîæíîé ïðîáëåìû!
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 95

Ïðèìåð
 òàáë. 2.27 ïðåäñòàâëåíû äàííûå åùå ïî îäíîé ñòðîêå,
äëÿ êîòîðîé òðåáóåòñÿ íàéòè âñå åå êâàäðàòû. Ïðîâåðèì
íàëè÷èå ïðàâûõ êâàäðàòîâ, — à õîòÿ áû îäèí òàêîâîé ó íàñ
ÿâíî åñòü — abcdcabcabcdcabc.

Òàáëèöà 2.27

u v
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
a a a b c d c a b c a b c d c a b c
i 1 2 3 4 5 6 7 8 9
brv 0 0 0 1 0 1 2 3 4
csv 0 0 3 0 0 0 0 7 0

Ïðîâåðèì íàøå ïðåäïîëîæåíèå îòíîñèòåëüíî ïðàâûõ


êâàäðàòîâ: 2brv[i] + csv[i – brv[i]] … i. Äëÿ i = 9: 2 · brv[9] +
+ csv[9 – brv[9]] = 2 · 4 + 0 = 8, — ýòî óñëîâèå íå âûïîëíÿ-
åòñÿ, íî äëÿ 2 · brv[brv[9]] + csv[9 – brv[brv[9]]] = 2 · 1 + 7 =
= 9 … 9 îíî âåðíî! Ïîëó÷àåòñÿ, ÷òî ñëåäóåò ïðîâåðÿòü íå
òîëüêî ãðàíü, çàêàí÷èâàþùóþñÿ â ïîçèöèè i, íî è åå ãðàíè,
çàòåì — ãðàíè ýòèõ ãðàíåé, è òàê ïîêà ìû íå äîéäåì äî íó-
ëåâîãî çíà÷åíèÿ. Àíàëîãè÷íûé êîíòðïðèìåð ìîæíî íàéòè
è äëÿ ëåâûõ êâàäðàòîâ.
Âåðíåìñÿ ê àíàëèçó ïðàâîãî êâàäðàòà (ñì. ðèñ. 2.15).
Âûïîëíåíèå ðàâåíñòâà u[k..n1]v[1..j] = v[j + 1..i] íåîáõîäè-
ìî. Íî ðàâåíñòâî v[1..j] = v[i – j + 1..i] ìîæíî çàïèñàòü êàê
v[1..j] = v[w + 1..i], à ýòî ïî÷òè ôîðìóëà äëÿ áëîêà ñòðîêè v
â ïîçèöèè w + 1 (â ôîðìóëå áëîêà — äëèíà ìàêñèìàëüíîé
ïîäñòðîêè, ñîâïàäàþùåé ñ ïðåôèêñîì ñòðîêè). Ïîïðîáóåì
âû÷èñëèòü íå ãðàíè ñòðîêè v, à áëîêè — ìàññèâ blv (ñì.
ï. 1.2.2). Ïóñòü ìàññèâû blv è csv âû÷èñëåíû. ×òîáû êâàäðàò
äëèíîé w çàêàí÷èâàëñÿ â ïîçèöèè i ñòðîêè v, íåîáõîäèìî
âûïîëíåíèå íåðàâåíñòâ blv[w + 1] … l2 è csv[w] … l1, èíà÷å â
êâàäðàòå áóäåò «ðàçðûâ» (ðèñ. 2.19), è ïîäñòðîêà íå áóäåò
êðàòíîé. Íà îñíîâå ýòèõ íåðàâåíñòâ ïîÿâëÿåòñÿ âîçìîæ-
íîñòü îïðåäåëèòü ãðàíèöû i, â êîòîðûõ ìîæåò çàêàí÷èâàòü-
ñÿ êâàäðàò.
Çäåñü â ñòðîêå S = uv èìååòñÿ êâàäðàò äëèíîé 2w, çà-
êàí÷èâàþùèéñÿ â ïîçèöèè i ïîäñòðîêè v ïðè óñëîâèè, ÷òî
96 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ðèñ. 2.19. Ïðàâûé êâàäðàò

2w – csv[w] „ i „ w + blv[w + 1]. Äåéñòâèòåëüíî, ÷òîáû â


ïîçèöèè i çàêàí÷èâàëñÿ êâàäðàò äëèíîé w, òðåáóåòñÿ âû-
ïîëíåíèå ðàâåíñòâà: u[k..n1]v[1..j] = v[j + 1..i], à îíî ðàçáè-
âàåòñÿ íà äâå ÷àñòè:
l u[n1 – (2w – i – 1)..n1] = v[i – w + 1..w];
l v[1..i – w] = v[w + 1..i]; ïðè i = w êâàäðàò ôîðìè-
ðóåòñÿ èç ñóôôèêñà u è ïðåôèêñà v, è ýòà ÷àñòü «âû-
ðîæäàåòñÿ».
Ïåðâàÿ ÷àñòü äàííîãî ðàâåíñòâà ãîâîðèò î òîì, ÷òî ñòðîêà
v[i – w + 1..w] äëèíîé 2w – i ÿâëÿåòñÿ ñóôôèêñîì ñòðîêè u, è
îíî âûïîëíÿåòñÿ òîëüêî òîãäà, êîãäà csv[w] … 2w – i, ò. å.
2w – csv[w] „ i. Àíàëîãè÷íî, äëÿ âòîðîé ÷àñòè ðàâåíñòâà:
ñòðîêà v[w + 1..i] äëèíîé i – w ÿâëÿåòñÿ áëîêîì ñòðîêè v, îò-
êóäà ñëåäóåò, ÷òî blv[w + 1] … i – w, ò. å. i „ w + blv[w + 1].
Èòàê, äëÿ êàæäîãî äîïóñòèìîãî çíà÷åíèÿ w Î 1..n2 ñîîò-
âåòñòâóþùèå çíà÷åíèÿ i ìîãóò íàõîäèòüñÿ òîëüêî â èíòåðâà-
ëå 2w – csv[w]..w + blv[w + 1]. Ïîýòîìó ïðè âû÷èñëåííûõ
ìàññèâàõ blv è csv ôàêòè÷åñêèå çíà÷åíèÿ i îïðåäåëÿþòñÿ çà
êîíñòàíòíîå âðåìÿ ïóòåì âûâîäà ãðàíèö ýòèõ èíòåðâàëîâ
ïðè âûïîëíåíèè óñëîâèÿ blv[w + 1] + csv[w] … w.
Ðàññìîòðèì òåïåðü ëåâûé êâàäðàò (ñì. ðèñ. 2.16). Äëÿ
íåãî íåîáõîäèìî âûïîëíåíèå ðàâåíñòâà u[i..i + w – 1] =
= u[i + w..n1]v[1..i + 2w – 1 – n1], êîòîðîå ðàçáèâàåòñÿ íà
äâå ÷àñòè:
l u[i..n1 – w] = u[n1 – (i + w – 1) + 1..n1];
l u[(n1 – w) + 1..n1 – (i + w – 1)] = v[1..i + 2w – 1 – n1].

Áóäåì ñ÷èòàòü, ÷òî ìàññèâû bwu è cpu âû÷èñëåíû. Ìàñ-


ñèâ bwu äàåò íàèáîëüøèé îáùèé ñóôôèêñ ïîäñòðîêè u[1..i] è
ñòðîêè u, ò. å. çíà÷åíèå bwu[n1 – w] (ðèñ. 2.20) äîëæíî áûòü
áîëüøå l1. Ìàññèâ æå cpu äàåò íàèáîëüøèé îáùèé ïðåôèêñ
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 97

ïîäñòðîêè u[i..n1] è ñòðîêè v, ò. å. çíà÷åíèå cpu[n1 – w + 1]


äîëæíî áûòü áîëüøå l2 (ðèñ. 2.20).

Ðèñ. 2.20. Ëåâûé êâàäðàò

×òîáû â ñòðîêå S = uv èìåëñÿ êâàäðàò äëèíîé 2w, íà÷è-


íàþùèéñÿ ñ ïîçèöèè i ïîäñòðîêè u, íåîáõîäèìî âûïîëíå-
íèå óñëîâèÿ (n1 – w) – bwu[n1 – w] „ i – 1 „ (n1 – 2w) +
+ cpu[n1 – w + 1]. Äåéñòâèòåëüíî, ïåðâàÿ ÷àñòü ðàâåíñòâà
ãîâîðèò î òîì, ÷òî ñòðîêà u[i..n1 – w] äëèíîé n1 – (i + w – 1)
ÿâëÿåòñÿ ñóôôèêñîì ñòðîêè u, ò. å. bwu[n1 – w] … n1 –
– (i + w – 1) èëè (n1 – w) – bwu[n1 – w] „ i – 1. Âòîðàÿ æå
÷àñòü ðàâåíñòâà òðåáóåò (äëÿ ñòðîêè u[(n1 – w) + 1..n1 –
– (i + w – 1)] äëèíîé i + 2w – 1 – n1) âûïîëíåíèÿ óñëîâèÿ
cpu[n1 – w + 1] … i + 2w – 1 – n1, èëè i – 1 „ (n1 – 2w) +
+ cpu[n1 – w + 1]. Ñëåäîâàòåëüíî, äëÿ êàæäîãî äîïóñòèìîãî
çíà÷åíèÿ w Î 1..n1 ñîîòâåòñòâóþùèå çíà÷åíèÿ i ìîãóò íàõî-
äèòüñÿ òîëüêî â èíòåðâàëå îò (n1 – w) – bwu[n1 – w] äî
(n1 – 2w) + cpu[n1 – w + 1]. Ïîýòîìó ïðè âû÷èñëåííûõ ìàñ-
ñèâàõ bwu è cpu ôàêòè÷åñêèå çíà÷åíèÿ i îïðåäåëÿþòñÿ çà
êîíñòàíòíîå âðåìÿ ïóòåì âûâîäà ãðàíèö ýòèõ èíòåðâàëîâ
ïðè âûïîëíåíèè óñëîâèÿ cpu[n1 – w + 1] + bwu[n1 – w] … w.
Íà ýòîì ìû çàâåðøèì îáñóæäåíèå àëãîðèòìà, âûíåñÿ
îñòàâøóþñÿ ÷àñòü (â òîì ÷èñëå âû÷èñëåíèå ìàññèâîâ csv, cpu
è bwu íà îñíîâå ìàññèâà blv) â óïðàæíåíèÿ.

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåð ñòðîêè S. Âûïèøèòå âñå åå êâàäðàòû
â òîé î÷åðåäíîñòè, â êîòîðîé îíè áóäóò âûâåäåíû ïðè
ðåêóðñèâíîé ðåàëèçàöèè àëãîðèòìà Ì. Ìåéíà – Ð. Ëî-
ðåíöà.
98 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

2. Ìîäèôèöèðóéòå ïðîöåäóðû âû÷èñëåíèÿ ìàññèâîâ ãðà-


íåé ïðåôèêñîâ è ñóôôèêñîâ (brv, bwu), ïðèâåäåííûå â
ï. 1.2.1, äëÿ èõ èñïîëüçîâàíèÿ â àëãîðèòìå Ì. Ìåéíà –
Ð. Ëîðåíöà. Ìîæíî ëè äîâåñòè ïåðâûé ñïîñîá ðàññóæäå-
íèé äî àëãîðèòìà ñ ëèíåéíîé âðåìåííîé îöåíêîé ðàáî-
òû O(n)?
3. Äëÿ ñòðîêè S âû÷èñëèòå çíà÷åíèÿ ýëåìåíòîâ ìàññèâîâ
csv è cpu âðó÷íóþ è ñ èñïîëüçîâàíèåì brv, bwu. Ñðàâíèòå
ðåçóëüòàòû.
4. Ïðèâåäèòå êîíòðïðèìåð, ïîêàçûâàþùèé íåêîððåêò-
íîñòü îïðåäåëåíèÿ ëåâîãî êâàäðàòà ïðè ïåðâîì ñïîñîáå
ðàññóæäåíèé.
5. Ïðîâåðüòå ïðàâèëüíîñòü âû÷èñëåíèÿ ìàññèâà áëîêîâ
ñòðîêè ñ ïîìîùüþ ñëåäóþùåé ïðîöåäóðû. Îöåíèòå âðå-
ìÿ åå ðàáîòû.
Procedure Bloc(s:String);
Var i,k,l:Byte;
Begin
s:=s+'$';
blv[2]:=0;
While (s[blv[2]+1]=s[blv[2]+2]) Do
blv[2]:=blv[2]+1;
k:=2;
For i:=3 To Length(s)+1 Do Begin
l:=k+blv[k]–i;
If blv[i–k+1] < l Then blv[i]:=blv[i–k+1]
Else blv[i]:=max(0,l);
While (s[blv[i]+1]=s[blv[i]+i]) Do
blv[i]:=blv[i]+1;
k:=i;
End;
End;
6. Íà îñíîâàíèè ïðèâåäåííîé ïðîöåäóðû Cpu îïðåäåëèòå
ëîãèêó ôîðìèðîâàíèÿ ìàññèâà cpu — äëèí íàèáîëüøèõ
ïðåôèêñîâ ñòðîêè v è ïîäñòðîê u[t..n1] (t = 2..n1).
Procedure Cpu(v,u:String);
Var i, k, l:Byte;
Begin
v:=v+'$'; u:=u+'@';
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 99

cpu[2]:=0;
While (v[cpu[2]+1]=u[cpu[2]+2]) Do
cpu[2]:=cpu[2]+1;
k:=2;
For i:=3 To Length(u) Do Begin
l:=k+cpu[k]–i;
If blv[i–k+1]<l Then cpu[i]:=blv[i–k+1]
Else cpu[i]:=max(0,l);
While (v[cpu[i]+1]=u[cpu[i]+i]) Do
cpu[i]:=cpu[i]+1;
k:= i;
End;
End;
7. Ñ ïîìîùüþ ïðîöåäóðû Bwu âû÷èñëÿþòñÿ çíà÷åíèÿ ýëå-
ìåíòîâ ìàññèâà bwu — ãðàíè ñóôôèêñîâ ïîäñòðîêè u.
Ïðîâåðüòå åå ðàáîòîñïîñîáíîñòü. Ñðàâíèòå äàííóþ ëîãè-
êó âû÷èñëåíèÿ ñ ïðèâåäåííîé â ï. 1.2.1.
Procedure Bwu(s:String);
Var i, k, l, n1:Byte;
Begin
s:='@'+s;
n1:=Length(s);
While s[n1-bwu[(n1-1)-1]]=
s[(n1-bwu[(n1-1)-1])-1] Do
bwu[(n1-1)-1]:=bwu[(n1-1)-1]+1;
k:=n1-1;
For i:=n1-2 DownTo 1 Do Begin
l:=bwu[k-1]-(k-i);
If bwu[(n1-(k-i)+1)-1]<l Then
bwu[i-1]:=bwu[(n1-(k-i)+1)-1]
Else bwu[i-1]:=max(0,l);
While (s[n1-bwu[i-1]]=s[i-bwu[i-1]]) Do
bwu[i-1]:=bwu[i-1]+1;
k:=i;
End;
End;
8. Îïðåäåëèòå ïî ïðîöåäóðå Csv ëîãèêó ôîðìèðîâàíèÿ
ìàññèâà csv — äëèí íàèáîëüøèõ îáùèõ ñóôôèêñîâ ñòðî-
êè u è ïîäñòðîê v[1..t] (t = 1..n2).
100 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Procedure Csv(u,v:String);
Var i, k, l, n1, n2:Byte;
Begin
v:='$'+v;
u:='@'+u;
n1:=Length(u);
n2:=Length(v);
While u[n1-csv[n2-1]]=v[n2-csv[n2-1]] Do
csv[n2-1]:=csv[n2-1]+1;
k:=n2;
For i:=n2-1 DownTo 1 Do Begin
l:=csv[k-1]-(k-i);
If bwu[n1-(k-i)+1]<l Then
csv[i-1]:=bwu[n1-(k-i)+1]
Else csv[i-1]:=max(0,l);
While (u[n1-csv[i-1]]=v[i-csv[i-1]]) Do
csv[i-1]:=csv[i-1]+1;
k:=i;
End;
End;
9. Ïðèâåäåííûé íèæå ôðàãìåíò ïðîãðàììíîãî êîäà îáåñ-
ïå÷èâàåò âûâîä êâàäðàòîâ. Çíà÷åíèå ïåðåìåííîé c ðàâ-
íî 1 ëèáî n1 + 1 (â çàâèñèìîñòè îò òîãî, âûçûâàåòñÿ ëî-
ãèêà ñ u èëè ñ v). Óëó÷øèòå ýòîò ïðîãðàììíûé êîä.
w:=1;
While w<=n2 Do Begin
If (blv[w+1]+csv[w]>=w) Then Begin
WriteLn('(',w,',',((2*w-csv[w])+n1+c-1)-
2*w+1,',',((w+blv[w+1])+n1+c-1)-
2*w+1,') R');
For i:=((2*w-csv[w])+n1+c-1)-2*w+1 To
((w+blv[w+1])+n1+c-1)-2*w+1 Do
WriteLn('Ïðàâûé êâàäðàò ',Copy(S,i,2*w),
' ñ äëèíîé=',w,' è íà÷àëîì
â ïîçèöèè ',i);
End;
If (cpu[(n1-w)+1]+bwu[n1-w]>=w) And (w<n1)
Then Begin
If (((n1-w)-bwu[n1-w])+1)=
((n1-2*w)+cpu[(n1-w)+1]+1)
2.7. Àëãîðèòì Ì. Ìåéíà – Ð. Ëîðåíöà 101

Then WriteLn('(',w,',',(((n1-w)-bwu[n1-w])
+1)+c-1,',',((n1-2*w)+
cpu[(n1-w)+1]+1)+c-1,') L')
Else WriteLn('(',w,',',(((n1-w)-bwu[n1-w])
+1)+c-1,',',((n1-2*w)+bwu[(n1
-p)+1]+1)+c-2,') L');
For i:=(((n1-w)-bwu[n1-w])+1)+c-1 To
((n1-2*w)+cpu[(n1-w)+1]+1)+c-2 Do
WriteLn('Ëåâûé êâàäðàò ',Copy(S,i,2*w),
' ñ äëèíîé=',w,' è íà÷àëîì
â ïîçèöèè ',i);
End;
w:=w+1;
End;
10. Ðàçðàáîòàéòå ïîëíóþ ïðîãðàììíóþ ðåàëèçàöèþ àëãî-
ðèòìà Ì. Ìåéíà – Ð. Ëîðåíöà.

Ìåòîäè÷åñêèé êîììåíòàðèé
Àëãîðèòìû Ä. Êíóòà (Donald Knuth) – Äæ. Ìîððèñà
(James Morris) – Â. Ïðàòòà (Vaughan Pratt)1) è Ð. Áîéåðà
(Robert Boyer) – Äæ. Ìóðà (James Moore)2) ÿâëÿþòñÿ êëàññè-
êîé äàííîãî ðàçäåëà èíôîðìàòèêè (computer science). Â òîé
èëè èíîé ìåðå îíè çàòðàãèâàþòñÿ âî ìíîãèõ ó÷åáíèêàõ ïî èí-
ôîðìàòèêå ïðè èçó÷åíèè òåìû ïîèñêà äàííûõ, âêëþ÷àÿ êëàñ-
ñè÷åñêóþ ðàáîòó Í. Âèðòà (Niklaus Wirth)3).
Ð. Êàðï (Richard Karp) è Ì. Ðàáèí (Michael Rabin)4) îïóá-
ëèêîâàëè ñâîé ìåòîä ïîèñêà îáðàçöà â òåêñòå â 1987 ã. Â ðàáî-
òå Ä. Ãàñôèëäà (ñ. 108), îäíàêî, óòâåðæäàåòñÿ, ÷òî îí èçîáðå-
òåí äåñÿòèëåòèåì ðàíåå. Åñëè àëãîðèòìû Ä. Êíóòà – Äæ. Ìîð-
ðèñà – Â. Ïðàòòà è Ð. Áîéåðà – Äæ. Ìóðà, à òàêæå èõ
ìíîãî÷èñëåííûå ìîäèôèêàöèè, ñäåëàííûå ïîñëå 1977 ã.,
îñíîâàíû íà ñðàâíåíèè ñèìâîëîâ è ñäâèãàõ, òî â äàííîì ìåòî-
äå çàëîæåí ñîâåðøåííî äðóãîé ïðèíöèï — «àðèôìåòè÷åñ-
êèé». Îáðàçåö è ñòðîêà òåêñòà ïðåîáðàçóþòñÿ â ÷èñëà, è ïðî-
èñõîäèò ñðàâíåíèå íå ñèìâîëîâ, à ÷èñåë. Ïðè ýòîì âñå îïðåäå-
ëÿåòñÿ ýôôåêòèâíîñòüþ ïðåîáðàçîâàíèÿ ïîäñòðîêè â ÷èñëî.

1)
Knuth D. E., Morris J. H., Pratt V. R. Fast pattern matching in strings // SIAM J.
Comput. 6–2, 1977. P. 323–350.
2)
Boyer R. S., Moore J. S. A fast string searching algorithm // CACM, 20–10,
1977. P. 762–772.
3)
Âèðò Í. Àëãîðèòìû è ñòðóêòóðû äàííûõ. — Ì.: Ìèð, 1989.
4)
Karp R. M., Rabin M. O. Efficient randomized pattern – matching algorithms //
IBM J. Res. Develop. 31–2, 1987. P. 85–103.
102 Ãëàâà 2. Êëàññè÷åñêèå àëãîðèòìû îáðàáîòêè ñòðîê

Ð. Áåçà-Éåòñ (Ricardo Baeza-Yates) è Ã. Ãîííåò (Gaston


Gonnet)1) â 1992 ã. ïðåäëîæèëè ïðîñòîé áèòîâûé ìåòîä (àëãî-
ðèòì Shift–And), êîòîðûé î÷åíü ýôôåêòèâíî ðåøàåò çàäà÷ó
òî÷íîãî ïîèñêà äëÿ îòíîñèòåëüíî ìàëûõ îáðàçöîâ (íàïðèìåð,
äëèíîé â òèïè÷íîå àíãëèéñêîå ñëîâî). Îäíàêî, êàê óêàçàíî â
ðàáîòå Á. Ñìèòà (Bill Smith) (ñ. 240), ïåðâîíà÷àëüíî ýòîò àëãî-
ðèòì åùå â 1968 ã. áûë îïèñàí Á. ĸì¸ëêè (Balint Domolki)2).
Ôîðìàëèçì òåîðèè àâòîìàòîâ ÿâëÿåòñÿ äîñòàòî÷íî êî-
íñòðóêòèâíûì èíñòðóìåíòîì îïèñàíèÿ àëãîðèòìîâ îáðàáîò-
êè ñòðîê.  äàííîé ãëàâå çàòðîíóòû òîëüêî ïåðâè÷íûå ïîíÿ-
òèÿ ýòîé õîðîøî ðàçðàáîòàííîé òåîðèè. Ññûëêè íà èñòî÷íèêè
íå ïðèâîäÿòñÿ, èáî ïðè íåîáõîäèìîñòè èõ íåòðóäíî íàéòè
ñàìîñòîÿòåëüíî.
Àëãîðèòì Ì. Êðî÷åìîðà (Maxime Crochemore)3) ÿâëÿåòñÿ
îäíèì èç îñíîâíûõ â çàäà÷å ïîèñêà êðàòíûõ ñòðîê. Åñëè èäåÿ
äàííîãî àëãîðèòìà ïîíèìàåòñÿ äîñòàòî÷íî ïðîñòî, òî ýòîãî
íåëüçÿ ñêàçàòü î åãî ïðîãðàììíîé ðåàëèçàöèè, êîòîðàÿ (â ïîë-
íîì âàðèàíòå è ñ ó÷åòîì òåñòèðîâàíèÿ), áåçóñëîâíî, ñëóæèò
ïðåäìåòîì ïðîâåðêè ïðîôåññèîíàëüíîãî óðîâíÿ ÷èòàòåëÿ.
Ïðè÷åì îáðàùåíèå ê êíèãå Á. Ñìèòà íå ïðîÿñíèò ñèòóàöèþ ñ
ïðîãðàììíîé ðåàëèçàöèåé, à ñêîðåå çàïóòàåò åå. (Ïðèìå÷à-
íèå. Ïðèâîäèòü â äàííîé êíèãå ïîëíóþ ðåàëèçàöèþ ïðîãðàì-
ìû è åå ðàçáîð àâòîð íå ñòàë, òàê êàê ýòî âëå÷åò çíà÷èòåëüíîå
óâåëè÷åíèå îáúåìà êíèãè è âðÿä ëè öåëåñîîáðàçíî, èñõîäÿ èç
ïîñòàâëåííûõ öåëåé.)
Àëãîðèòì æå Ì. Ìåéíà (Michael Main) è Ð. Ëîðåíöà
(Richard Lorentz)4) èíòåðåñåí íå òîëüêî ñ òî÷êè çðåíèÿ èñ-
ïîëüçîâàíèÿ êëàññè÷åñêîãî ïðèíöèïà «ðàçäåëÿé è âëàñòâóé»
â ðåøåíèè çàäà÷, íî è ýôôåêòèâíûì ïðèìåíåíèåì ðàíåå ðàñ-
ñìîòðåííûõ ìåòîäîâ ïðåäâàðèòåëüíîãî àíàëèçà ñòðîê.

1)
Baeza-Yates R. A., Gonzaio N. H. A new approach to text searching // CACM,
35–70, 1992. P. 74–82.
2)
Domolki B. A universal computer system based on production rules // BITS,
1968. P. 262–275.
3)
Crochemore M. An optimal algorithm for computing all the repetitions in a word
// IPL, 12–5, 1981. P. 244–248.
4)
Main M. G., Lorentz R. J. An O(n·logn) algorithm for finding all repetitions in a
string // J. Algs., 5, 1984. P. 422–432.
Ãëàâà 3

Äåðåâüÿ ñóôôèêñîâ

Äåðåâüÿ ïðèíàäëåæàò ê ÷èñëó ñàìûõ


ëó÷øèõ âåùåé, êàêèå ÿ òîëüêî çíàþ.
Âîäà, äåðåâüÿ è äåâóøêè.
Ýðëåíä Ëó

Çíàíèÿ î ñòðóêòóðå îáðàçöà (èç êàêèõ ÷àñòåé, íàïðè-


ìåð, ïîâòîðÿþùèõñÿ ôðàãìåíòîâ è êàê îíè ñâÿçàíû ìåæäó
ñîáîé) ïîçâîëÿþò ýôôåêòèâíî ðåøàòü çàäà÷ó åãî ïîèñêà â
òåêñòå. Ýòîò âûâîä âïîëíå åñòåñòâåíåí ïîñëå èçó÷åíèÿ àëãî-
ðèòìîâ èç âòîðîé ãëàâû. Òåïåðü æå ìû ðàññìîòðèì íîâóþ
ñòðóêòóðó äàííûõ — äåðåâî ñóôôèêñîâ, êîòîðîå ñòðîèòñÿ íà
ñòàäèè ïðåäâàðèòåëüíîé îáðàáîòêè äëÿ òåêñòà, à íå äëÿ îá-
ðàçöà, è çà ëèíåéíîå âðåìÿ (èíà÷å ñìûñë åãî ïîñòðîåíèÿ òå-
ðÿåòñÿ). Ïîñëå ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ çàäà÷à îïðåäå-
ëåíèÿ âõîæäåíèÿ îáðàçöà â òåêñò òàêæå ðåøàåòñÿ çà ëèíåé-
íîå âðåìÿ.

3.1. Îñíîâíûå ïîíÿòèÿ.


Ïðîñòûå àëãîðèòìû ïîñòðîåíèÿ
äåðåâà ñóôôèêñîâ
 îêíå çâåçäà, äåðåâüÿ çà îêíîì,
Êàê ñòðàæíèêè, ìîé îõðàíÿþò äîì.
Áîðèñ Ðûæèé
Äåðåâî ñóôôèêñîâ ñòðîêè S äëèíû n — ýòî íå ÷òî èíîå,
êàê ñïîñîá êîìïàêòíîãî îïèñàíèÿ ìíîæåñòâà åå ñóôôèêñîâ.
Ýòî äåðåâî ÿâëÿåòñÿ îðèåíòèðîâàííûì; âñÿ åãî ñïåöèôèêà
çàêëþ÷àåòñÿ â òîì, êàê îíî ñòðîèòñÿ. Ñòðîêà S äîïîëíÿåòñÿ
òåðìèíàëüíûì ñèìâîëîì (îáû÷íî $), êîòîðîãî, ïî ïðåäïî-
ëîæåíèþ, íåò â àëôàâèòå A. Äåðåâî ñóôôèêñîâ èìååò êî-
ðåíü, n + 1 ëèñòüåâ (êîíå÷íûõ âåðøèí, ïîìå÷àåìûõ öåëû-
ìè ÷èñëàìè îò 1 äî n + 1) è íå áîëåå n âíóòðåííèõ âåðøèí.
104 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Êàæäàÿ äóãà äåðåâà èìååò ìåòêó â âèäå ñîîòâåòñòâóþùåé


ïîäñòðîêè ñòðîêè S. Îáû÷íî ïðè ýòîì â ïàìÿòè êîìïüþòåðà
õðàíÿò íå ñàìó ïîäñòðîêó, à äâà öåëûõ ÷èñëà, îïðåäåëÿþ-
ùèõ íà÷àëî è êîíåö ïîäñòðîêè â ñòðîêå S, ÷òî ïîçâîëÿåò
óìåíüøèòü òðåáóåìûé îáúåì ïàìÿòè. Èç êàæäîé âíóòðåí-
íåé âåðøèíû äåðåâà âûõîäèò íå ìåíåå äâóõ äóã, ïðè÷åì îíè
íå ìîãóò èìåòü ìåòîê, íà÷èíàþùèõñÿ ñ îäíîãî ñèìâîëà.
Òîãäà ñêëåéêà (êîíêàòåíöèÿ) ïîäñòðîê (ìåòîê äóã) íà ïóòè
îò êîðíÿ äåðåâà ê ëèñòó ñ íîìåðîì i äàåò ñóôôèêñ S[i..n].
Ïðèìåð
Íà ðèñ. 3.1 ïðèâåäåíî äåðåâî ñóôôèêñîâ äëÿ ñòðîêè,
ïðåäñòàâëåííîé â òàáë. 3.1, ãäå â ïåðâîé ñòðîêå óêàçàíû íî-
ìåðà ñèìâîëîâ â èñõîäíîé ñòðîêå. Íà ðèñ. 3.1 ìåòêè äóã äëÿ
óäîáñòâà îáîçíà÷åíû ïîäñòðîêàìè, à íå íîìåðàìè íà÷àëà è
êîíöà ïîäñòðîê â ñòðîêå. Òàê, ìåòêà cabdab ñîîòâåòñòâóåò
ìåòêå 3:8 (íà÷èíàåòñÿ ñ òðåòüåãî è çàêàí÷èâàåòñÿ âîñüìûì
ñèìâîëîì ñòðîêè).
Òàáëèöà 3.1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
a b c a b d a b c a b d a b $

Ðèñ. 3.1. Äåðåâî ñóôôèêñîâ äëÿ ñòðîêè abcabdabcabdab$

Ïóñòü íàì èçâåñòíû àëãîðèòìû ïîñòðîåíèÿ äåðåâà ñóô-


ôèêñîâ äëÿ òåêñòà T çà âðåìÿ O(n) (n = |T|). Òîãäà ðàññìàò-
ðèâàåìàÿ çàäà÷à ïîèñêà âñåõ âõîæäåíèé ñòðîêè â òåêñò ðå-
øàåòñÿ ñëåäóþùèì îáðàçîì. Èìååòñÿ ñòðîêà P (m = |P|). Ïó-
òåì ïîñèìâîëüíîãî ñðàâíåíèÿ íàõîäèì âûõîäÿùóþ èç
êîðíÿ äóãó, ìåòêà êîòîðîé íà÷èíàåòñÿ ñ ñèìâîëà P[1]. Çà-
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 105

òåì îñóùåñòâëÿåì äàëüíåéøèå ïîñèìâîëüíûå ñðàâíåíèÿ P


ñ ìåòêàìè äóã. Ïðè ýòîì âîçìîæíû òðè âàðèàíòà. Ïåð-
âûé — åñëè ïðîèçîøëî íåñîâïàäåíèå, â ýòîì ñëó÷àå P íåò
â T. Âî âòîðîì æå è â òðåòüåì ñëó÷àÿõ ñðàâíåíèå P âûïîëíå-
íî óñïåøíî (âñå ñèìâîëû P ñîâïàëè), íî çàêîí÷èëîñü îíî,
ñîîòâåòñòâåííî, èëè â âåðøèíå (ïîñëåäíèé ñèìâîë P ñîâïàë
ñ ïîñëåäíèì ñèìâîëîì î÷åðåäíîé ìåòêè äóãè), èëè íà
êàêîì-òî ñèìâîëå ìåòêè äóãè. Ýòè äâà ïîñëåäíèõ ñëó÷àÿ
ïðàêòè÷åñêè èäåíòè÷íû, èáî â ïîäîáíûõ ñèòóàöèÿõ íàì èç-
âåñòíà âåðøèíà äåðåâà. Åñëè îíà — ëèñò, òî èìååò ìåñòî
åäèíñòâåííîå âõîæäåíèå P â T. Åñëè æå ýòî âíóòðåííÿÿ âåð-
øèíà, òî èìååò ìåñòî ìíîæåñòâåííîå âõîæäåíèå P â T, è
òîãäà ôðàãìåíò äåðåâà, íà÷èíàÿ ñ ýòîé âåðøèíû, îáõîäèòñÿ
ìåòîäîì ïîèñêà â ãëóáèíó, ÷òîáû íàéòè ìåòêè ëèñòüåâ, óêà-
çûâàþùèå íà íà÷àëüíûå ïîçèöèè âõîæäåíèé P â T. Ïðè èç-
âåñòíîì (ïîñòðîåííîì) äåðåâå ñóôôèêñîâ âðåìÿ ïîèñêà P
èìååò î÷åâèäíóþ îöåíêó O(m) (ëèáî O(m + k) ïðè ìíîæåñò-
âåííîì âõîæäåíèè, ãäå k — êîëè÷åñòâî âõîæäåíèé).
Ïðîñòîé àëãîðèòì ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ (èë-
ëþñòðàöèÿ äàíà íà ðèñ. 3.2).
Ïóñòü äàíà ñòðîêà S. Äîïîëíèì åå ñèìâîëîì $, îòñóò-
ñòâóþùèì â àëôàâèòå A. Íà ïåðâîì øàãå ïîìåñòèì â äåðåâî
äóãó ñ ìåòêîé S$ (S[1..n]$), à çàòåì áóäåì ïîñëåäîâàòåëüíî
âñòàâëÿòü ñóôôèêñû S[i..n]$.

Ðèñ. 3.2. Ïðèìåð ðàáîòû ïðîñòîãî àëãîðèòìà ïîñòðîåíèÿ äåðåâà


ñóôôèêñîâ äëÿ ñòðîêè abaab$
106 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Ïåðåõîä îò äåðåâà Ti ê äåðåâó Ti+1 ïðè ýòîì âûïîëíÿåòñÿ


òàê. Åñòü ñóôôèêñ S[i + 1..n]$. Åãî ñèìâîëû ïîñëåäîâàòåëü-
íî ñðàâíèâàþòñÿ ñ ìåòêàìè äóã, íà÷èíàÿ ñ äóã, âûõîäÿùèõ
èç êîðíÿ. Ïî ñîâïàäåíèÿì ñèìâîëîâ áóäåò ïðîéäåíà ÷àñòü
äåðåâà (â òîì ÷èñëå, ìîæåò áûòü, è íå áóäåò ïðîéäåíî íè îä-
íîãî ñèìâîëà, êàê íà øàãå 2, — ðèñ. 3.2). Ýòîò ïðîéäåííûé
ïóòü — åäèíñòâåííûé, â ñèëó òîãî ÷òî äóãè, âûõîäÿùèå èç
ëþáîé âåðøèíû äåðåâà, èìåþò ìåòêè, íà÷èíàþùèåñÿ ñ ðàç-
ëè÷íûõ ñèìâîëîâ, è ïðîèçîøëî íåñîâïàäåíèå ñèìâîëîâ â
êàêîé-òî ïîçèöèè q ñóôôèêñà. Ïðè÷åì ôàêò òàêîãî íåñîâïà-
äåíèÿ îáÿçàòåëåí, èáî êàæäûé ñóôôèêñ óíèêàëåí — îí çà-
êàí÷èâàåòñÿ ñèìâîëîì $, îòñóòñòâóþùèì â àëôàâèòå. Ïðè
ýòîì ñîçäàåòñÿ íîâàÿ âåðøèíà ñ äâóìÿ ñûíîâüÿìè; ê îäíîìó
èç ñûíîâåé èäåò äóãà ñ îñòàâøåéñÿ ÷àñòüþ ñóôôèêñà
S[q..n]$, à ê äðóãîìó — ñ îñòàâøåéñÿ ÷àñòüþ ìåòêè äóãè.
Åñëè æå íåñîâïàäåíèå ïðîèçîøëî â âåðøèíå äåðåâà, òî ýòà
âåðøèíà ïîëó÷àåò îäíîãî íîâîãî ñûíà.  ëþáîì ñëó÷àå ñîçäà-
åòñÿ íîâàÿ âåðøèíà — ëèñò ñ ìåòêîé i (íîìåðîì ñóôôèêñà).

Ïðèìåð (ðèñ. 3.2)


Îáðàáàòûâàåòñÿ ñóôôèêñ aab$ (øàã 3). Ñèìâîë à ñîâïà-
äàåò ñ ïåðâûì ñèìâîëîì ìåòêè äóãè abaab$, íî äëÿ âòîðîãî
ñèìâîëà à íåò ñîâïàäåíèÿ. Ñîçäàåòñÿ íîâàÿ âíóòðåííÿÿ âåð-
øèíà, ãäå ê ïåðâîìó ñûíó èäåò äóãà ñ îñòàâøåéñÿ ÷àñòüþ
ìåòêè baab$, à êî âòîðîìó ñûíó (ëèñòó ñ ìåòêîé 3) èäåò äóãà
ñ îñòàâøåéñÿ ÷àñòüþ ñóôôèêñà — ab$.
Ðàññìîòðèì îñîáåííîñòè ðåàëèçàöèè ýòîãî àëãîðèòìà.
Îïèñàíèå äàííûõ (îíî ìèíèìàëüíî) èìååò âèä:
Type
PList = ^node;
node = Record
cnt:Integer;
{Êîëè÷åñòâî ñûíîâåé ó âåðøèíû äåðåâà}
d:Array[|A|] Of Record
{Ïðåäïîëàãàåì, ÷òî àëôàâèò êîíå÷åí,
åñòü îòíîøåíèå ïîðÿäêà}
first,last:Integer;
{Íîìåðà ïåðâîãî è ïîñëåäíåãî ñèìâîëîâ
ïîäñòðîêè – ìåòêè äóãè}
next:PList;
{Óêàçàòåëü íà âåðøèíó – ñûíà}
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 107

num:Integer;
{Ìåòêà ëèñòà. Äëÿ âíóòðåííåé âåðøèíû, âêëþ÷àÿ
êîðåíü, îíà èìååò çíà÷åíèå 0}
End;
End;
Var
S:String;
n:Integer;
tree:PList;
 êàæäîé âåðøèíå äåðåâà ìû âûíóæäåíû ââîäèòü ìàñ-
ñèâ d, ïîñêîëüêó ìàêñèìàëüíîå êîëè÷åñòâî äóã, âûõîäÿùèõ
èç âåðøèíû, ðàâíî ìîùíîñòè àëôàâèòà A. Îïèñàíèå ñòðîêè
S, òàêîå, ÷òî îãðàíè÷åíèå íà åå ðàçìåð îïðåäåëÿåòñÿ ñèñòå-
ìîé ïðîãðàììèðîâàíèÿ, âçÿòî çäåñü äëÿ ïðîñòîòû.
Ïðèâåäåì îäèí èç âîçìîæíûõ ñïîñîáîâ ðåàëèçàöèè ðàñ-
ñìîòðåííîãî àëãîðèòìà.
Procedure TreeSuf1;
Var w,v: PList;
i,j,l,t:Integer;
bl:Boolean;
Begin
S:=S+'$';
n:=Length(S);
{Ïåðâûé øàã àëãîðèòìà – â êîðíå äåðåâà äàåòñÿ
îïèñàíèå äóãè, èäóùåé â âåðøèíó ñ ìåòêîé "1"}
st:=1; {Íîìåð ëèñòà}
New(tree);
tree^.cnt:=1;
tree^.d[1].first:=1;
tree^.d[1].last:=n;
tree^.d[1].next:=Nil;
tree^.d[1].num:=st;
{Ñóôôèêñ S[i..n] îïèñûâàåì (ïðåäñòàâëÿåì) â äåðåâå}
For i:=2 To n Do Begin
w:=tree;
t:=i;
bl:=False;
While Not bl Do Begin
{Ïîêà íå ñôîðìèðîâàí ëèñò, ñîîòâåòñòâóþùèé
ñóôôèêñó, âûïîëíÿåì äåéñòâèÿ öèêëà}
108 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

j:=1;
l:=0;
While (l=0)And(j<=w^.cnt) Do Begin
{Ïðîñìàòðèâàåì äóãè, âûõîäÿùèå èç âåðøèíû,
íà êîòîðóþ "ñìîòðèò" w^}
If S[w^.d[j].first]=S[t] Then l:=j;
{Äóãà íàéäåíà – ïåðâûé ñèìâîë ñóôôèêñà ñîâïàäàåò
ñ ïåðâûì ñèìâîëîì ìåòêè äóãè}
j:=j+1;
End;
If l=0 Then Begin
{Äóãà íå íàéäåíà – ñîçäàåì íîâóþ âåðøèíó-ëèñò,
îòöîì êîòîðîé ÿâëÿåòñÿ âåðøèíà w^}
w^.cnt:=w^.cnt+1;
st:=st+1;
bl:=True; {Ñóôôèêñ îáðàáîòàí}
w^.d[w^.cnt].next:=Nil;
w^.d[w^.cnt].num:=st;
w^.d[w^.cnt].first:=t;
w^.d[w^.cnt].last:=n;
End
Else Begin
{Äóãà íàéäåíà – ñðàâíèâàåì ñèìâîëû ñóôôèêñà
è ìåòêè äóãè}
j:=1;
While (w^.d[l].first+j<=w^.d[l].last) And
(S[t+j]=S[w^.d[l].first+j]) Do
j:=j+1;
If w^.d[l].first+j<=w^.d[l].last Then
Begin
{Ñîçäàåì íîâóþ âíóòðåííþþ âåðøèíó}
st:=st+1;
New(v);
v^.cnt:=2; {Ó âåðøèíû äâà ñûíà}
v^.d[1].next:=w^.d[l].next;
{Íîâàÿ ìåòêà äóãè – ñîâïàäàþùàÿ ÷àñòü ñóôôèêñà
è ñòàðîé ìåòêè äóãè}
v^.d[1].num:=w^.d[l].num;
v^.d[1].first:=w^.d[l].first+j;
v^.d[1].last:=w^.d[l].last;
v^.d[2].next:=Nil;
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 109

{Îñòàâøàÿñÿ ÷àñòü ñóôôèêñà ÿâëÿåòñÿ ìåòêîé äóãè,


èäóùåé ê ëèñòó ñ íîìåðîì îáðàáàòûâàåìîãî ñóôôèêñà}
v^.d[2].num:=st;
v^.d[2].first:=t+j;
v^.d[2].last:=n;
{Êîððåêòèðóåì îïèñàíèå âåðøèíû – îòöà}
w^.d[l].next:=v;
w^.d[l].last:=w^.d[l].first+j-1;
w^.d[l].num:=0;
bl:=True; {Ñóôôèêñ îáðàáîòàí}
End
Else Begin
{Ïåðåõîäèì ê ñëåäóþùåé âåðøèíå äåðåâà - ÷àñòü
ñóôôèêñà ïîëíîñòüþ ñîâïàëà ñ ìåòêîé äóãè}
t:=t+w^.d[l].last-w^.d[l].first+1;
w:=w^.d[l].next;
End;
End; {Êîíåö îáðàáîòêè íàéäåííîé äóãè}
End; {Êîíåö öèêëà ïî îáðàáîòêå ñóôôèêñà}
End; {Êîíåö öèêëà ïî ñóôôèêñàì}
End;

Âðåìåííàÿ ñëîæíîñòü àëãîðèòìà O(n2) — ýòî â ïðåäïî-


ëîæåíèè, ÷òî àëôàâèò êîíå÷åí, ïîýòîìó âðåìÿ îáðàáîòêè
ñèìâîëà (èëè âûáîðà äóãè, âûõîäÿùåé èç âåðøèíû) èìååò
ïîñòîÿííîå çíà÷åíèå (ÿâëÿåòñÿ êîíñòàíòîé). Äåéñòâèòåëü-
íî, ìû îáðàáàòûâàåì n ñóôôèêñîâ, è äëÿ îáðàáîòêè êàæäîãî
ñóôôèêñà òðåáóåòñÿ âûïîëíèòü êîëè÷åñòâî îïåðàöèé, ïðî-
ïîðöèîíàëüíîå åãî äëèíå.
À òåïåðü ïîñòàâèì ïåðåä ñîáîé äðóãóþ çàäà÷ó — ìîæíî
ëè ñîçäàòü äåðåâî ñóôôèêñîâ, «ïåðåâåðíóâ» ñõåìó ïîñòðîå-
íèÿ ýòîãî äåðåâà (îïèñàíèå âåðøèí äåðåâà îñòàâëÿåì ïðåæ-
íèì)? Òî åñòü áóäåì íà÷èíàòü íå ñ ïîëíîé ñòðîêè, à ñ åå ïåð-
âîãî ñèìâîëà è, ïîñëåäîâàòåëüíî ðàñøèðÿÿ äåðåâî, ïîëó÷èì
òîò æå ðåçóëüòàò. Äðóãèìè ñëîâàìè, íà÷íåì ñ ñèìâîëà S[1];
çàòåì, èçìåíÿÿ äåðåâî, îïèøåì âñå ñóôôèêñû S[1..2], çàòåì
âñå ñóôôèêñû S[1..3] è ò. ä., âïëîòü äî ñóôôèêñîâ S[1..n]$.
Ñõåìà òàêîãî ïîñòðîåíèÿ äëÿ ñòðîêè abaab$ ïîêàçàíà íà
ðèñ. 3.3.
Ïðèâåäåì åùå îäèí ïðèìåð. Äëÿ ñòðîêè
abcabdabcabdab$ ïðîöåññ ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ
110 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Ðèñ. 3.3. Ïðèìåð âòîðîãî ñïîñîáà ðåàëèçàöèè àëãîðèòìà


ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ äëÿ ñòðîêè abaab$

ïðèâåäåí íà ðèñ. 3.4. Íà ïîñëåäíåì øàãå ïîä íîìåðîì 15


(åãî íåò íà ðèñ. 3.4) ïîëó÷àåòñÿ äåðåâî ñóôôèêñîâ, ïîêàçàí-
íîå ðàíåå íà ðèñ. 3.1.

Ðèñ. 3.4. Èëëþñòðàöèÿ âòîðîãî ñïîñîáà ïîñòðîåíèÿ


äåðåâà ñóôôèêñîâ äëÿ ñòðîêè abcabdabcabdab$
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 111

 ÷åì æå çàêëþ÷àþòñÿ îñîáåííîñòè ïîñòðîåíèÿ äåðåâà


ñóôôèêñîâ ïî äàííîé ñõåìå? Îáðàòèìñÿ ê ïîñëåäíåìó ïðè-
ìåðó.
Øàã 1. Ñîçäàåòñÿ ëèñò ñ íîìåðîì 1 è äóãà, èäóùàÿ èç
êîðíÿ ñ ìåòêîé a.
Øàã 2. Ïîäñòðîêà ab — åå ñóôôèêñû ab è b. Ïåðâûé
ñóôôèêñ îïèñûâàåòñÿ ïóòåì èçìåíåíèÿ ìåòêè a íà ab. Âòî-
ðîé ñóôôèêñ — ñîçäàåòñÿ ëèñò ñ íîìåðîì 2 è ìåòêîé äóãè b.
Øàã 3. Ïîäñòðîêà abc — åå ñóôôèêñû abc, bñ, c. Îáðà-
áîòêà ïåðâûõ äâóõ ñóôôèêñîâ ñâîäèòñÿ ê èçìåíåíèþ ìåòîê
äóã: ab íà abc è b íà bc. Òðåòèé ñóôôèêñ — ñîçäàåòñÿ ëèñò ñ
íîìåðîì 3 è ìåòêîé äóãè c.
Øàã 4. Ïîäñòðîêà abca — åå ñóôôèêñû abca, bca, ca, a.
Ïåðâûå òðè ñóôôèêñà ââîäÿòñÿ â äåðåâî ïóòåì ïðèïèñûâà-
íèÿ (íàçîâåì ýòî òàê) ñèìâîëà a ê óæå ñóùåñòâóþùèì ìåò-
êàì äóã. ×åòâåðòûé ñóôôèêñ a ñîñòàâëÿåò ÷àñòü ìåòêè äóãè
abca, ò. å. îí óæå ïðåäñòàâëåí â äåðåâå.
Øàã 5. Ïîäñòðîêà abcab — åå ñóôôèêñû abcab, bcab,
cab, ab, b. Ïåðâûå òðè ñóôôèêñà òîæå îáðàáàòûâàþòñÿ ïó-
òåì ïðèïèñûâàíèÿ ñèìâîëà b ê óæå ñóùåñòâóþùèì ìåòêàì
äóã, à ïîñëåäíèå äâà ñóôôèêñà óæå ïðåäñòàâëåíû â äåðåâå.
Øàã 6. Ïîäñòðîêà abcabd — åå ñóôôèêñû abcabd,
bcabd, cabd, abd, bd, d. Äëÿ ïåðâûõ òðåõ ñóôôèêñîâ äåé-
ñòâèÿ àíàëîãè÷íû òåì, ÷òî âûïîëíÿþòñÿ íà øàãå 5, à äëÿ
ïîñëåäíèõ òðåõ ñîçäàþòñÿ íîâûå âíóòðåííèå âåðøèíû è
âåðøèíû — ëèñòüÿ ñ ñîîòâåòñòâóþùèìè íîìåðàìè 4, 5, 6.
Øàã 7. Ïîäñòðîêà abcabda. Ïåðâûå øåñòü åå ñóôôèêñîâ
îáðàáàòûâàþòñÿ ïóòåì ïðèïèñûâàíèÿ ñèìâîëà a ê ñîîòâåò-
ñòâóþùèì ìåòêàì äóã, à ñåäüìîé ñóôôèêñ ïðåäñòàâëåí â äå-
ðåâå êàê ÷àñòü ìåòêè äóãè, èäóùåé ê ëèñòó ñ íîìåðîì 1.
Øàãè 8–14. Àíàëîãè÷íû øàãó 7. Ïåðâûå øåñòü ñóô-
ôèêñîâ îáðàáàòûâàþòñÿ ïóòåì ïðèïèñûâàíèÿ ñèìâîëîâ, à
îñòàëüíûå ñóôôèêñû íà êàæäîì øàãå óæå ïðåäñòàâëåíû â
äåðåâå.
Øàã 15. Ïîëíàÿ ñòðîêà S$. Ïåðâûå øåñòü ñóôôèêñîâ
îáðàáàòûâàþòñÿ ïóòåì ïðèïèñûâàíèÿ, à îñòàëüíûå äåâÿòü
ñóôôèêñîâ — ïóòåì ñîçäàíèÿ íîâûõ âíóòðåííèõ âåðøèí è
âåðøèí — ëèñòüåâ ñ ñîîòâåòñòâóþùèìè íîìåðàìè 7,
8, …, 15.
 èòîãå ìû è ïîëó÷àåì äåðåâî ñóôôèêñîâ, ïðåäñòàâëåí-
íîå íà ðèñ. 3.1.
112 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Èòàê, â ýòîé ñõåìå ÿâíî ïðîñìàòðèâàþòñÿ òðè òèïà äåé-


ñòâèé. Íàçîâåì äåéñòâèÿ ïî ïðèïèñûâàíèþ ñèìâîëà ê ìåòêå
äóãè ïðàâèëîì 1, ïî ñîçäàíèþ íîâûõ âåðøèí äåðåâà — ïðà-
âèëîì 2, à ïî îáíàðóæåíèþ ôàêòà ïðèñóòñòâèÿ ñóôôèêñà â
äåðåâå (êîãäà îí åñòü â íåÿâíîì âèäå — áåç âåðøèíû ëèñ-
òà) — ïðàâèëîì 3. Â òàáë. 3.2 ïðåäñòàâëåíû ïîñëåäîâàòåëü-
íîñòè ïðèìåíåíèÿ íàçâàííûõ ïðàâèë íà êàæäîì øàãå ïî-
ñòðîåíèÿ äåðåâà ñóôôèêñîâ äëÿ ñòðîêè abcabdabcabdab$.

Òàáëèöà 3.2

Íîìåð
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ñèìâîëà
Øàã a b c a b d a b c a b d a b $
1 2
2 1 2
3 1 1 2
4 1 1 1 3
5 1 1 1 3 3
6 1 1 1 2 2 2
7 1 1 1 1 1 1 3
8 1 1 1 1 1 1 3 3
9 1 1 1 1 1 1 3 3 3
10 1 1 1 1 1 1 3 3 3 3
11 1 1 1 1 1 1 3 3 3 3 3
12 1 1 1 1 1 1 3 3 3 3 3 3
13 1 1 1 1 1 1 3 3 3 3 3 3 3
14 1 1 1 1 1 1 3 3 3 3 3 3 3 3
15 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2

Êàêèå âûâîäû (èëè ïðåäïîëîæåíèÿ äëÿ äàëüíåéøåãî


îáîñíîâàíèÿ) ìîæíî ñäåëàòü èç àíàëèçà ýòîãî ïðèìåðà?
1. Åñëè íà êàêîì-ëèáî øàãå ïðè îáðàáîòêå î÷åðåäíîãî
ñóôôèêñà S[j..i] ñðàáîòàëî ïðàâèëî 3, òî îíî áóäåò ðàáîòàòü è
äàëüøå (íà ýòîì øàãå) ïðè îáðàáîòêå ñóôôèêñîâ S[j + 1..i],
S[j + 2..i], …, S[i..i]. Ýòî ñëåäóåò èç ñòðóêòóðû äåðåâà ñóô-
ôèêñîâ. Äåéñòâèòåëüíî, â äåðåâå óæå ïðåäñòàâëåíû ñóôôèê-
ñû S[j..i – 1], S[j + 1..i – 1], …, S[i – 1..i – 1]. Åñëè íàéäåíî
ïðîäîëæåíèå ñóôôèêñà S[j..i – 1] ñèìâîëîì S[i], èëè, äðóãè-
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 113

ìè ñëîâàìè, íàëè÷èå â äåðåâå ñóôôèêñà S[j..i], òî î÷åâèäíî,


÷òî áóäóò íàéäåíû ïðîäîëæåíèÿ è îñòàëüíûõ ñóôôèêñîâ
ñèìâîëîì S[i]. Ïðàâèëî 3 íå òðåáóåò âûïîëíåíèÿ íèêàêèõ
îïåðàöèé ïî îáðàáîòêå, è ïîñëå åãî ïåðâîãî ñðàáàòûâàíèÿ
ýòîò øàã ïîñòðîåíèÿ äåðåâà ìîæíî çàêàí÷èâàòü.
Åñòåñòâåííî, ÷òî ïðè ðåàëèçàöèè àëãîðèòìà ñëåäóåò
ââåñòè íåêóþ ëîãè÷åñêóþ ïåðåìåííóþ (íàïðèìåð, bl), äëÿ
ôèêñàöèè ôàêòà ñðàáàòûâàíèÿ ïðàâèëà 3 è ïî åå çíà÷åíèþ
âûõîäèòü èç äàííîé èòåðàöèè îáðàáîòêè øàãà, ò. å. ïåðåõî-
äèòü ê ñëåäóþùåìó çíà÷åíèþ i.
2. Ïóñòü ê ìîìåíòó âûïîëíåíèÿ øàãà i óæå áûëî ñîçäàíî
q ëèñòîâ. Òîãäà íà øàãå i ïåðâûå q ñóôôèêñîâ îáðàáàòûâàþò-
ñÿ ïî ïðàâèëó 1, à îíî ñâîäèòñÿ ê èçìåíåíèþ ïîëÿ last (åãî
óâåëè÷åíèþ íà åäèíèöó) ó q ñîîòâåòñòâóþùèõ ìåòîê äóã.
À åñëè íå èçìåíÿòü ýòî ïîëå? Åñëè ïðè ñîçäàíèè ëèñòà
ââåñòè ïðèçíàê òîãî, ÷òî îí — ëèñò, òåì áîëåå ÷òî òàêîé
ïðèçíàê óæå åñòü â îïèñàíèè âåðøèíû — ýòî ïîëå num
(âíóòðåííèå âåðøèíû äåðåâà, âêëþ÷àÿ êîðåíü, íå èìåþò
íîìåðîâ), òî íà êàæäîì øàãå îáðàáîòêó ñóôôèêñîâ ìîæíî
áóäåò íà÷èíàòü íå ñ ïåðâîãî — S[1..i], — à ñ (q + 1)-ãî, ò. å. ñ
ñóôôèêñà S[q + 1..i]. Ðåàëèçàöèÿ ýòîãî ïîëîæåíèÿ òðåáóåò
ó÷åòà ïðè ïîèñêå êîíöà î÷åðåäíîãî ñóôôèêñà òîãî, ÷òî ìåò-
êà äóãè, èäóùåé ê ëèñòó, íå ïðîïèñàíà ÿâíî.
3. Êîëè÷åñòâî ñðàáàòûâàíèé ïðàâèëà 2 ðàâíî n. Åãî ðàñ-
ïðåäåëåíèå ïî øàãàì (öèôðû íàä îòðåçêàìè) â ðàññìàòðèâà-
åìîì âûøå ïðèìåðå îáðàáîòêè ñòðîêè abcabdabcabdab$
ïðèâåäåíî íà ðèñ. 3.5.

Ðèñ. 3.5. Ñðàáàòûâàíèå ïðàâèëà 2 ïðè ïîñòðîåíèè


äåðåâà ñóôôèêñîâ

Ïðàâèëî 2 çàêëþ÷àåòñÿ â ñîçäàíèè íîâîé âíóòðåííåé


âåðøèíû è âåðøèíû — ëèñòà ñ íîìåðîì, îïðåäåëÿþùèì íà-
÷àëî îáðàáàòûâàåìîãî ñóôôèêñà â ñòðîêå. Åñëè íàéäåíî òðå-
áóåìîå ìåñòî â äåðåâå (êîíåö ñóôôèêñà), òî ðåàëèçàöèÿ ýòî-
ãî ïðàâèëà òðåáóåò êîíñòàíòíîãî âðåìåíè (îíî íå çàâèñèò îò
äëèíû ñòðîêè).
114 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Âðåìÿ ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ ïî äàííîìó ìåòîäó


èìååò îöåíêó O(n3). Äåéñòâèòåëüíî, çäåñü èìååòñÿ öèêëè-
÷åñêàÿ êîíñòðóêöèÿ ïî øàãàì (i), ãäå â òåëå öèêëà îáðàáà-
òûâàåòñÿ i ñóôôèêñîâ, è íà îáðàáîòêó êàæäîãî ñóôôèêñà j
òðåáóåòñÿ O(i – j) îïåðàöèé. Ïðàâèëà 1 è 3 ïîçâîëÿþò èçáå-
ãàòü îáðàáîòêè ÷àñòè ñóôôèêñîâ, íî â öåëîì îíè íå èçìåíÿ-
þò âðåìåííóþ îöåíêó. Ñëåäîâàòåëüíî, íåîáõîäèì ýôôåê-
òèâíûé ñïîñîá îïðåäåëåíèÿ îêîí÷àíèÿ ñóôôèêñà â äåðåâå è
ìåòîä îáðàáîòêè êàæäîãî ñóôôèêñà (êîãäà ëîêàëèçîâàíî
åãî ìåñòî â äåðåâå).  ýòîì ñëó÷àå ó äàííîãî àëãîðèòìà ïîÿ-
âèòñÿ âîçìîæíîñòü ïåðåéòè â ðàçðÿä ëèíåéíûõ ïî âðåìåíè.
Îäèí èç âîçìîæíûõ ñïîñîáîâ ðåàëèçàöèè âûøåïðèâå-
äåííîé ñõåìû ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ (áåç ïðàâèëà 1)
ïðèâîäèòñÿ íèæå (ïðîöåäóðà TreeSuf2). Îíà ìàêñèìàëüíî
ïðèáëèæåíà ê ïðåäûäóùåé âåðñèè ïîñòðîåíèÿ äåðåâà ñóô-
ôèêñîâ. Íàèáîëåå òðóäíûé ìîìåíò — âûÿâëåíèå ïðàâèë
ïðè àíàëèçå ñóôôèêñà, ïîýòîìó âíà÷àëå ïðèâåäåì åãî ñëî-
âåñíîå îïèñàíèå:
If <ñóôôèêñ çàêîí÷èëñÿ> Then <ïðàâèëî 3>
Else If <ìåòêà äóãè íå çàêîí÷èëàñü> Then <ïðàâèëî 2>
Else If <ëèñò> Then <ïðàâèëî 1>
Else <ïåðåàäðåñàöèÿ ïî äåðåâó>;

Procedure TreeSuf2;
Var w,v: PList;
i,j,l,t,k:Integer;
bl,bl1:Boolean;
Begin
S:=S+'$';
n:=Length(S);
st:=1;
New(tree); {Ñîçäàåì ïåðâóþ âåðøèíó}
tree^.cnt:=1;
tree^.d[1].first:=1;
tree^.d[1].last:=1;
tree^.d[1].next:=Nil;
tree^.d[1].num:=st;
For i:=2 To n Do Begin
{Îáðàáàòûâàåì ñòðîêè S[1..i] – èçìåíÿåì äåðåâî
ñóôôèêñîâ}
k:=1;
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 115

{Ïðè ðåàëèçàöèè ïðàâèëà 1 çíà÷åíèå k íà÷èíàåò


èçìåíÿòüñÿ íå ñ åäèíèöû}
bl:=False;
{Ïðèçíàê òîãî, ÷òî ñëåäóþùèå ñóôôèêñû äëÿ áîëüøèõ
çíà÷åíèé k îáðàáàòûâàòü íå ñëåäóåò (ïðàâèëî 3)}
While (k<=i) And (Not bl) Do Begin
{Îáðàáàòûâàåì ñóôôèêñ S[k..i]}
w:=tree;
t:=k;
bl1:=False;
{Ïðèçíàê îáðàáîòêè ñóôôèêñà}
While Not bl1 Do Begin
j:=1;
l:=0;
{Ïîèñê äóãè, íà÷èíàþùåéñÿ ñ ñèìâîëà S[t]}
While (l=0) And (j<=w^.cnt) Do Begin
If S[w^.d[j].first]=S[t] Then l:=j;
j:=j+1;
End;
If l=0 Then Begin
{Äóãà íå íàéäåíà – ôîðìèðóåì íîâóþ âåðøèíó–ñûíà
ó w^ (ïðàâèëî 2)}
bl1:=True; {Ñóôôèêñ îáðàáîòàí}
w^.cnt:=w^.cnt+1;
st:=st+1;
w^.d[w^.cnt].next:=Nil;
w^.d[w^.cnt].num:=st;
w^.d[w^.cnt].first:=t;
w^.d[w^.cnt].last:=i;
End
Else Begin
j:=0;
{Äóãà íàéäåíà. Ñðàâíèâàåì ñèìâîëû ñóôôèêñà
è ìåòêè äóãè}
While (w^.d[l].first+j<=w^.d[l].last)
And ((t+j)<=i) And (S[t+j]=
S[w^.d[l].first+j])
Do j:=j+1;
If t+j=i+1 Then Begin
{Ñðàâíåíèå çàâåðøèëîñü ïîëíûì èñ÷åðïàíèåì
ñóôôèêñà (ïðàâèëî 3). Ñóôôèêñ îáðàáîòàí;
116 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

áîëåå òîãî, îáðàáîòêà ñëåäóþùèõ ñóôôèêñîâ


äëÿ äàííîãî çíà÷åíèÿ i ëèøåíà ñìûñëà –
îíè óæå ïðåäñòàâëåíû â äåðåâå ñóôôèêñîâ}
bl:=True;
bl1:=True;
End {3}
Else If w^.d[l].first+j<=w^.d[l].last
Then Begin
{Åñëè ìåòêà äóãè íå çàêîí÷èëàñü, òî íàäî
ñîçäàòü íîâóþ âíóòðåííþþ âåðøèíó (ïðàâèëî 2)}
st:=st+1;
New(v);
v^.cnt:=2;
v^.d[1].next:=w^.d[l].next;
v^.d[1].num:=w^.d[l].num;
v^.d[1].first:=w^.d[l].first+j;
v^.d[1].last:=w^.d[l].last;
v^.d[2].next:=Nil;
v^.d[2].num:=st;
v^.d[2].first:=t+j;
v^.d[2].last:=i;
w^.d[l].next:=v;
w^.d[l].last:=w^.d[l].first+j-1;
w^.d[l].num:=0;
bl1:=True;
End
Else If w^.d[l].num<>0 Then Begin
{Ìåòêà äóãè çàêîí÷èëàñü, à ñóôôèêñ - íåò. Çíà÷èò,
ìû èìååì äåëî ñ âåðøèíîé – ëèñòîì.  ýòîì ñëó÷àå
äîáàâëÿåòñÿ ñèìâîë ê ìåòêå äóãè (ïðàâèëî 1)}
w^.d[l].last:=w^.d[l].last+1;
bl1:=True;
End
Else Begin
{Íå ëèñò – ïåðåàäðåñàöèÿ ïî äåðåâó}
t:=t+w^.d[l].last-w^.d[l].first+1;
w:=w^.d[l].next;
End;
End;
End;
k:=k+1;
3.1. Îñíîâíûå ïîíÿòèÿ è ïîñòðîåíèå äåðåâà ñóôôèêñîâ 117

End;
End;
End;

@ Óïðàæíåíèÿ
1. Ïîñòðîéòå ïåðâûì ñïîñîáîì äåðåâüÿ ñóôôèêñîâ äëÿ
ñòðîê:
l abcdefghijklmnopq;
l aaaaaaaaaaaaaaaab;
l abaababa;
l abaababaabaab;
l abaababaabaababaababa;
l abbabaab;
l abbabaabbaababba;
l abcabacabcbacbcacb;
l abcabacabcbacbcacbabcabacabcb.

2. Ðàçðàáîòàéòå ïðîãðàììó ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ


ïåðâûì ñïîñîáîì.
Ïðèìå÷àíèå. Âîçìîæíûé âèä âñïîìîãàòåëüíîé ïðî-
öåäóðû âûâîäà ýëåìåíòîâ äåðåâà ìîæåò áûòü ñëåäóþ-
ùèì :
Procedure Print(pt:Plist;k:Integer);
Var i,t1,t2:Integer;
Begin
If pt<>Nil Then
For i:=1 To pt^.cnt Do Begin
t1:=pt^.d[i].first;
t2:=pt^.d[i].last;
WriteLn(Copy(S,t1,t2-t1+1):k);
Print(pt^.d[i].next,k+10);
End;
End;
3. Ïîñòðîéòå âòîðûì ñïîñîáîì äåðåâüÿ ñóôôèêñîâ äëÿ
ñòðîê, ïðèâåäåííûõ â ïåðâîì óïðàæíåíèè.
4. Ðàçðàáîòàéòå ïðîãðàììó ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ
âòîðûì ñïîñîáîì.
5. Ïðîèçâåäèòå ìîäèôèêàöèþ ïðîãðàììû ïîñòðîåíèÿ äåðå-
âà âòîðûì ñïîñîáîì òàê, ÷òîáû ó÷èòûâàëîñü ïðàâèëî 1.
118 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Ïðèìå÷àíèå. Ïðè ýòîì âîçìîæíû äâà ñïîñîáà ðåàëèçà-


öèè ýòîãî ïðàâèëà.
1. Åñëè äóãà èäåò ê âåðøèíå-ëèñòó, òî ñðàâíåíèå â öèêëå
ïî øàãàì (i) îñóùåñòâëÿåòñÿ äî ñèìâîëà ñ íîìåðîì i.
2. Ê âåðøèíàì-ëèñòüÿì äîáàâëÿåòñÿ ìåòêà «¥». Åñëè
âåðøèíà-ëèñò j ïðèõîäèòñÿ ñûíîì íåêîåé âåðøèíû v,
ïóòü äî êîòîðîé èìååò ìåòêó S[j..h], òî äóãà îò âåðøèíû
v äî ëèñòà j ïîìå÷àåòñÿ êàê (h + 1, ¥), ÷òî óêàçûâàåò íà
ñóôôèêñ S[h + 1..n].

3.2. Àëãîðèòì Ý. Óêêîíåíà


Íà âûñîêóþ áàøíþ ìîæíî
ïîäíÿòüñÿ ëèøü ïî âèíòîâîé
ëåñòíèöå.
Ôðýíñèñ Áýêîí
Àëãîðèòì ñîçäàíèÿ äåðåâà ñóôôèêñîâ, ïðåäëîæåííûé
Ý. Óêêîíåíîì, îñíîâàí íà âòîðîì ïðîñòîì ñïîñîáå åãî ïî-
ñòðîåíèÿ (ñì. ï. 3.1). Íà ïåðâîì øàãå ñòðîèòñÿ äåðåâî T1 èç
êîðíÿ è îäíîé äóãè, âûõîäÿùåé èç íåãî â ëèñò ñ íîìåðîì 1,
ñ ìåòêîé äóãè — ñèìâîëîì S[1]. Íà âòîðîì øàãå T1 ïðåîáðà-
çóåòñÿ â T2, ñîäåðæàùåå îïèñàíèå âñåõ ñóôôèêñîâ ïîäñòðî-
êè S[1..2]. Íà òðåòüåì øàãå èç T2 ìû ïîëó÷àåì T3 äëÿ ïîä-
ñòðîêè S[1..3] è ò. ä. — äî ïîëó÷åíèÿ äåðåâà Tn+1 äëÿ ñòðîêè
S[1..n]$. Ïðè ýòîì ïðè ïåðåõîäå îò äåðåâà Ti–1 ê Ti (ãäå i —
íîìåð øàãà) èñïîëüçóþòñÿ ïðàâèëà 1, 2 è 3, êîòîðûå òðåáó-
þò êîíñòàíòíîãî âðåìåíè. Ïîýòîìó, ÷òîáû ó íàñ áûëà íà-
äåæäà íà ïîëó÷åíèå ëèíåéíîãî ïî âðåìåíè àëãîðèòìà ïî-
ñòðîåíèÿ äåðåâà ñóôôèêñîâ, íàì íåîáõîäèìî çà ïîñòîÿííîå
âðåìÿ èñêàòü êîíöû ïîäñòðîê (ñóôôèêñîâ) â äåðåâå.
Ïóñòü u — íåêîòîðàÿ âåðøèíà äåðåâà ñóôôèêñîâ. Ìåòêà
ïóòè äî u îò êîðíÿ èëè êàêîãî-ëèáî ïðåäêà u ïîëó÷àåòñÿ
ñêëåéêîé ìåòîê äóã.
Îïðåäåëèì ñóôôèêñíóþ ñâÿçü s (ýòî ôóíêöèÿ; ïðè åå ðå-
àëèçàöèè â îïèñàíèè êàæäîé âåðøèíû ïîÿâëÿåòñÿ ïîëå äëÿ
õðàíåíèÿ àäðåñà äðóãîé âåðøèíû äåðåâà) äëÿ ëþáîé âåðøè-
íû u äåðåâà ñëåäóþùèì îáðàçîì:
l äëÿ êîðíÿ äåðåâà s(u) = u;
l äëÿ ëþáîé âåðøèíû äåðåâà u ñ ìåòêîé ïóòè îò êîðíÿ
xt, ãäå x — ïåðâûé ñèìâîë ìåòêè, à t — åå îñòàâøàÿñÿ
÷àñòü, ñóùåñòâóåò âåðøèíà v ñ ìåòêîé ïóòè, ðàâíîé t,
òî s(u) = v.
3.2. Àëãîðèòì Ý. Óêêîíåíà 119

Ïðèìåð
Äàíà ñòðîêà, ïðåäñòàâëåííàÿ â òàáë. 3.3.

Òàáëèöà 3.3

Íîìåð
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ïîçèöèè
S b a c b a b a b a a b c b a b $

Ïîñòðîèì äëÿ íåå äåðåâî ñ ñóôôèêñíûìè ñâÿçÿìè. Ïåð-


âûå 5 øàãîâ ïðèâîäÿò ê äåðåâó, ïîêàçàííîìó â ëåâîé ÷àñòè
ðèñ. 3.6. Ïîêà çäåñü èìååòñÿ òîëüêî îäíà ñóôôèêñíàÿ ñâÿçü
èç êîðíÿ â êîðåíü. (Ñóôôèêñíûå ñâÿçè îò ëèñòüåâ èçîáðà-
æàòü íå áóäåì, ÷òîáû íå ïåðåãðóçèòü ðèñóíîê — îíè î÷åâèä-
íû è èäóò îò îäíîãî ëèñòà ê äðóãîìó: îò ïåðâîãî ëèñòà êî
âòîðîìó, îò âòîðîãî ê òðåòüåìó è ò. ä.)
Ðàññìîòðèì øàã 6. Â íåì îáðàáàòûâàåòñÿ ïîäñòðîêà
bacbab. Ïåðâûå òðè ñóôôèêñà ïîïàäàþò ïîä ïðàâèëî 1, ò. å.
ôàêòè÷åñêè íå îáðàáàòûâàþòñÿ. Îñòàëèñü ñóôôèêñû bab,
ab, b. Íà÷èíàåì ñ ñóôôèêñà bab.

Ðèñ. 3.6. Øàã 6 ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ

Ñîçäàåòñÿ âíóòðåííÿÿ âåðøèíà u, èç êîòîðîé èñõîäèò


äóãà â ëèñò ñ ìåòêîé 4. Ïðè îáðàáîòêå ñëåäóþùåãî ñóôôèêñà
ab (èìåííî íà ýòîì øàãå!) âíîâü ñîçäàåòñÿ âíóòðåííÿÿ âåð-
øèíà v è îêàçûâàåòñÿ, ÷òî s(u) = v. Ïîñëåäíèé ñóôôèêñ b
îáðàáàòûâàåòñÿ ïî ïðàâèëó 3, à ñóôôèêñíàÿ ñâÿçü (òàêèå
ñâÿçè íà ðèñóíêàõ èçîáðàæàþòñÿ ïóíêòèðíûìè ëèíèÿìè)
èç v èäåò â êîðåíü äåðåâà.
Ïîêà íàì åùå íå î÷åíü ïîíÿòíî, ÷òî äàþò ñóôôèêñíûå
ñâÿçè, íî îòëîæèì ýòî ìèíè-îòêðûòèå äî ðàññìîòðåíèÿ ñëå-
äóþùèõ øàãîâ.
120 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Øàãè 7, 8, 9 íå äàþò íîâûõ ëèñòüåâ, ò. å. íå ïðèâîäÿò ê


ñðàáàòûâàíèþ ïðàâèëà 2. Íà êàæäîì øàãå çäåñü ïðîâåðÿþò-
ñÿ ñóôôèêñû, íà÷èíàþùèåñÿ ñ øåñòîé ïîçèöèè (ba, bab,
baba), ñðàáàòûâàåò ïðàâèëî 3 è äåéñòâèÿ äëÿ äàííîãî øàãà
çàêàí÷èâàþòñÿ.
Øàã 10. Îáðàáîòêå ïîäëåæàò ñóôôèêñû babaa, abaa,
baa, aa, a, è ìû íà÷èíàåì øàã èìåííî ñ øåñòîãî ñóôôèêñà.
Ïîñëåäîâàòåëüíîñòü èçìåíåíèé äåðåâà ïðè ïåðåõîäå îò îá-
ðàáîòêè îäíîãî ñóôôèêñà ê îáðàáîòêå äðóãîãî ïðèâåäåíà íà
ðèñ. 3.7.

Ðèñ. 3.7. Øàã 10 ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ

Îñòàíîâèìñÿ íà îáðàáîòêå ñóôôèêñà abaa. Òðåáóåòñÿ íàé-


òè êîíåö ñóôôèêñà aba â äåðåâå. Ïðè îáðàáîòêå ïðåäûäóùåãî
ñóôôèêñà áûëà ñîçäàíà âíóòðåííÿÿ âåðøèíà. Ïîäíèìåìñÿ
îò íåå ââåðõ ïî äåðåâó ê åå îòöó. Ýòà âåðøèíà-îòåö èìååò ñóô-
ôèêñíóþ ñâÿçü. Ïåðåéäåì ïî íåé (âîò îí, ìîìåíò «ýâðèêà»!),
à íå áóäåì íà÷èíàòü ñ êîðíÿ äåðåâà, êàê â ïðîñòîì àëãîðèòìå.
×àñòü ñóôôèêñà aba ïðîéäåíà, è çàâåäîìî èçâåñòíî, ÷òî åñòü
3.2. Àëãîðèòì Ý. Óêêîíåíà 121

îñòàâøàÿñÿ ÷àñòü. Îñòàëîñü âûáðàòü äóãó, èäóùóþ èç âåðøè-


íû, â êîòîðóþ ìû ïåðåøëè ïî ñóôôèêñíîé ñâÿçè. Îñòàâøàÿ-
ñÿ ÷àñòü ñóôôèêñà ìîæåò áûòü «èñ÷åðïàíà» ìåòêîé íàéäåí-
íîé äóãè (êàê â äàííîì ñëó÷àå), à ìîæåò áûòü è «íå èñ÷åðïà-
íà».  ïåðâîì ñëó÷àå ñðàáàòûâàåò ïðàâèëî 2, à âî âòîðîì —
âûïîëíÿåòñÿ ïåðåõîä âíèç ïî äåðåâó äî òåõ ïîð, ïîêà ñóô-
ôèêñ íå áóäåò îáðàáîòàí ïîëíîñòüþ.  ëþáîì ñëó÷àå ñîç-
äàþòñÿ íîâàÿ âíóòðåííÿÿ âåðøèíà è ëèñò, è ê ýòîé íîâîé
âíóòðåííåé âåðøèíå ïîéäåò ñóôôèêñíàÿ ñâÿçü îò âåðøèíû,
îáðàçîâàííîé ïðè îáðàáîòêå ïðåäûäóùåãî ñóôôèêñà. Ïðè
àíàëèçå ñóôôèêñîâ baa è aa íîâûõ âíóòðåííèõ âåðøèí íå
ñîçäàåòñÿ (òîëüêî âåðøèíû-ëèñòû), íî ñóôôèêñíûå ñâÿçè
òîæå îïðåäåëÿþòñÿ. Â èòîãå êàæäàÿ âíóòðåííÿÿ âåðøèíà äå-
ðåâà èìååò ñóôôèêñíóþ ñâÿçü.
Øàã 11 íå èçìåíÿåò ñòðóêòóðû äåðåâà — íîâûõ âåðøèí
è ñóôôèêñíûõ ñâÿçåé â íåì íå ïîÿâëÿåòñÿ.

Ðèñ. 3.8. Øàã 12 ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ

 ðåçóëüòàòå âûïîëíåíèÿ øàãà 12 ìû ïîëó÷àåì äåðåâî,


ïîêàçàííîå íà ðèñ. 3.8. Òðåáóåòñÿ îáðàáîòàòü ñóôôèêñû
adc, bc è c. Îáðàáîòêà ïåðâûõ äâóõ èç íèõ âûïîëíÿåòñÿ ïî
ïðàâèëó 2 è ïðèâîäèò ê ïîÿâëåíèþ íîâûõ âåðøèí ñ ñîîòâå-
òñòâóþùèìè ñóôôèêñíûìè ñâÿçÿìè.
Ïðèìå÷àíèå. Íà íåêîòîðûõ äóãàõ íà ðèñ. 3.8 ìåòêè íå
ïðèâîäÿòñÿ. Ýòî äåëàåòñÿ, ÷òîáû íå çàãðóæàòü ðèñóíîê
ëèøíèìè äåòàëÿìè, òåì áîëåå ÷òî ôàêòè÷åñêè íàì íàäî
õðàíèòü íå ñàìè ìåòêè, à íîìåðà èõ ïåðâîãî è ïîñëåäíåãî
ñèìâîëîâ.
122 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Øàãè 13, 14, 15 íå ïðèâîäÿò ê èçìåíåíèþ ñòðóêòóðû äå-


ðåâà.
 ðåçóëüòàòå ðàáîòû øàãà 16 — îáðàáîòêè ñóôôèêñîâ
cbab$, bab$, ab$, b$ è $ — ìû ïîëó÷àåì äåðåâî, ïîêàçàííîå
íà ðèñ. 3.9.

Ðèñ. 3.9. Øàã 16 ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ

Èòàê, ëþáàÿ âíóòðåííÿÿ âåðøèíà, ñîçäàâàåìàÿ â ïðî-


öåññå ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ, áóäåò èìåòü ñóôôèêñ-
íóþ ñâÿçü. Ïóñòü ìû ñîçäàëè âåðøèíó u (ïðàâèëî 2) ïðè îá-
ðàáîòêå ñóôôèêñà S[j – 1..i], è ìåòêà ïóòè (ñêëåéêà ìåòîê
äóã) îò êîðíÿ ê u åñòü xt, ãäå x — ïåðâûé ñèìâîë. Ýòî îçíà÷à-
åò, ÷òî ñóùåñòâóþùèé ïóòü S[j – 1.. i – 1] ïðîäîëæàëñÿ â
äåðåâå íå ñèìâîëîì S[i] (òîãäà ñðàáîòàëî áû ïðàâèëî 3). Â äå-
ðåâå ñóùåñòâóåò ïóòü ñ ìåòêîé t è îí ñîîòâåòñòâóåò ïîäñòðî-
êå S[j..i – 1]. Ýòîò ïóòü çàêàí÷èâàåòñÿ èëè íà äóãå, èëè âî
âíóòðåííåé âåðøèíå t.  ïåðâîì ñëó÷àå áóäóò ñîçäàíû âíóò-
ðåííÿÿ âåðøèíà v, âåðøèíà-ëèñò ñ íîìåðîì j è ìåòêîé äóãè
S[i], à òàêæå óñòàíîâëåíà ñóôôèêñíàÿ ñâÿçü s(u) = v. Âî âòî-
ðîì æå ñëó÷àå ñîçäàåòñÿ òîëüêî âåðøèíà-ëèñò (íî ýòî òîæå
ïðàâèëî 2!), à ñóôôèêñíàÿ ñâÿçü èìååò âèä s(u) = t.
Ñóôôèêñíûå ñâÿçè îáëåã÷àþò (ÿâëÿÿñü èäåéíîé îñíî-
âîé) íàõîæäåíèå îêîí÷àíèé ñëåäóþùèõ ñóôôèêñîâ, íî íå
î÷åâèäíî, ÷òî èõ èñïîëüçîâàíèå äàåò àëãîðèòì ñ ëèíåéíîé
âðåìåííîé îöåíêîé. Äåëî â òîì, ÷òî ïîñëå ïåðåõîäà ïî ñóô-
3.2. Àëãîðèòì Ý. Óêêîíåíà 123

ôèêñíîé ñâÿçè îñòàåòñÿ ïîñèìâîëüíîå ñðàâíåíèå ÷àñòè ñóô-


ôèêñà (îêîí÷àíèÿ) ñ ìåòêîé äóãè (èëè äóã). È ïîêà ìû íå
íàéäåì ñïîñîáà óéòè îò ýòîãî ìåòîäà àíàëèçà îêîí÷àíèÿ
ñóôôèêñà, ñèòóàöèÿ íå èçìåíèòñÿ. Ñ ýòîé öåëüþ èñïîëüçó-
åòñÿ ïðèåì, êîòîðûé Èîñèô Âëàäèìèðîâè÷ Ðîìàíîâñêèé â
ïåðåâîäå êíèãè Ä. Ãàñôèëäà1) íàçâàë «ñêà÷êîì ïî ñ÷åò÷è-
êó». Åãî ñìûñë çàêëþ÷àåòñÿ â ïåðåõîäå îò ñðàâíåíèÿ ñèìâî-
ëîâ ê ñðàâíåíèþ äëèíû ìåòîê äóã è îñòàâøåéñÿ ÷àñòè ñóô-
ôèêñà, ÷òî ïîçâîëÿåò îñóùåñòâëÿòü ïåðåõîäû (ñêà÷êîì, áåç
àíàëèçà ñèìâîëîâ) îò âåðøèíû-îòöà äåðåâà ê âåðøèíå-ñûíó
äî òåõ ïîð, ïîêà íå áóäåò èñ÷åðïàí ñóôôèêñ.
Ïîÿñíèì ñóòü îïåðàöèè «ñêà÷îê ïî ñ÷åò÷èêó» ñ ïî-
ìîùüþ ïðèìåðà (ðèñ. 3.10).

Ðèñ. 3.10. Ïðèìåð, ïîÿñíÿþùèé ñóòü îïåðàöèè


«ñêà÷îê ïî ñ÷åò÷èêó»

Ïóñòü ïðè îáðàáîòêå ñóôôèêñà S[j – 1..i] íàéäåíî îêîí-


÷àíèå ïîäñòðîêè S[j – 1..i – 1] è â ðåçóëüòàòå ñðàáàòûâàíèÿ
ïðàâèëà 2 ñîçäàíà âíóòðåííÿÿ âåðøèíà u. Ìåòêà ïóòè ê u
åñòü xtg (ýòî è åñòü ñóôôèêñ S[j – 1..i – 1]). ×òî ìû òåïåðü
äåëàåì? Ìû ïîäíèìàåìñÿ ââåðõ ïî äåðåâó îò âåðøèíû u ê åå
âåðøèíå-îòöó è ïåðåõîäèì ïî ñóôôèêñíîé ñâÿçè ê âåðøèíå z.
Ïî îáû÷íîé ëîãèêå ïîñëå âûáîðà äóãè ïðîèñõîäèò ïîñèì-
âîëüíîå ñðàâíåíèå ñèìâîëîâ ìåòêè h ñ îñòàâøåéñÿ ÷àñòüþ
ñóôôèêñà S[j..i – 1], — ïóñòü ýòî áóäåò ÷àñòü S[q..i – 1] (ïåð-
1)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ. Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ. — ÑÏá.: Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåð-
áóðã, 2003. Ñ. 134.
124 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

âûå ñèìâîëû, ñîîòâåòñòâóþùèå ìåòêå äóãè t, èñêëþ÷åíû èç


îáðàáîòêè). Òî åñòü S[q] ñðàâíèâàåòñÿ ñ h[1]; S[q + 1] —
ñ h[2] è ò. ä. Ïðè «ñêà÷êå ïî ñ÷åò÷èêó» ñðàâíèâàþòñÿ äëèíû
S[q..i – 1] è h. Â äàííîì ïðèìåðå äëèíà S[q..i – 1] áîëüøå, è
ìû ïåðåõîäèì (äåëàåì ñêà÷îê!) ê âåðøèíå-ñûíó z.  ýòîé
âåðøèíå âûïîëíÿþòñÿ àíàëîãè÷íûå äåéñòâèÿ, íî óæå ñ
îñòàâøåéñÿ ÷àñòüþ ñóôôèêñà S[q + 6..i – 1]. Îêàçûâàåòñÿ,
÷òî äëèíà ìåòêè k áîëüøå äëèíû S[q + 6..i – 1] — ñóôôèêñ
S[j..i – 1] íå îêàí÷èâàåòñÿ â âåðøèíå äåðåâà. Ïðåäïîëî-
æèì, ÷òî ñèìâîëà S[i] íåò äàëåå â ìåòêå äóãè (ïðàâèëî 3),
òîãäà ñîçäàåòñÿ íîâàÿ âíóòðåííÿÿ âåðøèíà v è âåðøèíà-
ëèñò ñ íîìåðîì j, à ìåæäó âåðøèíàìè u è v óñòàíàâëèâàåòñÿ
ñóôôèêñíàÿ ñâÿçü.
 ðåçóëüòàòå âðåìÿ ïîèñêà îêîí÷àíèÿ ñóôôèêñà â äåðå-
âå ñòàíîâèòñÿ ïðîïîðöèîíàëüíûì íå êîëè÷åñòâó ñèìâîëîâ â
ñóôôèêñå, íå äëèíå ýòîãî ñóôôèêñà, à êîëè÷åñòâó ïðîéäåí-
íûõ âåðøèí äåðåâà, ÷òî è ÿâëÿåòñÿ óñëîâèåì ïîëó÷åíèÿ ëè-
íåéíîãî ïî âðåìåíè àëãîðèòìà.

Ââåäåì ïîíÿòèå âåðøèííîé ãëóáèíû çàäàííîé âåðøè-


íû, îáîçíà÷àþùåå êîëè÷åñòâî âåðøèí íà ïóòè äî íåå îò êîð-
íÿ, è ñäåëàåì ïîïûòêó íåôîðìàëüíîãî îáîñíîâàíèÿ ëèíåé-
íîãî âðåìåíè ðàáîòû àëãîðèòìà Ý. Óêêîíåíà. Äëÿ ýòîãî íå-
îáõîäèìî îöåíèòü îáùåå êîëè÷åñòâî îáðàáîòîê ñóôôèêñîâ
ñòðîêè è âðåìÿ îáðàáîòêè ñóôôèêñà. Ïðàâèëà 1 è 3 èñêëþ-
÷àþò îáðàáîòêó ÷àñòè ñóôôèêñîâ. Ñàìî ïðàâèëî 2 òàêæå âû-
ïîëíÿåòñÿ çà ïîñòîÿííîå âðåìÿ ïðè óñëîâèè, ÷òî íàéäåíî
îêîí÷àíèå ñóôôèêñà, ïîèñê êîòîðîãî îáåñïå÷èâàåòñÿ ñóô-
ôèêñíûìè ñâÿçÿìè è «ñêà÷êàìè ïî ñ÷åò÷èêó». Íàïîìíèì,
÷òî íà êàæäîì øàãå îáðàáîòêà ñóôôèêñîâ ïîäñòðîêè S[1..i]
íà÷èíàåòñÿ íå ñ ïåðâîãî, à ñ íåêîòîðîãî ñóôôèêñà q S[q..i],
ãäå q — íîìåð ïîñëåäíåãî ñðàáàòûâàíèÿ ïðàâèëà 2 (ëèñòà).
Âåðøèíà-ëèñò ñîçäàåòñÿ â îáÿçàòåëüíîì ïîðÿäêå, à âíóò-
ðåííÿÿ âåðøèíà — â çàâèñèìîñòè îò òîãî, çàêàí÷èâàåòñÿ
ñóôôèêñ íà äóãå èëè â ðàíåå ñîçäàííîé âíóòðåííåé âåðøè-
íå. Çíà÷åíèå q íå óáûâàåò ïðè ðàáîòå àëãîðèòìà è íå èçìå-
íÿåòñÿ ïðè ïåðåõîäå îò øàãà ê øàãó.
Ïðèìåð èçìåíåíèÿ q ïðèâåäåí íà ðèñ. 3.11. Êàæäàÿ ëè-
íèÿ çäåñü îáîçíà÷àåò øàã àëãîðèòìà, à ÷èñëî — çíà÷åíèå q,
ò. å. îáðàáàòûâàåìûé íà äàííîì øàãå ñóôôèêñ S[q..i]. Î÷å-
âèäíî, ÷òî êîëè÷åñòâî îáðàáîòîê ñóôôèêñîâ íå ìîæåò ïðå-
âîñõîäèòü çíà÷åíèÿ 2 · n.
3.2. Àëãîðèòì Ý. Óêêîíåíà 125

Ðèñ. 3.11. Ïðèìåð èçìåíåíèÿ çíà÷åíèÿ ïåðåìåííîé q

Îñòàëîñü îöåíèòü êîëè÷åñòâî ñðàáàòûâàíèé îïåðàöèè


«ñêà÷îê ïî ñ÷åò÷èêó» â öåëîì ïðè èñïîëíåíèè àëãîðèòìà.
Ïîñìîòðèì, êàê èçìåíÿåòñÿ ïðè ýòîì çíà÷åíèå âåðøèííîé
ãëóáèíû. Êàæäûé øàã àëãîðèòìà íà÷èíàåòñÿ ñ îáðàáîòêè
ñóôôèêñà q (ýòî — ïîñëåäíèé îáðàáîòàííûé ñóôôèêñ íà
ïðåäûäóùåì øàãå), ò. å. âåðøèííàÿ ãëóáèíà íå èçìåíÿåòñÿ
ïðè ïåðåõîäå îò øàãà ê øàãó. Ïðè ïîèñêå îêîí÷àíèÿ ñóô-
ôèêñà âåðøèííàÿ ãëóáèíà âíà÷àëå óìåíüøàåò ñâîå çíà÷å-
íèå íå áîëåå ÷åì íà 2 (ââåðõ ïî äåðåâó íà îäíó äóãó ïëþñ ïå-
ðåõîä ïî ñóôôèêñíîé ñâÿçè), à çàòåì óâåëè÷èâàåòñÿ íà 1 ïðè
êàæäîì «ñêà÷êå». Ìàêñèìàëüíîå çíà÷åíèå âåðøèííîé ãëó-
áèíû — n, à êîëè÷åñòâî ñðàáàòûâàíèé ïðàâèëà 2 íå ïðåâîñ-
õîäèò 2 · n; îòñþäà ñëåäóåò, ÷òî êîëè÷åñòâî «ñêà÷êîâ ïî
ñ÷åò÷èêó», âûïîëíåííûõ íà âñåõ øàãàõ àëãîðèòìà, èìååò
ïîðÿäîê O(n).
Äðóãèìè ñëîâàìè, öèêë ïî ïðåôèêñàì (i) íåèçáåæåí. Íî
äëÿ âñåõ çíà÷åíèé i êîëè÷åñòâî ñðàáàòûâàíèé ïðàâèëà 2 ëè-
íåéíî, èáî ïåðåêðûòèå ìåæäó øàãàìè i è i + 1 âîçìîæíî íå
áîëåå ÷åì ïî îäíîìó ñóôôèêñó. Èç âñåãî ìíîæåñòâà ñóôôèê-
ñîâ (âñåõ ïðåôèêñîâ òåêñòà — ïîðÿäîê O(n2) ) òîëüêî äëÿ
÷àñòè ñóôôèêñîâ òðåáóåòñÿ êîíñòàíòíîå âðåìÿ ïðè èõ âêëþ-
÷åíèè â äåðåâî, è ýòà ÷àñòü íå ïðåâîñõîäèò çíà÷åíèÿ 2 · n.
Äàëåå, ïðè ñðàáàòûâàíèè ïðàâèëà 2 íåîáõîäèìî íàéòè
îêîí÷àíèå ñóôôèêñà. Çíàÿ ìåñòî â äåðåâå îêîí÷àíèÿ ïðåäû-
äóùåãî ñðàáàòûâàíèÿ ïðàâèëà 2, ñëåäóåò èäòè ââåðõ ïî äå-
ðåâó íà îäíó âåðøèíó, çàòåì ïî ñóôôèêñíîé ñâÿçè (à îíà
óæå åñòü â äåðåâå) è âíèç ïî äåðåâó ñ ïîìîùüþ «ñêà÷êà ïî
ñ÷åò÷èêó».  èòîãå îêàçûâàåòñÿ, ÷òî ñóììàðíîå êîëè÷åñòâî
(ïðè âñåõ çíà÷åíèÿõ i) òàêèõ «ïðûæêîâ» ïî äåðåâó ëèíåéíî.
 èòîãå îáùàÿ îöåíêà âðåìåíè åñòü O(n).
Îñîáåííîñòè ðåàëèçàöèè îïèñûâàåìîãî àëãîðèòìà âû-
íåñåì â óïðàæíåíèÿ. Ïðèâåäåì çäåñü òîëüêî âîçìîæíîå
126 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

îïèñàíèå äàííûõ — ìèíèìàëüíîå, íî äîñòàòî÷íîå äëÿ íàïè-


ñàíèÿ ïðîãðàììíîãî êîäà.
Type
PList=^node;
node=Record
cnt:Integer;
{Êîëè÷åñòâî ñûíîâåé ó âåðøèíû äåðåâà}
parent:PList;
{Óêàçàòåëü íà îòöà âåðøèíû}
sufn:PList;
{Ñóôôèêñíàÿ ñâÿçü}
num:Integer;
{Ìåòêà ëèñòà. Äëÿ âíóòðåííåé âåðøèíû,
âêëþ÷àÿ êîðåíü, îíà èìååò çíà÷åíèå 0}
d:Array[|A|] Of Record
first,last:Integer;
{Íîìåðà ïåðâîãî è ïîñëåäíåãî ñèìâîëîâ
ïîäñòðîêè – ìåòêè äóãè}
next:PList;
{Óêàçàòåëü íà âåðøèíó – ñûíà}
End;
End;

@ Óïðàæíåíèÿ
1. Èñïîëüçóÿ àëãîðèòì Ý. Óêêîíåíà, ïîñòðîéòå äåðåâüÿ
ñóôôèêñîâ ñ ñóôôèêñíûìè ñâÿçÿìè äëÿ ñòðîê:
l abcdefghijklmnopq;
l aaaaaaaaaaaaaaaab;
l abaababa;
l abaababaabaab;
l abaababaabaababaababa;
l abbabaab;
l abbabaabbaababba;
l abcabacabcbacbcacb;
l abcabacabcbacbcacbabcabacabcb.

2. Ïðèâåäèòå ïðèìåð ñòðîêè, äëÿ êîòîðîé íà êàæäîì øàãå


ïðè ïîñòðîåíèè äåðåâà ñóôôèêñîâ ïðàâèëî 2 ñðàáàòûâà-
åò îäèí ðàç.
3.3. Àëãîðèòì Å. Ìàê-Êðåéãà 127

3. Äëÿ ñòðîêè S è åå «ïåðåâåðòûøà» S’ ïîñòðîéòå äåðåâüÿ


ñóôôèêñîâ ñ ñóôôèêñíûìè ñâÿçÿìè. Óñòàíîâèòå, ñó-
ùåñòâóåò ëè âçàèìîñâÿçü ìåæäó ýòèìè äåðåâüÿìè.
4. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Ý. Óêêîíåíà.

3.3. Àëãîðèòì Å. Ìàê-Êðåéãà


…ðóêîâîäèòü õîäîì ñâîèõ ìûñëåé, íà-
÷èíàÿ ñ ïðåäìåòîâ ïðîñòåéøèõ è ëåãêî
ïîçíàâàåìûõ, è âîñõîäèòü ìàëî-
ïîìàëó, êàê ïî ñòóïåíÿì, äî ïîçíàíèÿ
íàèáîëåå ñëîæíûõ…
Ðåíå Äåêàðò.
Ðàññóæäåíèå î ìåòîäå

 àëãîðèòìå Ý. Óêêîíåíà â êà÷åñòâå îñíîâû èñïîëüçóåò-


ñÿ âòîðîé ïðîñòîé ñïîñîá ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ
(ñì. ï. 3.1). À ìîæíî ëè âçÿòü çà îñíîâó ïåðâûé ïðîñòîé ñïî-
ñîá ñîçäàíèÿ äåðåâà è èçìåíèòü åãî òàê, ÷òîáû ïîëó÷èëñÿ
àëãîðèòì ñ ëèíåéíîé âðåìåííîé îöåíêîé ðàáîòû? Íà ýòîò
âîïðîñ îòâå÷àåò ðåçóëüòàò, ïîëó÷åííûé Å. Ìàê-Êðåéãîì.
Ââåäåì ðÿä íîâûõ ïîíÿòèé.
Íà ðèñ. 3.12 ïðèâåäåí ïðèìåð äåðåâà ñóôôèêñîâ (áåç
ñóôôèêñíûõ ñâÿçåé) äëÿ ñòðîêè abaabab$.

Ðèñ. 3.12. Äåðåâî ñóôôèêñîâ (áåç ñóôôèêñíûõ ñâÿçåé)


äëÿ ñòðîêè abaabab$
Ïîíÿòèå íàèáîëüøåãî îáùåãî ïðåôèêñà äâóõ ñóôôèêñîâ
S[i..n] è S[j..n] î÷åâèäíî — ýòî íàèáîëüøàÿ ïîäñòðîêà w, ÿâ-
ëÿþùàÿñÿ ïðåôèêñîì è òîãî, è äðóãîãî ñóôôèêñîâ. Òàê, äëÿ
128 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

ñóôôèêñîâ S[2..8] è S[5..8] íà ðèñ. 3.12 íàèáîëüøèé îáùèé


ïðåôèêñ åñòü ñòðîêà ba, à äëÿ ñóôôèêñîâ S[2..8] è S[3..8] —
e (ïóñòàÿ ñòðîêà). Íåòðóäíî çàìåòèòü, ÷òî íàèáîëüøèé îá-
ùèé ïðåôèêñ ñîâïàäàåò ñ ìåòêîé ïóòè â äåðåâå äî âåðøèíû,
ÿâëÿþùåéñÿ íàèìåíüøèì îáùèì ïðåäêîì âåðøèí-ëèñòüåâ,
ñîîòâåòñòâóþùèõ ðàññìàòðèâàåìûì ñóôôèêñàì. Ýòîò ôàêò,
åñëè òàê ìîæíî âûðàçèòüñÿ, çàëîæåí â ñòðóêòóðå äåðåâà
ñóôôèêñîâ.
Ðàçîáüåì êàæäûé ñóôôèêñ S[i..n]$ (êîòîðîìó ñîîòâåò-
ñòâóåò âåðøèíà-ëèñò ñ íîìåðîì i) íà äâå ÷àñòè: ïîäñòðîêó
head[i] — «ãîëîâó» ñóôôèêñà è ïîäñòðîêó tail[i] — «õâîñò»
ñóôôèêñà. Çíà÷åíèå head[i] ñóôôèêñà S[i..n]$ ìû îïðåäå-
ëèì êàê îáùèé ïðåôèêñ ìàêñèìàëüíîé äëèíû, âû÷èñëåí-
íûé äëÿ âñåõ S[j..n]$, 1 „ j „ i – 1 (head[1]=e). Çíà÷åíèå æå
tail[i] — ýòî îñòàâøàÿñÿ ÷àñòü ñóôôèêñà.  òàáë. 3.4 ïðèâå-
äåíû ïðèìåðû ñòðîê è çíà÷åíèé head[i] äëÿ íèõ.

Òàáëèöà 3.4

abaaaabaa abcabdabcab abaababaab bacbababaabc


Ñòðîêà
aab$ dab$ aab$ bab$
i head[i] head[i] head[i] head[i]
1 e e e e
2 e e e e
3 a e a e
4 aaa ab aba ba
5 aa b ba a
6 abaaaab e abaaba baba
7 baaaab abcabdab baaba aba
8 aaaab bcabdab aaba ba
9 aaab cabdab abaab a
10 aab abdab baab ab
11 ab bdab aab b
12 b dab ab cbab
13 e ab b bab
14 b e ab
15 e b
16 e
3.3. Àëãîðèòì Å. Ìàê-Êðåéãà 129

 ÷åì äîëæíà ñîñòîÿòü èäåÿ ïîñòðîåíèÿ äåðåâà ñóô-


ôèêñîâ çà ëèíåéíîå âðåìÿ? Íàïîìíèì, ÷òî â îïèñûâàå-
ìîì ñïîñîáå ïîñòðîåíèÿ äåðåâà ïåðâûì îïðåäåëÿåòñÿ ñóô-
ôèêñ S[1..n]$, çàòåì S[2..n]$ è ò.ä., âïëîòü äî ñóôôèêñîâ
S[n]$ è $. Íà êàæäîì øàãå àëãîðèòìà ñîçäàåòñÿ ëèñò ñ íî-
ìåðîì i. Åñëè ïðè ýòîì ñîçäàåòñÿ âíóòðåííÿÿ âåðøèíà, òî
ìåòêà ïóòè ê íåé, êàê îêàçûâàåòñÿ, ðàâíà head[i], à äóãà,
âûõîäÿùàÿ ê âåðøèíå-ëèñòó i, èìååò ìåòêó tail[i]. Ñ ïî-
ìîùüþ ñóôôèêñíûõ ñâÿçåé (à îíè çäåñü îïðåäåëÿþòñÿ
òî÷íî òàê æå, êàê è â àëãîðèòìå Ý. Óêêîíåíà) ñëåäóåò èñ-
êàòü êîíåö î÷åðåäíîãî ñóôôèêñà íà÷èíàÿ íå ñ êîðíÿ, à ñ
íåêîòîðîé âíóòðåííåé âåðøèíû. Äðóãèìè ñëîâàìè, íàì
òðåáóåòñÿ ýôôåêòèâíûé ïåðåõîä îò ñóôôèêñà
S[i – 1..n]$ = head[i – 1]tail[i – 1] ê ñóôôèêñó S[i..n]$ =
= head[i]tail[i], ò. å. îò âíóòðåííåé âåðøèíû, îïðåäåëÿå-
ìîé head[i – 1], ê âåðøèíå ñ ìåòêîé ïóòè head[i]. Åñëè
ïðîàíàëèçèðîâàòü çíà÷åíèÿ head (ñì. òàáë. 3.4; íåîáõîäèìî
ðàññìàòðèâàòü è ñëó÷àè ïóñòîé ñòðîêè e), òî ïðîñìàòðèâàåò-
ñÿ çàâèñèìîñòü: åñëè w = head[i – 1] — ñòðîêà èç k ñèìâî-
ëîâ (k … 0), òî ïîäñòðîêà w[2..k] ÿâëÿåòñÿ ïðåôèêñîì ñòðî-
êè head[i] (à ïîäñòðîêà ïóñòîé ñòðîêè åñòü ïóñòàÿ ñòðîêà).
Èëè, äðóãèìè ñëîâàìè, head[i] åñòü (îñîáûå ñëó÷àè ìû èñ-
êëþ÷àåì) íàèáîëüøèé ñîáñòâåííûé ñóôôèêñ head[i – 1].
Íî ñóôôèêñíàÿ ñâÿçü s, ñîãëàñíî åå îïðåäåëåíèþ, ýòî íå ÷òî
èíîå, êàê óêàçàòåëü îò âåðøèíû äåðåâà ñ ìåòêîé ïóòè w ê
âåðøèíå äåðåâà ñ ìåòêîé, ðàâíîé íàèáîëüøåìó ñîáñòâåííî-
ìó ñóôôèêñó w, ò. å. s(head[i – 1]) = head[i]. Îäíàêî ñóô-
ôèêñíàÿ ñâÿçü óñòàíàâëèâàåòñÿ òîëüêî ïîñëå òîãî, êàê
îïðåäåëåíà âåðøèíà äåðåâà ñ ìåòêîé head[i], ïîýòîìó ñëå-
äóåò â êà÷åñòâå îòïðàâíîé òî÷êè åå ïîèñêà âçÿòü âåðøèíó
s(parent(head[i – 1])) — ñäåëàòü ïåðåõîä ïî ñóôôèêñíîé ñâÿ-
çè (ðàíåå óñòàíîâëåííîé) îò îòöà head[i – 1] è îò ýòîé âåð-
øèíû èñêàòü îêîí÷àíèå ìåòêè head[i].
Ïîïûòàåìñÿ íà óðîâíå ïðèìåðà êîíêðåòèçèðîâàòü ñõå-
ìó ïåðåõîäà îò îêîí÷àíèÿ îäíîãî ñóôôèêñà ê îêîí÷àíèþ
äðóãîãî.

Ïðèìåð
Ïîñòðîèì äåðåâî ñóôôèêñîâ äëÿ ñòðîêè abaaaabaaaab$.
(Øàãè 3–8 ïîêàçàíû íà ðèñ. 3.13, à øàãè 9–12 — íà
ðèñ. 3.14.)
130 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Ïðîöåññ ôîðìèðîâàíèÿ äåðåâà íà÷èíàåòñÿ ñ øàãà 1 —


ñîçäàåòñÿ êîðåíü ñ ñóôôèêñíîé ñâÿçüþ íà ñåáÿ ñàìîãî è âåð-
øèíà-ëèñò ñ íîìåðîì 1; äóãà, èäóùàÿ èç êîðíÿ, èìååò ìåòêó
abaaaabaaaab$.
Øàã 2 ïðèçâàí îáðàáîòàòü ñóôôèêñ baaaabaaaab$; äåé-
ñòâèÿ ïðè ýòîì àíàëîãè÷íû.
Íà øàãå 3 ïîñëå âûáîðà äóãè, âûõîäÿùåé èç êîðíÿ, ïðî-
èçâîäèòñÿ ñðàâíåíèå ìåòêè äóãè è ñóôôèêñà aaaabaaaab$.
Íà âòîðîì ñèìâîëå ñîâïàäåíèÿ çàêàí÷èâàþòñÿ, ñîçäàåòñÿ
âíóòðåííÿÿ âåðøèíà, âõîäÿùàÿ äóãà (èç êîðíÿ) èìååò ìåò-
êó a, à âûõîäÿùàÿ â âåðøèíó-ëèñò ñ íîìåðîì 3 — ìåòêó
aaabaaaab$. Ñóôôèêñíàÿ ñâÿçü èäåò ïðè ýòîì èç êîðíÿ â êî-
ðåíü (head[i – 1] åñòü êîðåíü).
Øàã 4 àíàëîãè÷åí ïðåäûäóùèì äåéñòâèÿì, è ïîêà êëþ-
÷åâàÿ èäåÿ àëãîðèòìà ó íàñ åùå íå ïðîñìàòðèâàåòñÿ. Ñóô-
ôèêñíàÿ ñâÿçü èäåò èç head[i – 1] = a â êîðåíü (ðèñ. 3.13).
Øàã 5. Ëîãèêà ýòîãî øàãà ïîêàçàíà íà ðèñ. 3.13. Ñóô-
ôèêñíàÿ ñâÿçü ñîçäàåòñÿ îò âåðøèíû ñ ìåòêîé aaa äî âíîâü
îáðàçîâàííîé âíóòðåííåé âåðøèíû. Ñäåëàåì ïðåäïîëîæå-
íèå (íàáëþäåíèå): îò âåðøèíû s(parent(head[i – 1])) (ïåðå-
õîä ïî ñóôôèêñíîé ñâÿçè âåðøèíû-îòöà) ñ ìåòêîé, ðàâíîé
ìåòêå äóãè îò parent(head[i – 1]), äî âåðøèíû head[i – 1]
â äåðåâå ìîæíî ñäåëàòü «ñêà÷îê ïî ñ÷åò÷èêó». Äðóãèìè ñëî-
âàìè, ýòà ìåòêà ñîâïàäàåò ñ ïðåôèêñîì ñóôôèêñà S[i..n],
îêîí÷àíèå êîòîðîãî â äåðåâå íàì íåîáõîäèìî íàéòè, è ýòîò
ïðåôèêñ óæå ïðåäñòàâëåí â äåðåâå.
Íà øàãå 5 îò îòöà head[i – 1] ñóôôèêñíàÿ ñâÿçü èäåò ê
êîðíþ. Èç íåãî «ñêà÷êîì ïî ñ÷åò÷èêó» ìû èäåì ñ ìåòêîé aa.
Îïåðàöèÿ çàêàí÷èâàåòñÿ íà äóãå, ÷òî ïðèâîäèò ê åå ðàçáèâ-
êå íà äâå äóãè, ò. å. ê îáðàçîâàíèþ íîâîé âíóòðåííåé âåðøè-
íû, ïðè÷åì ê íåé ïîéäåò ñóôôèêñíàÿ ñâÿçü îò head[i – 1],
à èç íåå íîâàÿ äóãà ñ ìåòêîé tail[i] ê âåðøèíå-ëèñòó ñ íîìå-
ðîì i.
Øàã 6 ïîäòâåðæäàåò ýòî íàøå íàáëþäåíèå. Ñóôôèêñíàÿ
ñâÿçü îò îòöà head[i – 1] îïÿòü â êîðåíü. «Ñêà÷îê ïî ñ÷åò÷è-
êó» ñ ìåòêîé a è äàëüíåéøàÿ îáðàáîòêà ñóôôèêñà abaaaab$
ïðèâîäÿò ê ñîçäàíèþ âíóòðåííåé âåðøèíû è âåðøèíû-ëèñ-
òà ñ íîìåðîì 6.
Øàã 7. Èç êîðíÿ âûïîëíÿåòñÿ «ñêà÷îê ïî ñ÷åò÷èêó»
ñ ìåòêîé baaaab.
Øàã 8. Èç êîðíÿ âûïîëíÿåòñÿ «ñêà÷îê ïî ñ÷åò÷èêó»
ñ ìåòêîé aaaab. Ïðè ýòîì ìû ïðîõîäèì òðè âåðøèíû. Íà
3.3. Àëãîðèòì Å. Ìàê-Êðåéãà 131

Ðèñ. 3.13. Øàãè 3–8 ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ


äëÿ ñòðîêè abaaaabaaaab$

äóãå ñ ìåòêîé abaaaab$ ñîçäàåòñÿ íîâàÿ âíóòðåííÿÿ âåðøè-


íà, à ñóôôèêñíàÿ ñâÿçü èäåò èç head[i – 1] (ðèñ. 3.13) â îáðà-
çîâàííóþ âåðøèíó.
Øàã 9. Íàøå ïðåäïîëîæåíèå íà÷èíàåò ðàáîòàòü! Ñóô-
ôèêñíàÿ ñâÿçü îò âåðøèíû parent(head[i – 1]) ïðèâîäèò ê
âåðøèíå u (ðèñ. 3.14), îò êîòîðîé «ñêà÷îê ïî ñ÷åò÷èêó» ñ
ìåòêîé ab áûñòðî ïðèâîäèò ê îáðàçîâàíèþ íîâîé âåðøèíû,
ò. å. ê îïðåäåëåíèþ îêîí÷àíèÿ ñóôôèêñà aaab â äåðåâå. Ïðè
ýòîì ïðåôèêñ aa ñóôôèêñà â ðàáîòå íå ó÷àñòâîâàë.
Øàã 10. Âûïîëíÿåòñÿ àíàëîãè÷íî ïðåäûäóùåìó øàãó,
îò âåðøèíû u, íî ñ ìåòêîé b.
Øàã 11. Ñóôôèêñ — ab$. Îïåðàöèÿ s(parent(head[i – 1]))
äàåò íîâîå çíà÷åíèå u.
Øàã 12. Èäåì îò êîðíÿ (u åñòü êîðåíü) ñ ìåòêîé b.
132 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Ðèñ. 3.14. Øàãè 9–12 ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ äëÿ ñòðîêè


abaaaabaaaab$
3.3. Àëãîðèòì Å. Ìàê-Êðåéãà 133

Îïèñàíèå àëãîðèòìà â îáùåì âèäå ìîæåò áûòü ñëåäóþ-


ùèì:
<ñîçäàòü äåðåâî T1>;
q:=Nil;
For i:=2 To n+1 Do Begin
<ïåðåìåííîé u ïðèñâîèòü çíà÷åíèå óêàçàòåëÿ íà îòöà
âåðøèíû äåðåâà (q^.parent)>;
<ïåðåìåííîé v ïðèñâîèòü çíà÷åíèå ìåòêè äóãè,
èäóùåé îò îòöà ê ñûíó (îò u^ ê q^)>;
If u<>Nil Then Begin
<ïî ñóôôèêñíîé ñâÿçè îòöà ïåðåéòè ê âåðøèíå t>;
<îò âåðøèíû t ñ ìåòêîé v èäòè "ñêà÷êîì
ïî ñ÷åò÷èêó" ïî äåðåâó è îïðåäåëèòü âåðøèíó w>;
End
Else <èäòè îò êîðíÿ ñ ìåòêîé, íà÷èíàþùåéñÿ
ñ ñèìâîëà v[2], è îïðåäåëèòü âåðøèíó w ïóòåì
îáû÷íîãî (ïðîñòîé àëãîðèòì) ïðîñìîòðà âåðøèí
è äóã äåðåâà>;
If <w íîâàÿ âåðøèíà> Then <w åñòü head[i] –
äîáàâèòü ýòó âåðøèíó â äåðåâî>;
<óñòàíîâèòü ñóôôèêñíóþ ñâÿçü îò âåðøèíû
head[i-1] ê âåðøèíå w>;
<äîáàâèòü ëèñò ñ íîìåðîì i â äåðåâî è äóãó îò w
ê ëèñòó ñ ìåòêîé tail[i]>;
End;
Òåõíèêà îáîñíîâàíèÿ âðåìåííîé îöåíêè àëãîðèòìà
Å. Ìàê-Êðåéãà ïðàêòè÷åñêè ñîâïàäàåò ñ òîé, ÷òî áûëà ðàñ-
ñìîòðåíà ïðè àíàëèçå ðåçóëüòàòà Ý. Óêêîíåíà.

@ Óïðàæíåíèÿ
1. Èçìåíèòå ñòðîêó abaaaabaaaab$ íà abaaaabaaaabaaaab$
è ïðîäîëæèòå ïîñòðîåíèå äåðåâà ñóôôèêñîâ, ïîêàçàííî-
ãî íà ðèñ. 3.13 è ðèñ. 3.14.
2. Íàïèøèòå ïðîãðàììó âû÷èñëåíèÿ çíà÷åíèé head[i] äëÿ
ïðîèçâîëüíîé ñòðîêè S.
3. Ïðåäïîëîæèì, ÷òî çàäàíî ñëåäóþùåå îïèñàíèå âåðøè-
íû äåðåâà ñóôôèêñîâ:
tree=^node;
node=Record
cnt:Word;
{Êîëè÷åñòâî ñûíîâåé}
134 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

parent:tree;
{Ññûëêà íà ðîäèòåëÿ}
first,last:Word;
{Èíäåêñû íà÷àëà è êîíöà ìåòêè äóãè}
suf:tree;
{Ñóôôèêñíàÿ ñâÿçü}
num:Word;
{Ìåòêà âåðøèíû}
ln:Word;
{Êîëè÷åñòâî ñèìâîëîâ â ñòðîêå, ïîëó÷àåìîé
"ñêëåéêîé" ìåòîê äóã íà ïóòè îò êîðíÿ
äî âåðøèíû}
next:Array[1..|A|] Of tree;
{Ìàññèâ óêàçàòåëåé íà ñûíîâåé âåðøèíû}
End;
Çäåñü â ïåðåìåííîé pt õðàíèòñÿ óêàçàòåëü íà êîðåíü äå-
ðåâà (íà ìîìåíò âûçîâà ïðîöåäóðû). Íàéäèòå âîçìîæ-
íîñòü óëó÷øèòü ïðîãðàììíûé êîä ïðîöåäóðû Search —
ïîèñêà îáðàçöà P â òåêñòå T ïðè ïîñòðîåííîì äåðåâå
ñóôôèêñîâ.
Procedure Search;
Var i,j,r:Word;
fn:Boolean; {Ïðèçíàê çàâåðøåíèÿ ðàáîòû}
Begin
r:=1; {Íîìåð ñèìâîëà â P}
fn:=False;
Repeat
i:=1;
While (i<=pt^.cnt) And
(T[pt^.next[i]^.first]<>P[r]) Do i:=i+1;
If (i>pt^.cnt) Then Begin
WriteLn('P íåò â òåêñòå');
fn:=True;
End
Else Begin
pt:=pt^.next[i];
j:=1;
While (T[pt^.first+j]=P[r+j]) And
(pt^.first+j<=pt^.last) And
(r+j<=m) Do j:=j+1;
3.3. Àëãîðèòì Å. Ìàê-Êðåéãà 135

If (r+j>m) Then Begin {Âûâîä}


If (pt^.num0) Then WriteLn(pt^.num)
Else <Îáõîä ÷àñòè äåðåâà (ïîèñê
â ãëóáèíó) ñ âåðøèíû pr>;
fn:=True;
End
Else
If (pt^.first+j>pt^.last) Then r:=r+j
{Ïåðåõîä ê ñëåäóþùåé âåðøèíå}
Else Begin
WriteLn('Ñòðîêè íåò â òåêñòå');
fn:=True;
End;
End;
Until fn;
End;
Îäèí èç âîçìîæíûõ âàðèàíòîâ ðåàëèçàöèè îáõîäà ÷àñòè
äåðåâà èìååò âèä:
Procedure Pg(t:tree);
Var i:Word;
Begin
If (t^.cnt=0) Then WriteLn(t^.num)
Else
For i:=1 To t^.cnt Do Pg(t^.next[i]);
End;

4. Îïðåäåëèòå íàçíà÷åíèå ôóíêöèè Scan. Ìîæíî ëè óëó÷-


øèòü äàííóþ åå ðåàëèçàöèþ (âñå ëè ïàðàìåòðû â îïèñà-
íèè âåðøèíû äåðåâà ñóôôèêñîâ èñïîëüçóþòñÿ ýôôåê-
òèâíî)?
Function Scan(Var vf:Word;w:tree):tree;
Var i,j:Word;
fn:Boolean;
tt:tree;
Begin
fn:=False;
Repeat {Èùåì ñûíà}
i:=1;
While (i<=w^.cnt) And
(T[w^.next[i]^.first]<>T[vf])
Do i:=i+1;
136 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

If (i>w^.cnt) Then fn:=True


Else Begin {Ñûí íàéäåí}
w:=w^.next[i];
j:=1;
While (T[w^.first+j]=T[vf+j]) And
(w^.first+j<=w^.last) Do j:=j+1;
If (w^.first+j>w^.last) Then vf:=vf+j
Else Begin
{Ñîâïàäåíèÿ çàêîí÷èëèñü âíóòðè äóãè -
ðàçáèâàåì äóãó}
<Ñîçäàåì íîâóþ âåðøèíó è êîððåêòèðóåì
ïîëÿ âåðøèíû w^>;
w:=<çíà÷åíèå óêàçàòåëÿ íà âíîâü
ñîçäàííóþ âåðøèíó>;
vf:=vf+j;
fn:=True;
End;
End;
Until fn;
scan:=w;
End;
5. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Å. Ìàê-Êðåéãà.
6. Ýêñïåðèìåíòàëüíî èññëåäóéòå ýôôåêòèâíîñòü àëãîðèò-
ìîâ Ý. Óêêîíåíà è Å. Ìàê-Êðåéãà íà ðàçëè÷íûõ òèïàõ
âõîäíûõ äàííûõ (êðàòíûå ñòðîêè, ñòðîêè íà åñòåñòâåí-
íîì ÿçûêå, ñòðîêè íà íåáîëüøîì àëôàâèòå è ò. ä).

3.4. Ñóôôèêñíûå ìàññèâû


Êàê æå ýòî âû áåç ãðàâèöàïïû
ïåïåëàö âûêàòûâàåòå èç ãàðàæà?
Ýòî íåïîðÿäîê...
(Ê/ô «Êèí-äçà-äçà»)
Ïóñòü äàí òåêñò T (n = |T|), è äëÿ íåãî ïîñòðîåíî äåðåâî
ñóôôèêñîâ. Ïðåäïîëîæèì, ÷òî â ýòîì äåðåâå ñóôôèêñîâ
äóãè, âûõîäÿùèå èç êàæäîé âíóòðåííåé âåðøèíû è èç êîð-
íÿ, ëåêñè÷åñêè óïîðÿäî÷åíû, ò. å. äóãà (v,u) ëåêñè÷åñêè
ìåíüøå äóãè (v,w), åñëè ïåðâûé ñèìâîë äóãè (v,u) ëåêñè÷åñ-
êè ìåíüøå ïåðâîãî ñèìâîëà (v,w). Òîãäà ïðè îáõîäå â ãëóáè-
3.4. Ñóôôèêñíûå ìàññèâû 137

íó òàêîãî äåðåâà (ìîäèôèêàöèÿ ïðîöåäóðû Print èç óïðàæ-


íåíèÿ 2 ê ï. 3.1) è âûïèñûâàíèè ñóôôèêñîâ â ìàññèâå (íà-
ïðèìåð, ArSuf) ìû ïîëó÷èì n ëåêñè÷åñêè óïîðÿäî÷åííûõ
ñóôôèêñîâ T (òî÷íåå, èõ íîìåðîâ). Äåðåâî ñóôôèêñîâ ñòðî-
èòñÿ çà âðåìÿ O(n); îáõîä â ãëóáèíó òàêæå òðåáóåò âðåìå-
íè O(n). Òàêèì îáðàçîì, è ñóôôèêñíûé ìàññèâ ìû òîæå ïî-
ëó÷àåì çà âðåìÿ O(n).
Ïðèìåð
Äëÿ ñòðîê èç òàáë. 3.5 ìàññèâû ñóôôèêñîâ ArSuf ïðèâå-
äåíû â òàáë. 3.6.

Òàáëèöà 3.5

Íîìåð
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ïîçèöèè
T a b a a b a b a a b a a b
T b a c b a b a b a a b c b a b a

Òàáëèöà 3.6

Íîìåð
Íîìåð Íîìåð
ýëåìåíòà
ñóô- Ñóôôèêñ ñóô- Ñóôôèêñ
ìàññèâà
ôèêñà ôèêñà
ArSuf
1 11 aab 16 a
2 8 aabaab 9 aabcbaba
3 3 aababaabaab 14 aba
4 12 ab 7 abaabcbaba
5 9 abaab 5 ababaabcbaba
6 6 abaabaab 10 abcbaba
7 1 abaababaabaab 2 acbababaabcbaba
8 4 ababaabaab 15 ba
9 13 b 8 baabcbaba
10 10 baab 13 baba
11 7 baabaab 6 babaabcbaba
12 2 baababaabaab 4 bababaabcbaba
13 5 babaabaab 1 bacbababaabcbaba
14 11 bcbaba
15 12 cbaba
16 3 cbababaabcbaba
138 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Äëÿ âòîðîé ñòðîêè â òàáë. 3.5 äåðåâî ñóôôèêñîâ ïîêàçà-


íî íà ðèñ. 3.15 (íåêîòîðûå ìåòêè äóã, â ñèëó èõ î÷åâèäíîñ-
òè, íà ýòîì ðèñóíêå íå ïðèâåäåíû).

Ðèñ. 3.15. Äåðåâî ñóôôèêñîâ äëÿ ñòðîêè bacbababaabcbaba

Ïóòü îò êîðíÿ äåðåâà äî ëèñòà îïðåäåëÿåò ñóôôèêñ


(ñêëåéêîé ìåòîê äóã).
Èòàê, ïðè îáõîäå â ãëóáèíó äóãè, âûõîäÿùèå èç êàæäîé
âíóòðåííåé âåðøèíû, ïðîñìàòðèâàþòñÿ â ëåêñè÷åñêîì ïî-
ðÿäêå. Ñëåäîâàòåëüíî, è ëèñòüÿ (à îíè ñîîòâåòñòâóþò ñóô-
ôèêñàì) òàêæå ïðîõîäÿòñÿ â ñîîòâåòñòâèè ñ ýòèì æå îòíîøå-
íèåì ïîðÿäêà. Ìàññèâ ArSuf — ýòî íå ÷òî èíîå, êàê óïîðÿäî-
÷åííûå (ëåêñè÷åñêè) íîìåðà ñóôôèêñîâ T. Åñòåñòâåííî, ÷òî
òåðìèíàëüíûé ñèìâîë $, åñëè ìû âûïèñûâàåì íå òîëüêî íî-
ìåðà, íî è ñàìè ñóôôèêñû ïóòåì ñêëåéêè ìåòîê äóã, ñëåäóåò
èñêëþ÷èòü èç îïåðàöèè.
Ïðè íàëè÷èè ìàññèâà ArSuf çàäà÷à ïîèñêà âõîæäåíèÿ
îáðàçöà P â òåêñò T ðåøàåòñÿ ïóòåì èñïîëüçîâàíèÿ êëàññè-
÷åñêîãî àëãîðèòìà äâîè÷íîãî (áèíàðíîãî) ïîèñêà. Äåéñòâè-
òåëüíî, ïðè âõîæäåíèè P â T âñå íà÷àëüíûå ïîçèöèè â ìàñ-
ñèâå ðàñïîëîæåíû ïîñëåäîâàòåëüíî, íà÷èíàÿ ñ êàêîãî-òî
ìåñòà, è ýòîò ôàêò ÿâëÿåòñÿ îñíîâàíèåì äëÿ èñïîëüçîâàíèÿ
ëîãèêè äâîè÷íîãî ïîèñêà.
Ðàññìîòðèì òðè âàðèàíòà ýòîãî àëãîðèòìà. Ïåðâûå
äâà èìåþò âðåìåííóþ îöåíêó O(m · log2n), à òðåòèé —
O(m + log2n).
3.4. Ñóôôèêñíûå ìàññèâû 139

Ïåðâûé àëãîðèòì íà÷íåì ðàññìàòðèâàòü ñ ïðèìåðà.


Ïðèìåð
Ïóñòü T — ýòî âòîðàÿ ñòðîêà èç òàáë. 3.5, è òðåáóåòñÿ
íàéòè P = baba. Âèäèì (ñì. òàáë. 3.6), ÷òî â 10-ì, 11-ì è 12-ì
ýëåìåíòàõ ìàññèâà ArSuf óêàçàíû íîìåðà ñóôôèêñîâ, íà÷è-
íàþùèõñÿ ñ P. Ïðè ýòîì èìååò ìåñòî òðè âõîæäåíèÿ P â T.
Íàïîìíèì ëîãèêó äâîè÷íîãî ïîèñêà.
Function PSearch(P:String):Integer;
Var m,j,l,r,q:Integer;
w:String;
Begin
m:=Length(P);
j:=0;
l:=1;
r:=n;
Repeat
q:=(l+r) Div 2;
w:=Copy(ArSuf[q],1,m);
If P=w Then j:=q
Else If P>w Then l:=q Else r:=q;
Until (l=r) Or (j<>0);
PSearch:=j;
End;
Äàííàÿ ôóíêöèÿ âîçâðàùàåò íîìåð ýëåìåíòà ìàññèâà
ArSuf, â êîòîðîì óêàçàíî íà÷àëî ñóôôèêñà T, ñîäåðæàùåãî
P â êà÷åñòâå ñâîåãî ïðåôèêñà. Îíà îáåñïå÷èâàåò íàõîæäåíèå
åäèíñòâåííîãî âõîæäåíèÿ P â T (åñëè îíî åñòü). Äëÿ ïîèñêà
âñåõ âõîæäåíèé P â T íåîáõîäèìî ïðîàíàëèçèðîâàòü ñîñåä-
íèå ñóôôèêñû T.
Îöåíêà âðåìåíè ïîèñêà çäåñü î÷åâèäíà: ýòî O(m · log2n)
(ñ÷èòàåì, ÷òî îñóùåñòâëÿåòñÿ ïîñèìâîëüíîå ñðàâíåíèå P è
ïðåôèêñà ñóôôèêñà, îïðåäåëÿåìîãî ýëåìåíòîì ArSuf[t], à
íå ñðàâíåíèå ñòðîê, êàê ïðèâåäåíî â ôóíêöèè PSearch).
Âòîðîé àëãîðèòì. Îñîáåííîñòü ôóíêöèè PSearch — â
òîì, ÷òî íà êàæäîé èòåðàöèè ïîèñêà P ñðàâíèâàåòñÿ ñ ïðå-
ôèêñîì î÷åðåäíîãî ñóôôèêñà, íà÷èíàÿ ñ ïåðâîãî ñèìâîëà.
Íî ñóôôèêñíûé ìàññèâ òàêîâ, ÷òî â íåì ðÿäîì ðàñïîëîæå-
íû ñóôôèêñû, èìåþùèå íàèáîëüøèå ïî äëèíå ñîâïàäàþ-
ùèå ïðåôèêñû. Ìîæíî ëè èñïîëüçîâàòü ýòîò ôàêò è òåì ñà-
ìûì èñêëþ÷èòü ÿâíóþ èçáûòî÷íîñòü (ïî êîëè÷åñòâó ñðàâ-
íåíèé ñèìâîëîâ) ôóíêöèè PSearch? Ïóñòü l è r îïðåäåëÿþò
140 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

ãðàíèöû ïîèñêà íà î÷åðåäíîé èòåðàöèè, à çíà÷åíèÿ ll è lr


îïðåäåëÿþò äëèíû îáùèõ ïðåôèêñîâ: â ïåðâîì ñëó÷àå —
äëÿ ñóôôèêñà ñ íà÷àëüíîé ïîçèöèåé ArSuf[l] è P, à âî âòî-
ðîì — ArSuf[r] è P. Åñëè ÷åðåç lt îïðåäåëèòü min(ll,lr), òî â
èíòåðâàëå îò l äî r âñå ñóôôèêñû T èìåþò ïðåôèêñû äëèíîé
lt, ñîâïàäàþùèå ñ ïðåôèêñîì ýòîé æå äëèíû P è ìåæäó ñî-
áîé. Ïîëó÷àåòñÿ, ÷òî ñðàâíåíèå ñèìâîëîâ ìîæíî îñóùåñòâ-
ëÿòü íå ñ ïåðâîãî ñèìâîëà, à ñ ñèìâîëà ñ íîìåðîì lt + 1. È
åñëè çíà÷åíèÿ ll è lr êîððåêòèðîâàòü âìåñòå ñî çíà÷åíèÿìè l
è r, òî ìû óìåíüøàåì êîëè÷åñòâî ñðàâíåíèé (ÿâíî íåíóæ-
íûõ) ñèìâîëîâ â ôóíêöèè PSearch.
Ìîäèôèöèðîâàííûé âàðèàíò ôóíêöèè PSearch òîãäà
èìååò âèä:
Function PMSearch(P:String):Integer;
Var m,j,l,r,q:Integer;
ll, lr, lq, lt:Integer;
Begin
m:=Length(P);
j:=0;
l:=1;
r:=n;
<âû÷èñëåíèå ll è lr ïóòåì ñðàâíåíèÿ P
ñ ñóôôèêñàìè ArSuf[1] è ArSuf[r]>;
Repeat
q:=(l+r) Div 2;
lt:=Min(ll,lr);
{Ôóíêöèÿ Min âû÷èñëÿåò ìèíèìàëüíîå èç äâóõ ÷èñåë}
lq:=<çíà÷åíèå äëèíû ñîâïàäàþùåé ÷àñòè
P[lt+1..m] è T[ArSur[q]+lt..n]>;
lt:=lt+lq;
If lt=m Then j:=q
Else If P[lt+1]>T[ArSuf[q]+lt] Then Begin
l:=q;
ll:=lt;
End
Else Begin
r:=q;
lr:=lt;
End;
Until (l=r) Or (j<>0);
PMSearch:=j;
End;
3.4. Ñóôôèêñíûå ìàññèâû 141

Ïðèìåð
Ïóñòü äàí òåêñò T = abaaaabaaaabaaba. Ìàññèâ ñóô-
ôèêñîâ ArSuf äëÿ T ïðåäñòàâëåí â òàáë. 3.7.

Òàáëèöà 3.7

Íîìåð ýëåìåíòà
Íîìåð ñóôôèêñà Ñóôôèêñ
ìàññèâà ArSuf
1 16 a
2 3 aaaabaaaabaaba
3 8 aaaabaaba
4 9 aaabaaba
5 4 aaabaaaabaaba
6 13 aaba
7 5 aabaaaabaaba
8 10 aabaaba
9 14 aba
10 1 abaaaabaaaabaaba
11 6 abaaaabaaba
12 11 abaaba
13 15 ba
14 2 baaaabaaaabaaba
15 7 baaaabaaba
16 12 baaba

Ëîãèêà ïîèñêà P «ñ ïðèâÿçêîé» ê ïåðåìåííûì ôóíêöèè


PMSearch ïðèâåäåíà â òàáë. 3.8.

Òàáëèöà 3.8

l r ll lr q lt lq lt Ñðàâíåíèå
P = aaaba 1 16 1 0 8 0 2 2 P[3] < T[15]
1 8 1 2 4 1 3 4 Ýëåìåíò íàéäåí
P = aabaa 1 16 1 0 8 0 4 4 P[5] < T[17]
1 8 1 4 4 1 1 2 P[3] > T[11]
4 8 2 4 6 2 3 5 Ýëåìåíò íàéäåí
142 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Ïóñòü P = aaaba. Íà ïåðâîé èòåðàöèè P ñðàâíèâàåòñÿ ñ


ñóôôèêñîì, íàõîäÿùèìñÿ íà âîñüìîì ìåñòå â ìàññèâå
ArSuf. Íà÷àëüíîå çíà÷åíèå êîëè÷åñòâà ñîâïàäàþùèõ ñèì-
âîëîâ (lt) ðàâíî íóëþ, êîíå÷íîå — äâóì (íîâîå çíà÷åíèå lt).
Òàê êàê P[3] ìåíüøå T[15], òî èçìåíÿåì âåðõíþþ ãðàíèöó
ïîèñêà (r) è çíà÷åíèå lr. Ñðàâíåíèå P ñ ñóôôèêñîì, îïðåäå-
ëÿåìûì ÷åòâåðòûì ýëåìåíòîì ArSuf, íà÷èíàåòñÿ ñî âòîðîãî
ýëåìåíòà P (ýòîò ýëåìåíò ïîâòîðíî ó÷àñòâóåò â ñðàâíåíè-
ÿõ, — îí ñðàâíèâàëñÿ è íà ïåðâîé èòåðàöèè). Ñîâïàëî òðè
ñèìâîëà. Îáðàçåö èñ÷åðïàí è íàéäåíî åãî âõîæäåíèå â T.
Ïóñòü òåïåðü P = aabaa. Íà âòîðîé èòåðàöèè (ñì.
òàáë. 3.8) âòîðîé ñèìâîë P âíîâü ó÷àñòâóåò â ñðàâíåíèÿõ.
Çíà÷åíèå P[3] áîëüøå T[11] — èçìåíÿåòñÿ íèæíÿÿ ãðàíèöà
ïîèñêà è çíà÷åíèå ll. Íà òðåòüåé èòåðàöèè ñðàâíåíèÿ íà÷è-
íàþòñÿ ñ òðåòüåãî ñèìâîëà P. Ïðîèçîøëî òðè ñîâïàäåíèÿ, è
îáðàçåö P íàéäåí.
Àíàëèçèðóÿ ôóíêöèþ PMSearch, ìû âèäèì, ÷òî ÷àñòü
èçáûòî÷íûõ ñðàâíåíèé â íåé èñêëþ÷åíà, íî âðåìåííàÿ îöåí-
êà îñòàåòñÿ ïðåæíåé — O(m · log2n). Ìîæíî ëè ñâåñòè åå ê
O(m + log2n)? Ýòî îçíà÷àëî áû, ÷òî íà âñåõ èòåðàöèÿõ äâîè÷-
íîãî ïîèñêà êîëè÷åñòâî ñðàâíåíèé ñèìâîëîâ (ñóììàðíîå)
èìååò òàêîé ïîðÿäîê, èëè, äðóãèìè ñëîâàìè, êîëè÷åñòâî èç-
áûòî÷íûõ ñðàâíåíèé ïî îòíîøåíèþ ê äëèíå P ðàâíî log2n.
Èç âñåãî ïðåäøåñòâóþùåãî èçëîæåíèÿ ÿñíî, ÷òî åñëè
ýòî âîçìîæíî, òî òîëüêî çà ñ÷åò ââåäåíèÿ äîïîëíèòåëüíûõ
ñòðóêòóð äàííûõ, îïèñûâàþùèõ êàêîé-òî àñïåêò (îñîáåí-
íîñòü) çàäà÷è è ôîðìèðóåìûõ íà ïðåäâàðèòåëüíîé ñòàäèè
îáðàáîòêè. Äðóãîãî íàì íå äàíî, è ýòî î÷åðåäíîé ðàç ïîä-
òâåðæäàåò òåçèñ Í. Âèðòà: ïðîãðàììà (ìåòîä îáðàáîòêè)
åñòü ñèíòåç äàííûõ è óïðàâëåíèÿ!
Òðåòèé àëãîðèòì. Ðàññìîòðèì áîëåå ïîäðîáíî ñõåìó
äâîè÷íîãî ïîèñêà è ïîïûòàåìñÿ èñïîëüçîâàòü èäåþ èñêëþ-
÷åíèÿ ëèøíèõ ñðàâíåíèé, çàëîæåííóþ â ôóíêöèè
PMSearch. Íà÷íåì îïÿòü-òàêè ñ ïðèìåðà.
Ïðèìåð
Âî âòîðîé ñòðîêå òàáë. 3.5 áûëà ïðèâåäåíà ñòðîêà
T = bacbababaabcbaba. Ìàññèâ ñóôôèêñîâ äëÿ íåå áûë
ïðèâåäåí â òàáë. 3.6, à äåðåâî ñóôôèêñîâ (áåç ñóôôèêñíûõ
ñâÿçåé) ïîêàçàíî íà ðèñ. 3.15. Ðàññìîòðèì âîçìîæíûå çíà-
÷åíèÿ l è r — ãðàíèö èíòåðâàëà â ñõåìå äâîè÷íîãî ïîèñêà
(îíè ïðèâåäåíû íà ðèñ. 3.16 â êðóãëûõ ñêîáêàõ ó êàæäîé
âåðøèíû äåðåâà).
3.4. Ñóôôèêñíûå ìàññèâû

Ðèñ. 3.16. Èíòåðâàëû ñõåìû äâîè÷íîãî ïîèñêà


143
144 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Êîëè÷åñòâî âîçìîæíûõ ãðàíèö èíòåðâàëîâ ïîèñêà ðàâ-


íî êîëè÷åñòâó âåðøèí äåðåâà, ò. å. 2n – 1. Âèäèì, ÷òî íå-
êóþ õàðàêòåðèñòèêó (ïàðàìåòð), ñâÿçàííóþ ñî ñõåìîé äâî-
è÷íîãî ïîèñêà, ìîæíî íà ñòàäèè ïðåäâàðèòåëüíîé îáðàáîò-
êè âû÷èñëèòü çà âðåìÿ O(n). Ýòîé õàðàêòåðèñòèêîé ìîæåò
áûòü lcp[l, r] — äëèíà íàèáîëüøåãî îáùåãî ïðåôèêñà
(longest common prefix) ñóôôèêñîâ, îïðåäåëåííûõ ïîçèöè-
ÿìè l è r ìàññèâà ArSuf. Òàê, â íàøåì ïðèìåðå
ArSuf[10] = 13, à ArSuf[12] = 4, è lcp[10,12] = 4 (ñóôôèê-
ñû baba è bababaabcbaba). Íà ðèñ. 3.16 çíà÷åíèå lcp äëÿ
âñåõ ãðàíèö ïîèñêà óêàçàíî â êâàäðàòíûõ ñêîáêàõ ó âåðøèí
äåðåâà.
Ïðåäïîëîæèì, ÷òî çíà÷åíèÿ lcp âû÷èñëåíû íà ñòàäèè
ïðåäâàðèòåëüíîé îáðàáîòêè. ×òî îíè ìîãóò äàòü â ïðîöåññå
ïîèñêà? (Ìû, êîíå÷íî æå, â ðàññóæäåíèÿõ îòòàëêèâàåìñÿ
îò ôóíêöèè PMSearch.)
Åñëè íà êàêîé-òî èòåðàöèè äëèíû ñîâïàäàþùèõ ïðå-
ôèêñîâ P, ArSuf[l] (ll) è P, ArSuf[r] (lr) ñîâïàäàþò (ll = lr),
òî ïðåôèêñû òàêîé äëèíû âñåõ ñóôôèêñîâ èç ýòîãî èíòåðâà-
ëà ðàâíû ïðåôèêñó P, è ñðàâíåíèå ñëåäóåò íà÷àòü ñ ñèìâîëà
ll + 1 = lr + 1.
Çíà÷åíèå q = (l + r) Div 2, è èçâåñòíî çíà÷åíèå
lcp[l, q] — ýòî äëèíà íàèáîëüøåãî îáùåãî ïðåôèêñà ñóôôèê-
ñîâ, ïðåäñòàâëåííûõ â ïîçèöèÿõ l è q ìàññèâà ArSuf.
Åñëè lcp[l, q] > ll (îáùèé ïðåôèêñ ñóôôèêñîâ ArSuf[l] è
ArSuf[q] äëèííåå, ÷åì îáùèé ïðåôèêñ Ð è ArSuf[l]), òî ñèì-
âîë ll + 1 îáðàçöà Ð ëåêñè÷åñêè áîëüøå ñèìâîëà ll + 1 ó ñóô-
ôèêñîâ ArSuf[l] è ArSuf[q] (îí ó íèõ îäèí è òîò æå). Ýòà ñè-
òóàöèÿ ïîêàçàíà íà ðèñ. 3.17: (à) — äëÿ ll > lr; (á) — äëÿ
ll < lr.  äàííîì ñëó÷àå íà ëþáîé èòåðàöèè äâîè÷íîãî ïîèñ-
êà ïðîâåðîê Ð íå òðåáóåòñÿ, l çàìåíÿåòñÿ íà q, à ll è lr îñòà-
þòñÿ íåèçìåííûìè — âõîæäåíèÿ Ð â Ò äîëæíû íàõîäèòüñÿ
ñïðàâà îò ïîçèöèè q â ArSuf.
Âûïîëíåíèå íåðàâåíñòâà lcp[l, q] < ll ãîâîðèò î òîì, ÷òî
îáùèé ïðåôèêñ ñóôôèêñà ArSuf[l] è Ð áîëüøå (äëèííåå) îá-
ùåãî ïðåôèêñà ñóôôèêñîâ ArSuf[l] è ArSuf[q]. Ñëåäîâà-
òåëüíî, ñèìâîë lcp[l, q] + 1 ó Ð è ñóôôèêñà ArSuf[l] îäèí è
òîò æå, è îí ëåêñè÷åñêè ìåíüøå, ÷åì ó ñóôôèêñà ArSuf[q],
ïîýòîìó âõîæäåíèÿ Ð â Ò ïðè èõ ñóùåñòâîâàíèè âîçìîæíû
òîëüêî â ñóôôèêñû, ïðåäñòàâëåííûå äî ïîçèöèè q â ArSuf.
Ïðè âîçíèêíîâåíèè òàêîé ñèòóàöèè íèêàêèõ ïðîâåðîê Ð íå
3.4. Ñóôôèêñíûå ìàññèâû 145

Ðèñ. 3.17. Ïîèñê P â T — ñëó÷àé, êîãäà lcp[l,q] > ll

òðåáóåòñÿ, lr çàìåíÿåòñÿ íà lcp[l, q], à r çàìåíÿåòñÿ íà q


(ðèñ. 3.18).

Ðèñ. 3.18. Ïîèñê P â T — ñëó÷àé, êîãäà lcp[l,q] < ll

Ïðèìå÷àíèå. Âàðèàíò lr > ll ïðè lcp[l, q] < ll ñòàíîâèò-


ñÿ íåâîçìîæíûì.
Âûïîëíåíèå ðàâåíñòâà lcp[l, q] = ll — ýòî ñëó÷àé, êîãäà
ïðåôèêñû âñåõ ñóôôèêñîâ (äëèíîé ll) â èíòåðâàëå îò l äî q
ñîâïàäàþò ñ ïðåôèêñîì P. Íåîáõîäèìî ñðàâíèâàòü Ð ñ ñóô-
ôèêñîì ArSuf[q] íà÷èíàÿ ñ ïîçèöèè ll + 1 è ïî ðåçóëüòàòàì
ñðàâíåíèÿ èçìåíÿòü l èëè r ñ ñîîòâåòñòâóþùèì èçìåíåíèåì
ll è lr (ðèñ. 3.19).

Ðèñ. 3.19. Ïîèñê P â T — ñëó÷àé, êîãäà lcp[l,q] = ll

Ðåàëèçàöèÿ äàííîé ëîãèêè ïðèâîäèò ê àëãîðèòìó ñ âðå-


ìåííîé îöåíêîé O(m + log2n).
146 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Äåéñòâèòåëüíî, íà êàæäîé èòåðàöèè äâîè÷íîãî ïîèñêà


ó íàñ èëè íå ïðîâåðÿåòñÿ íè îäíîãî ñèìâîëà, à èçìåíÿþòñÿ
òîëüêî ãðàíèöû ïîèñêà, èëè èòåðàöèÿ çàêàí÷èâàåòñÿ ïåð-
âûì íåñîâïàäåíèåì, à ñðàâíåíèÿ íà÷èíàþòñÿ ñ ñèìâîëà
max(ll, lr), ñîâïàäàåò íåêîòîðîå êîëè÷åñòâî ñèìâîëîâ w – 1
è íà ñèìâîëå ñ íîìåðîì w ïðîèñõîäèò íåñîâïàäåíèå. Òîãäà
íà çíà÷åíèå w–1 â êîíöå èòåðàöèè óâåëè÷èâàåòñÿ èëè âåëè-
÷èíà ll, èëè lr, à ñëåäóþùàÿ èòåðàöèÿ íà÷èíàåòñÿ ñ ñèìâîëà
ñ íîìåðîì w. Òàêèì îáðàçîì, íà êàæäîé èòåðàöèè äåëàåòñÿ
íå áîëåå îäíîãî èçáûòî÷íîãî ñðàâíåíèÿ, ò. å. âñåãî log2n
ñðàâíåíèé, à êîëè÷åñòâî ñîâïàäåíèé (óñïåøíûõ ñðàâíåíèé)
íå ïðåâîñõîäèò m.
Îäíàêî ó íàñ îñòàëñÿ îòêðûòûì âîïðîñ î âû÷èñëåíèè
çíà÷åíèé ýëåìåíòîâ ìàññèâà lcp, âûïîëíÿåìîì íà ñòàäèè
ïðåäâàðèòåëüíîé îáðàáîòêè ïðè ñîçäàíèè ìàññèâà ñóôôèê-
ñîâ ArSuf.
Íà ðèñ. 3.16 áûëî ïîêàçàíî ïîëíîå äâîè÷íîå äåðåâî ñ n
ëèñòüÿìè (ëèñòüÿ èìåþò ìåòêè (i, i + 1), à îäèí ëèñò — ìåò-
êó (1,1) ) äëÿ ñòðîêè T = bacbababaabcbaba (âòîðàÿ ñòðîêà
òàáë. 3.5), çàäàþùåå âñå âîçìîæíûå èíòåðâàëû (l, r) ïðè
äâîè÷íîì ïîèñêå. Äåðåâî ñóôôèêñîâ æå áûëî ïðèâåäåíî íà
ðèñ. 3.15. Ïðè îáõîäå â ãëóáèíó äåðåâà ñóôôèêñîâ ìåæäó
ïðîñìîòðàìè âåðøèí-ëèñòüåâ, ñîîòâåòñòâóþùèõ ñóôôèê-
ñàì ArSuf[i] è ArSuf[i + 1], ïîñåùàþòñÿ íåêîòîðûå âíóò-
ðåííèå âåðøèíû. Áëèæàéøàÿ èç íèõ ê êîðíþ îïðåäåëÿåò
çíà÷åíèå lcp[i, i + 1]; òî÷íåå, äëèíà ïîäñòðîêè, ïîëó÷àþùà-
ÿñÿ ïóòåì ñêëåéêè ìåòîê äóã îò êîðíÿ äî íåå (ñòðîêîâàÿ ãëó-
áèíà âåðøèíû), ðàâíà lcp[i, i + 1]. Ñòðîêîâàÿ ãëóáèíà âåð-
øèíû êàê åå ïàðàìåòð ôîðìèðóåòñÿ ïðè ñîçäàíèè äåðåâà
ñóôôèêñîâ, òîãäà ïðè ïîëó÷åíèè ArSuf îïðåäåëÿþòñÿ è
çíà÷åíèÿ lcp[i, i + 1], ÷òî òðåáóåò âðåìåíè O(n).
Äëÿ âû÷èñëåíèÿ îñòàâøèõñÿ çíà÷åíèé lcp[i, j] çàìåòèì,
÷òî lcp[i, i + 2] ðàâíî ìèíèìóìó èç lcp[i, i + 1] è
lcp[i + 1, i + 2]. Ïðîäîëæàÿ ðàññóæäåíèÿ, îïðåäåëÿåì, ÷òî
lcp[i, j] = min{lcp[k, k + 1]: i „ k < j}. Åñëè ïîëíîå äâîè÷íîå
äåðåâî îáõîäèòü ïî ïðèíöèïó «ëåâûé ñûí, ïðàâûé ñûí, à çà-
òåì îòåö ñûíîâåé» è íà âûõîäå èç ðåêóðñèâíîãî îáõîäà ñðàâ-
íèâàòü çíà÷åíèÿ lcp ñûíîâåé, òî âðåìÿ ôîðìèðîâàíèÿ
lcp[i, j] ïðîïîðöèîíàëüíî êîëè÷åñòâó âåðøèí äåðåâà, ò. å.
O(n).
3.5. Àëãîðèòì À. Àõî – Ì. Êîðàñèê 147

@ Óïðàæíåíèÿ
1. Íàïèøèòå ïðîöåäóðó ôîðìèðîâàíèÿ ñóôôèêñíîãî ìàñ-
ñèâà èç äåðåâà ñóôôèêñîâ.
2. Ñ ïîìîùüþ ôóíêöèè PSearch îáåñïå÷èâàåòñÿ íàõîæäå-
íèå åäèíñòâåííîãî âõîæäåíèÿ P â T. Ðàçðàáîòàéòå ëî-
ãèêó ïîèñêà âñåõ âõîæäåíèé P â T.
3. Ïðèâåäèòå ïðèìåð (çíà÷åíèÿ T è P), â êîòîðîì ôóíêöèÿ
PMSearch íå óìåíüøàåò êîëè÷åñòâà ñðàâíåíèé ñèì-
âîëîâ ïî îòíîøåíèþ ê ôóíêöèè PSearch.
4. Ïðèâåäèòå ïðèìåð äëÿ ñëó÷àÿ, êîãäà êîëè÷åñòâî íåñîâ-
ïàäåíèé â àëãîðèòìå (âòîðîì) â òî÷íîñòè ðàâíî log2n.
5. Íàéäèòå ñïîñîá õðàíåíèÿ çíà÷åíèé lcp â îäíîìåðíîì
ìàññèâå.
6. Ïðèâåäèòå ïðèìåð ñòðîêè. Âû÷èñëèòå äëÿ íåå ìàññèâû
ArSuf è lcp.
7. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ òðåòüåãî àëãî-
ðèòìà ïîèñêà P â T.

3.5. Àëãîðèòì À. Àõî – Ì. Êîðàñèê


Ïðåäñòàâëÿåøü, â÷åðà õîäèë â ëåñ è ó
ïîëÿíû âñòðåòèë îãðîìíóþ òîëïó
äåðåâüåâ-ñâåðñòíèêîâ. Çîðèê, 4 êëàññ.
Ì. Äûìîâ «Äåòè ïèøóò Áîãó»

Ïóñòü â òåêñòå T (n = |T|) íàì íåîáõîäèìî íàéòè âñå âõîæ-


äåíèÿ íå îäíîãî îáðàçöà P, à íåñêîëüêèõ — P1, P2, …, Pt. Êî-
íå÷íî, òàêàÿ çàäà÷à ìîæåò áûòü ðåøåíà ïóòåì ïîñëåäîâà-
òåëüíîãî ïîèñêà îáðàçöîâ è, ñîîòâåòñòâåííî, èìåòü âðå-
ìåííóþ îöåíêó O(t · n + m). Îäíàêî À. Àõî è Ì. Êîðàñèê
ïðåäëîæèëè àëãîðèòì ñ âðåìåííîé îöåíêîé O(n + m + k),
ãäå k — ñóììàðíîå êîëè÷åñòâî âõîæäåíèé îáðàçöîâ Pi
(1 „ i „ t) â òåêñò T, à m — ñóììàðíàÿ äëèíà îáðàçöîâ.
Ââåäåì ïîíÿòèå «äåðåâî êëþ÷åé». Îíî îòëè÷àåòñÿ îò äå-
ðåâà ñóôôèêñîâ (ñì. ï. 3.1) òîëüêî òåì, ÷òî ìåòêàì äóã â íåì
ïðèïèñûâàþòñÿ íå çíà÷åíèÿ ïîäñòðîê, à îòäåëüíûå ñèìâî-
ëû. Äåðåâî êëþ÷åé ñòðîèòñÿ äëÿ âñåãî ìíîæåñòâà îáðàçöîâ,
ïðè÷åì ñâîéñòâî äåðåâà ñóôôèêñîâ — ÷òî ëþáûå äâå äóãè,
148 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

âûõîäÿùèå èç îäíîé è òîé æå âåðøèíû, èìåþò ðàçíûå ìåò-


êè, — â íåì ñîõðàíÿåòñÿ. Òîãäà êàæäîìó îáðàçöó Pi ñîîòâåò-
ñòâóåò òàêàÿ âåðøèíà äåðåâà êëþ÷åé, ÷òî ñêëåéêà ñèìâîëîâ
íà ïóòè èç êîðíÿ äåðåâà â ýòó âåðøèíó â òî÷íîñòè ñîñòàâëÿ-
åò Pi.
Ëîãèêà ïîñòðîåíèÿ äåðåâà êëþ÷åé äîñòàòî÷íî «ïðîçðà÷-
íà». Ìû íà÷èíàåì èç îäíîé âåðøèíû — êîðíÿ, à çàòåì îáðà-
áàòûâàåì îáðàçöû Pi îäèí çà äðóãèì: èäåì èç êîðíÿ ïî äó-
ãàì, îòìå÷åííûì ñèìâîëàìè èç Pi, äî òåõ ïîð, ïîêà ýòî âîç-
ìîæíî. Åñëè Pi çàêàí÷èâàåòñÿ â êàêîé-òî âåðøèíå v, òî ìû
ñîõðàíÿåì èäåíòèôèêàòîð Pi (íàïðèìåð, i) â v — íóìåðóåì
âåðøèíó.  ñëó÷àå æå, êîãäà äóãè, ïîìå÷åííîé î÷åðåäíûì
ñèìâîëîì Pi, íåò, ìû ñîçäàåì íîâûå äóãè è âåðøèíû äëÿ
âñåõ îñòàâøèõñÿ ñèìâîëîâ Pi. Ïðè âûáîðå äóãè èç âåðøèíû
çà êîíñòàíòíîå âðåìÿ ìû ïîëó÷àåì î÷åâèäíóþ îöåíêó —
O(m). Çà ýòî âðåìÿ äåðåâî êëþ÷åé áóäåò ïîñòðîåíî.

Ïðèìåð
Ïóñòü äàíî ìíîæåñòâî îáðàçöîâ: P1 = abcdccb,
P2 = bcdccb, P3 = dccb, P4 = bc, P5 = dc, P6 = cb. Äåðåâî
êëþ÷åé äëÿ Pi (i = 1, …, 6) ïîêàçàíî íà ðèñ. 3.20.

Ðèñ. 3.20. Ïðèìåð äåðåâà êëþ÷åé


3.5. Àëãîðèòì À. Àõî – Ì. Êîðàñèê 149

Òåìíûì ôîíîì íà ðèñ. 3.20 âûäåëåíû âåðøèíû v, ñîîò-


âåòñòâóþùèå îáðàçöàì ñ íîìåðîì i. Çíà÷åíèå i óêàçàíî ðÿ-
äîì ñ êàæäîé òàêîé âåðøèíîé â êâàäðàòíûõ ñêîáêàõ.
Íàïîìíèì, ÷òî àâòîìàò — ýòî ïÿòåðêà M = (A, Q, q0, E, F),
ãäå A — àëôàâèò (äëÿ ðàññìàòðèâàåìîãî ïðèìåðà ýòî {a, b,
c, d}); Q — ìíîæåñòâî ñîñòîÿíèé (âåðøèí äåðåâà êëþ÷åé);
q0 — íà÷àëüíîå ñîñòîÿíèå (êîðåíü äåðåâà); E — ìíîæåñòâî
êîíå÷íûõ ñîñòîÿíèé (âåðøèí äåðåâà ñ òåìíûì ôîíîì íà
ðèñ. 3.20, èëè âåðøèí äåðåâà, èìåþùèõ ìåòêè â âèäå íîìå-
ðà îáðàçöà), F — ôóíêöèÿ ïåðåõîäîâ. ×àñòè÷íî ôóíêöèÿ ïå-
ðåõîäîâ F: A · Q ® Q îïðåäåëåíà ïðè ïîñòðîåíèè äåðåâà
êëþ÷åé: åñëè àâòîìàò ïðè îáðàáîòêå íåêîòîðîãî ñèìâîëà
òåêñòà T[i] íàõîäèòñÿ â ñîñòîÿíèè q è T[i] ñîâïàäàåò ñ ñèìâî-
ëîì îáðàçöà, òî íîâîå ñîñòîÿíèå î÷åâèäíî — ýòî ïåðåõîä ïî
äåðåâó êëþ÷åé. ×òîáû ðàáîòàëà ñòàíäàðòíàÿ ëîãèêà àâòîìà-
òà ñ ëèíåéíîé âðåìåííîé îöåíêîé, òðåáóåòñÿ ñäåëàòü, êàê
ìèíèìóì (îïÿòü æå çà ëèíåéíîå âðåìÿ íà ñòàäèè ïðåäâàðè-
òåëüíîé îáðàáîòêè), äâå âåùè (îòâåòèòü íà äâà âîïðîñà).
Procedure Search;
Var i,q:Integer;
Begin
n:=Length(T);
q:=0;
For i:=1 To n Do Begin
q:=F[q,T[i]];
If qÎE Then <âûâåñòè âñå îáðàçöû Pt, ñâÿçàííûå
ñ ñîñòîÿíèåì q; íà÷àëî èõ âõîæäåíèÿ
îïðåäåëÿåòñÿ êàê i–Length(Pt)+1>
{Èíäåêñ t ïðèíèìàåò çíà÷åíèå èç íåêîòîðîãî
ïîäìíîæåñòâà ìíîæåñòâà íîìåðîâ îáðàçöîâ}
End;
End;
Ïåðâûé âîïðîñ çàêëþ÷àåòñÿ â îïðåäåëåíèè ñîñòîÿíèÿ
àâòîìàòà, â êîòîðîå ñëåäóåò ïåðåõîäèòü ïðè íåñîâïàäåíèè
ñèìâîëîâ. Áóäåì ðàññóæäàòü ïî àíàëîãèè ñ ïîíÿòèåì ñóô-
ôèêñíîé ñâÿçè (ñì. ï. 3.2). Êàæäîé âåðøèíå v (ñîñòîÿíèþ)
äåðåâà êëþ÷åé ñîîòâåòñòâóåò ïðåôèêñ (ïóòåì êîíêàòåíàöèè
ìåòîê äóã îò êîðíÿ) íåêîåãî îáðàçöà; ïóñòü ýòî Pa[1..j]. Ñëå-
äóåò íàéòè òàêóþ âåðøèíó äåðåâà w (èëè îáðàçåö Pb), ÷òî
ïðåôèêñ Pb[1..k] ñîâïàäàåò ñ ñàìûì äëèííûì ñóôôèêñîì
150 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

Pa[1..j]. Äðóãèìè ñëîâàìè, òðåáóåòñÿ íàéòè ñàìûé äëèííûé


ñóôôèêñ Pa[1..j], ñîâïàäàþùèé ñ ïðåôèêñîì êàêîãî-òî îá-
ðàçöà (ò. å. ìû äåëàåì îáîáùåíèå ïîíÿòèÿ ãðàíåé ñòðîêè).
 ñèëó ñâîéñòâ äåðåâà êëþ÷åé — âñå äóãè, âûõîäÿùèå èç
âåðøèí, èìåþò ðàçëè÷íûå çíà÷åíèÿ ìåòîê, — òàêàÿ âåð-
øèíà (ïðåôèêñ) — åäèíñòâåííàÿ (åñëè îíà ñóùåñòâóåò) è,
ñîîòâåòñòâåííî, òàêàÿ ñâÿçü v ® w. ×òî äàåò ýòà ñâÿçü è êàê
åå ñòðîèòü?
Ïóñòü ìû íàõîäèëèñü â ñîñòîÿíèè v, è ïðîèçîøëî íåñîâ-
ïàäåíèå ñèìâîëà T[i] ñ î÷åðåäíûì ñèìâîëîì êàêîãî-òî îá-
ðàçöà. Àâòîìàò îñóùåñòâëÿåò ïåðåõîä v ® w. Çíà÷åíèå i
îñòàåòñÿ ïðåæíèì (íåò âîçâðàòà íàçàä ïî òåêñòó T, ÷òî ÿâëÿ-
åòñÿ íåîáõîäèìûì óñëîâèåì ïîëó÷åíèÿ ëèíåéíîãî ïî âðå-
ìåíè àëãîðèòìà), è íåò íåîáõîäèìîñòè ñðàâíèâàòü ñèìâîëû
íà ïóòè îò êîðíÿ äî âåðøèíû w. Íà÷àëî âõîæäåíèÿ îáðàçöà
â òåêñò ïåðåñ÷èòûâàåòñÿ ïðè v ® w î÷åâèäíûì îáðàçîì —
ïî çíà÷åíèþ i, äëèíå ïðåôèêñà è èçâåñòíîìó äî ïåðåõîäà íà-
÷àëó âõîæäåíèÿ.
Íà ðèñ. 3.21 ïðåäñòàâëåíà äèàãðàììà ïåðåõîäîâ àâòîìà-
òà äëÿ ðàññìàòðèâàåìîãî ïðèìåðà, à â òàáë. 3.9 — ôóíêöèÿ
ïåðåõîäîâ F. Ñêàæåì, åñëè ìû íàõîäèìñÿ â ñîñòîÿíèè 12,
i = 18 è ïðåôèêñ bcdcc âõîäèò â òåêñò ñ 13-é ïîçèöèè, òî íà-
÷àëî âõîæäåíèÿ dcc îïðåäåëÿåòñÿ êàê 18 – 3 = 15.

Òàáëèöà 3.9

F 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
a 1 0 8 9 10 11 12 13 0 18 14 15 16 17 0 18 18 19 0 8
b 8 2 8 9 10 11 7 13 0 18 14 15 13 17 0 18 17 19 19 8
c 18 0 3 9 5 6 12 13 9 18 11 12 16 17 15 16 18 19 0 8
d 14 0 8 4 10 11 12 13 0 10 14 15 16 17 0 18 18 19 0 8

Ìåòîä îïðåäåëåíèÿ ïóíêòèðíûõ ñâÿçåé (ðèñ. 3.21) çà


ëèíåéíîå âðåìÿ èçâåñòåí íàì ïî òåìå «äåðåâüÿ ñóôôèêñîâ».
Íàïîìíèì åãî (ðèñ. 3.22). Ïóñòü ìû íàõîäèìñÿ â âåðøèíå v.
Òîãäà ìû èäåì ê îòöó ýòîé âåðøèíû v¢ (äóãà ìåæäó v¢ è v ïî-
ìå÷åíà ñèìâîëîì a), à çàòåì ïåðåõîäèì ê âåðøèíå w¢. Ñâÿçü,
îáåñïå÷èâàþùàÿ ýòîò ïåðåõîä, óæå èìååòñÿ â äåðåâå. Åñëè
èç âåðøèíû w¢ åñòü äóãà, ïîìå÷åííàÿ òåì æå ñèìâîëîì a, è
îíà èäåò â âåðøèíó w, òî ñâÿçü ìåæäó v è w óñòàíîâëåíà (îíà
3.5. Àëãîðèòì À. Àõî – Ì. Êîðàñèê 151

Ðèñ. 3.21. Äèàãðàììà ïåðåõîäîâ êîíå÷íîãî àâòîìàòà äëÿ ïîèñêà


â òåêñòå îáðàçöîâ P1 = abcdccb, P2 = bcdccb, P3 = dccb, P4 = bc,
P5 = dc, P6 = cb

âûäåëåíà òîëñòîé ëèíèåé íà ðèñ. 3.22). Åñëè íåò, òî ìû


èäåì äàëüøå ïî äåðåâó (ïóíêòèðíàÿ ñòðåëêà èç âåðøèíû w¢
íà ðèñ. 3.22).  ëþáîì ñëó÷àå ýòîò ïðîöåññ êîíå÷åí (â õóä-
øåì ñëó÷àå ìû âåðíåìñÿ â êîðåíü äåðåâà).

Ðèñ. 3.22. Ôîðìèðîâàíèå ñâÿçè ìåæäó âåðøèíàìè v è w

Îñòàëîñü îòâåòèòü íà âòîðîé âîïðîñ — êàê âûâîäèòü


âõîæäåíèÿ îáðàçöîâ â òåêñò? Îáðàòèìñÿ ê ðèñ. 3.21. Ñîñòîÿ-
152 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

íèÿ àâòîìàòà, ñîîòâåòñòâóþùèå îêîí÷àíèÿì îáðàçöîâ, âû-


äåëåíû íà ýòîì ðèñóíêå òåìíûì ôîíîì è èìåþò ìåòêè â
âèäå íîìåðà îáðàçöà. Åñòåñòâåííî, ÷òî äëÿ íèõ èçâåñòíû è
äëèíû îáðàçöîâ. ×òî íàì òðåáóåòñÿ ñäåëàòü? Äà ïðîñòî ñî-
áðàòü äëÿ êàæäîãî ñîñòîÿíèÿ àâòîìàòà «òåìíûå êðóæî÷êè»!
Ðåçóëüòàò ýòîé ñáîðêè (à îíà îñóùåñòâëÿåòñÿ â ïðîöåññå
ôîðìèðîâàíèÿ ôóíêöèè F àâòîìàòà è íå âëèÿåò íà âðåìåí-
íóþ îöåíêó) ïðèâåäåí äëÿ íàøåãî «ñêâîçíîãî» ïðèìåðà â
òàáë. 3.10.

Òàáëèöà 3.10

Íîìåð ñîñòîÿ- Ñïèñîê íîìå- Íîìåð ñîñòîÿ- Ñïèñîê íîìåðîâ


íèÿ àâòîìàòà ðîâ îáðàçöîâ íèÿ àâòîìàòà îáðàçöîâ
3 4 13 2, 3, 6
5 5 15 5
7 1, 2, 3, 6 17 3, 6
9 4 19 6
11 5

Îáñóæäåíèå àëãîðèòìà À. Àõî è Ì. Êîðàñèê çàâåðøèì


ðàññìîòðåíèåì ñëåäóþùåãî ïðèìåðà. Ïóñòü äàí òåêñò
T = abcdccbcdccbbcabcdccb. Ðàáîòà àâòîìàòà (îíà îäíî-
çíà÷íî îòñëåæèâàåòñÿ ñ ïîìîùüþ F (òàáë. 3.9) èëè äèàãðàììû
ïåðåõîäîâ íà ðèñ. 3.21), ñîçäàííîãî äëÿ ïðèâåäåííîãî ìíî-
æåñòâà îáðàçöîâ, äàåò ðåçóëüòàò, ïðåäñòàâëåííûé â òàáë. 3.11.

Òàáëèöà 3.11

Íîìåð Íîìåð Íà÷àëüíàÿ Íîìåð Íîìåð Íà÷àëüíàÿ


ïîçèöèè îáðàç- ïîçèöèÿ ïîçèöèè îáðàç- ïîçèöèÿ
â òåêñòå öà îáðàçöà â T â òåêñòå öà îáðàçöà â T
(i) (i)
3 4 2 12 3 9
5 5 4 12 6 11
7 1 1 14 4 13
7 2 2 17 4 16
7 3 4 19 5 18
7 6 6 21 1 15
8 4 7 21 2 16
10 5 9 21 3 18
12 2 7 21 6 20
3.5. Àëãîðèòì À. Àõî – Ì. Êîðàñèê 153

Íåòðóäíî ïðè ýòîì îòñëåäèòü ïîñëåäîâàòåëüíîñòü ïåðå-


õîäîâ èç îäíîãî ñîñòîÿíèÿ àâòîìàòà â äðóãîå.

@ Óïðàæíåíèÿ
1. Ðàçðàáîòàéòå ïðîñòîé àëãîðèòì ïîèñêà îáðàçöîâ â òåê-
ñòå ñ âðåìåííîé îöåíêîé O(t · n · m), ãäå m — ñóììàðíàÿ
äëèíà îáðàçöîâ.
2. Ïðèâåäèòå ïðèìåð ìíîæåñòâà îáðàçöîâ, äëÿ êîòîðîãî
äèàãðàììà ïåðåõîäîâ àâòîìàòà íå áóäåò èìåòü ïóíêòèð-
íûõ ñâÿçåé (ñì. ðèñ. 3.21). Êàê â ýòîì ñëó÷àå ðàáîòàåò
àëãîðèòì À. Àõî – Ì. Êîðàñèê?
3. Ïðèâåäèòå ïðèìåð ìíîæåñòâà îáðàçöîâ. Ïîñòðîéòå äëÿ
íåãî äåðåâî êëþ÷åé è ïðåîáðàçóéòå åãî â äèàãðàììó ðà-
áîòû àâòîìàòà. Ñôîðìèðóéòå äëÿ êàæäîãî ñîñòîÿíèÿ
ñïèñîê îáðàçöîâ, êîòîðûå ñëåäóåò âûâåñòè ïðè åãî äîñ-
òèæåíèè.
4. Âûÿñíèòå, êàê àëãîðèòì À. Àõî – Ì. Êîðàñèê ðàáîòàåò ñ
ïåðèîäè÷åñêèìè ñòðîêàìè. Ïðèìåð ïåðèîäè÷åñêîé
ñòðîêè: (abc)t, ãäå t — íàòóðàëüíîå ÷èñëî.
5. Ðåàëèçóéòå àëãîðèòì À. Àõî – Ì. Êîðàñèêà (íàïèøèòå
ïðîãðàììó). Îñíîâíàÿ ÷àñòü ëîãèêè ìîæåò âûãëÿäåòü
ñëåäóþùèì îáðàçîì:
Begin
Init; {Èíèöèàëèçàöèÿ äàííûõ}
KeyTree; {Ïîñòðîåíèå äåðåâà êëþ÷åé}
Automat; {Ïîñòðîåíèå àâòîìàòà}
Search; {Ïîèñê âõîæäåíèÿ îáðàçöîâ â òåêñò
ñ âûâîäîì ðåçóëüòàòà}
End;
Ïðèìå÷àíèå. Èçÿùåñòâî ðåàëèçàöèè áóäåò, êàê îáû÷-
íî, çàâèñåòü îò âûáîðà ñòðóêòóð äàííûõ.
Ìåòîäè÷åñêèé êîììåíòàðèé
Ïåðâûé àëãîðèòì ïîñòðîåíèÿ äåðåâà ñóôôèêñîâ (äåðåâà ïî-
çèöèé) çà ëèíåéíîå âðåìÿ ðàçðàáîòàí Ï. Âàéíåðîì1)
(Peter Weiner) â 1973 ã. Çàòåì â 1976 ã. Å. Ìàê-Êðåéãîì2)
(Edward McCreight) áûë ïðåäëîæåí äðóãîé àëãîðèòì. Âàðèàíò
Å. Ìàê-Êðåéãà áîëåå ýêîíîìè÷åí ïî ïàìÿòè.  1995 ã. Ý. Óêêî-
1)
Weiner P. Linear pattern matching algoritms // Proc. of the 14th IEEE Symp. on
Switching and Automata Theory. 1973. P. 1–11.
2)
McCreight E. M. A space-economical suffix tree constructor algorithm //
J. ACM. 1976. Vol. 23. P. 262–272.
154 Ãëàâà 3. Äåðåâüÿ ñóôôèêñîâ

íåí1) (Esko Ukkonen) ðàçðàáîòàë íîâûé âàðèàíò àëãîðèòìà. Åãî


ïðèíöèïèàëüíîå îòëè÷èå çàêëþ÷àåòñÿ â âîçìîæíîñòè îáðàáîò-
êè òåêñòà â ðåàëüíîì ìàñøòàáå âðåìåíè — äåðåâî ñóôôèêñîâ
ñòðîèòñÿ ïî ìåðå ïîñòóïëåíèÿ ñèìâîëîâ òåêñòà. Â 1997 ã.
Ì. Ôàðà÷2) (Martin Farach) äëÿ èíäåêñèðîâàííûõ àëôàâèòîâ
ñîçäàë äðóãîé âàðèàíò àëãîðèòìà ïîñòðîåíèÿ äåðåâà ñóôôèê-
ñîâ. Îïèñàíèå àëãîðèòìà Ï. Âàéíåðà ìîæíî íàéòè â êíèãå
Ä. Ãàñôèëäà, à àëãîðèòìà Ì. Ôàðà÷à — â êíèãå Á. Ñìèòà.
Ñóôôèêñíûå ìàññèâû êàê íîâàÿ ñòðóêòóðà äàííûõ, ðàöèî-
íàëüíî èñïîëüçóþùàÿ ïàìÿòü â çàäà÷å ïîèñêà ïîäñòðîêè â
òåêñòå, ïðåäëîæåíà Ó. Ìàíáåð (Udi Manber) è Ã. Ìàéåðñîì
(Gene Myers)3). Èçâåñòíî, ÷òî ñóôôèêñíûå ìàññèâû ìîãóò
áûòü ñôîðìèðîâàíû áåç èñïîëüçîâàíèÿ äåðåâà ñóôôèêñîâ, íî
çà íåñêîëüêî áîëüøåå âðåìÿ4).
Àëãîðèòì À. Àõî (Alfred Aho) è Ì. Êîðàñèê (Marga-
ret Corasick5)), ñ îäíîé ñòîðîíû, ðàçâèâàåò òåìó èñïîëüçîâà-
íèÿ ìåòîäîâ òåîðèè àâòîìàòîâ â ðåøåíèè çàäà÷ îáðàáîòêè
ñòðîê, à ñ äðóãîé — íàãëÿäíî äåìîíñòðèðóåò ïðèìåíåíèå èäåé
ðàññìàòðèâàåìîé ñòðóêòóðû äàííûõ — äåðåâüåâ ñóôôèêñîâ.

1)
Ukkonen E. On-line construction of suffix–trees // Algorithmica. 1995. Vol. 14.
P. 249–260.
2)
Farach M. Optimal suffix tree construction with large alphabets // Proc. 38th
Annual IEEE Symp. Foundations of Computer Science, 1997. P. 137–143.
3)
Manber U., Myers G. Suffix arrays: a new method for on-line string searches //
Proc. First Annual ACM – SIAM Symp. Discrete Algs., 1990. P. 319–327.
Manber U., Myers G. Suffix arrays: a new method for on-line string searches //
SIAM J. Comput. 22–5, 1993. P. 935–948
4)
Sadakane K. A fast algorithm for making suffix arrays and for Burrows-
Wheeler transformation // Proc. IEEE Data Compression Conference, 1998.
P. 129–138.
5)
Aho A., Corasick M. Efficient string matching: an aid to bibliographic search //
Comm. ACM. 1975. Vol. 18. P. 333–340.
Ãëàâà 4

Âû÷èñëåíèå ðàññòîÿíèÿ
ìåæäó ñòðîêàìè

Êàêàÿ äàëüíîñòü ðàññòîÿíüÿ!


 îäíîé èç ãîðîäñêèõ êâàðòèð
 ñòîëîâîé — ðå÷ü î Ëÿîÿíå,
À â äåòñêîé — òóøü è òðàíñïîðòèð.
Áîðèñ Ïàñòåðíàê

 èçó÷àåìîì ðàçäåëå òåîðèè ïîñòðîåíèÿ àëãîðèòìîâ íà


ñòðîêàõ ðåøàåòñÿ çàäà÷à ïðèáëèæåííîãî ñðàâíåíèÿ äâóõ
ñòðîê. Íî äëÿ èçìåðåíèÿ ïðèáëèæåííîñòè òðåáóåòñÿ ââåäå-
íèå ìåðû, èëè «ðàññòîÿíèÿ» ìåæäó îáúåêòàìè, â äàííîì
ñëó÷àå — ñòðîêàìè. Òîëüêî ïîñëå ýòîãî ìîæíî ñêàçàòü, íà-
ñêîëüêî ñèëüíî îòëè÷àþòñÿ ñòðîêè äðóã îò äðóãà.  äàííîé
ãëàâå ðàññìàòèâàåòñÿ çàäà÷à íàõîæäåíèÿ ðàññòîÿíèÿ ìåæ-
äó ñòðîêàìè è ðîäñòâåííàÿ åé çàäà÷à î íàõîæäåíèè íàè-
áîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè. Â îñíîâå ìåòîäîâ
âû÷èñëåíèÿ ðàññòîÿíèÿ ëåæàò èäåè äèíàìè÷åñêîãî ïðî-
ãðàììèðîâàíèÿ, à ðåøåíèÿìè ÿâëÿþòñÿ àëãîðèòìû äèíà-
ìè÷åñêîãî ïðîãðàììèðîâàíèÿ1).

4.1. Îñíîâíîé àëãîðèòì


Ãëàâíîå âñþäó — íà÷àòü; íà÷àëî
âàæíåéøàÿ ÷àñòü äåë.
Àâñîíèé

Ìåðà áëèçîñòè (ðàññòîÿíèå) äîëæíà óäîâëåòâîðÿòü


ñëåäóþùèì óòâåðæäåíèÿì. Ïóñòü S1, S2 è S3 — ñòðîêè, à
d — ðàññòîÿíèå, òîãäà:
l d(S1,S2) … 0 — óñëîâèå íåîòðèöàòåëüíîñòè;
l èç d(S1,S2) = 0 ñëåäóåò, ÷òî u = v è íàîáîðîò — óñëî-
âèå åäèíñòâåííîñòè;

1)
Ñ÷èòàåì, ÷òî ñ ìåòîäîì äèíàìè÷åñêîãî ïðîãðàììèðîâàíèÿ ÷èòàòåëü çíàêîì,
íàïðèìåð, ïî êíèãå: Îêóëîâ Ñ. Ì. Ïðîãðàììèðîâàíèå â àëãîðèòìàõ. — Ì.:
ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2007.
156 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

d(S1,S2) = d(S2,S1) — óñëîâèå ñèììåòðè÷íîñòè;


l
d(S1,S3) „ d(S1,S2) + d(S2,S3) — íåðàâåíñòâî òðåó-
l
ãîëüíèêà.
Ðàçëè÷èå ñòðîê S1 è S2 ìåæäó ñîáîé îáû÷íî îïðåäåëÿþò
â êîëè÷åñòâå îïåðàöèé, êîòîðûå ñëåäóåò âûïîëíèòü äëÿ
ïðåîáðàçîâàíèÿ S1 â S2. Ê òàêèì îïåðàöèÿì îòíîñÿò: âñòàâ-
êó (In —Insert) ñèìâîëà; óäàëåíèå (Dl — Delete) ñèìâîëà;
ïîäñòàíîâêó èëè çàìåíó (Re — Replace) ñèìâîëà; áóêâîñî-
÷åòàíèåì æå Ma (îò ñëîâà Match) îáîçíà÷èì îòñóòñòâèå îïå-
ðàöèé íàä ñèìâîëîì ñòðîêè. Âñå òàêèå îïåðàöèè îáû÷íî
îïðåäåëÿþò êàê îïåðàöèè ðåäàêòèðîâàíèÿ.
Ðàññòîÿíèå Ð. Õåììèíãà äëÿ ñòðîê S1 è S2 îäèíàêîâîé
äëèíû n îïðåäåëÿåòñÿ êàê ìèíèìàëüíîå êîëè÷åñòâî îïåðà-
öèé ïîäñòàíîâîê (Re), íåîáõîäèìûõ äëÿ ïðåîáðàçîâàíèÿ
S 1 â S2 .

Ïðèìåð
Ïóñòü S1 = abcd, S2 = acbd. Òîãäà ðàññòîÿíèå Ð. Õåì-
ìèíãà äëÿ ýòèõ ñòðîê d(u1, u2) = 2.
Расстояние В. Левенштейна1) для строк u1 и u2 опðåäå-
ëÿåòñÿ êàê ìèíèìàëüíîå êîëè÷åñòâî îïåðàöèé âñòàâîê (In),
óäàëåíèé (Dl) è ïîäñòàíîâîê (Re), íåîáõîäèìûõ äëÿ ïðåîá-
ðàçîâàíèÿ u1 â u2.

Ïðèìåð
Ïóñòü S1 = abbca, à S2 = aca. Ïîñëåäîâàòåëüíîñòü îïå-
ðàöèé MaReReDlDl íàä ñèìâîëàìè ïåðâîé ñòðîêè (ïåðâûé
ñèìâîë íå èçìåíÿåòñÿ, âòîðîé è òðåòèé çàìåíÿþòñÿ, ÷åòâåð-
òûé è ïÿòûé — óäàëÿþòñÿ) äàåò d(S1,S2) = 4. Àíàëîãè÷íî
ïîñëåäîâàòåëüíîñòü îïåðàöèé MaReDlDlMa ïðèâîäèò ê ðàñ-
ñòîÿíèþ d(S1,S2) = 3, à ïîñëåäîâàòåëüíîñòü MaDlDlMaMa –
d(S1,S2) = 2.
Òàêèì îáðàçîì, åñëè ðå÷ü èäåò î ìèíèìàëüíîì ðàññòîÿ-
íèè, òî ñëåäóåò ïîíèìàòü, ÷òî îïðåäåëÿåòñÿ íå òîëüêî êîí-
êðåòíîå ÷èñëîâîå çíà÷åíèå, íî è ïîñëåäîâàòåëüíîñòü îïåðà-
öèé, ïðèìåíåíèå êîòîðûõ îáåñïå÷èâàåò åãî äîñòèæåíèå.
Êðîìå òîãî, ïåðâàÿ ñòðîêà ïðåîáðàçóåòñÿ âî âòîðóþ, îäíàêî
î÷åâèäíî, ÷òî âñòàâêà ñèìâîëà â îäíó ñòðîêó ìîæåò ðàñ-
1)
Ëåâåíøòåéí Â. È. Äâîè÷íûå êîäû ñ èñïðàâëåíèåì âûïàäåíèé, âñòàâîê è çà-
ìåùåíèé ñèìâîëîâ // Äîêëàäû ÀÍ ÑÑÑÐ. 1965. Ò.163. Ñ. 707–710.
4.1. Îñíîâíîé àëãîðèòì 157

ñìàòðèâàòüñÿ êàê óäàëåíèå ñèìâîëà èç äðóãîé ñòðîêè, è íà-


îáîðîò.
Ïðèìå÷àíèå. Äàëåå â îñíîâíîì ìû áóäåì ïîäðàçóìåâàòü
ðàññòîÿíèå Â. Ëåâåíøòåéíà1). Åñëè æå ðå÷ü ïîéäåò î äðóãîé
ìåðå áëèçîñòè, òî ýòî áóäåò ñïåöèàëüíî îãîâîðåíî.
Ïóñòü äàíû äâå ñòðîêè S1 (|S1| = n) è S2 (|S2| = m), è òðå-
áóåòñÿ âû÷èñëèòü ðàññòîÿíèå ìåæäó íèìè. Ââåäåì ìàññèâ
D[0..n, 0..m], ãäå ýëåìåíò D[i, j] îïðåäåëÿåòñÿ êàê ðàññòîÿ-
íèå ìåæäó ïîäñòðîêàìè S1[1..i] è S2[1..j]. Òîãäà d(S1, S2) =
= D[n ,m].
Ñäåëàåì î÷åâèäíûå óòâåðæäåíèÿ:
l D[0, 0] = 0 — ïóñòàÿ ñòðîêà ïðåîáðàçóåòñÿ â ïóñòóþ
ñòðîêó çà íóëåâîå êîëè÷åñòâî îïåðàöèé;
l D[0, j] = j äëÿ j îò 1 äî m — ïóñòàÿ ñòðîêà ïðåîáðàçó-
åòñÿ â ñòðîêó S2[1..j] çà j îïåðàöèé âñòàâêè, è ýòî —
ìèíèìàëüíîå êîëè÷åñòâî òàêèõ îïåðàöèé;
l D[i, 0] = i äëÿ i îò 1 äî n — ñòðîêà S1[1..i] ïðåîáðàçóåò-
ñÿ â ïóñòóþ ñòðîêó çà i îïåðàöèé óäàëåíèÿ, è ýòî —
ìèíèìàëüíîå êîëè÷åñòâî òàêèõ îïåðàöèé.
Îñòàëîñü îïðåäåëèòü ñëåäóþùåå ðåêóððåíòíîå ñîîòíî-
øåíèå äëÿ D[i, j] ïðè 1 „ i „ n è 1 „ j „ m:
D[i, j] = min{D[i – 1, j] + 1, D[i, j – 1] + 1,
D[i – 1, j – 1] + t},
ãäå t = 1, åñëè S1[i] ¹ S2[j], è t = 0, åñëè S1[i] = S2[j].
Óêàçàííîå ðåêóððåíòíîå ñîîòíîøåíèå îòðàæàåò ñëåäó-
þùèå ôàêòû:
l àääèòèâíîñòü çàäà÷è — äëÿ ïîëó÷åíèÿ ìèíèìàëüíî-
ãî ðàññòîÿíèÿ ìåæäó ïîäñòðîêàìè S1[1..i] è S2[1..j]
äîñòàòî÷íî çíàòü ìèíèìàëüíûå ðàññòîÿíèÿ ìåæäó
ïîäñòðîêàìè: S1[1..i – 1] è S2[1..j]; S1[1..i] è
S2[1..j – 1]; S1[1..i – 1] è S2[1..j – 1], — íè÷åãî äðóãîãî
íå òðåáóåòñÿ;
l äîñòèæèìîñòü çíà÷åíèÿ D[i, j] — êîíêðåòíûå îïå-
ðàöèè, ïåðåâîäÿùèå êàæäîå èç ìèíèìàëüíûõ ðàññòî-
ÿíèé D[i – 1, j], D[i, j – 1], D[i – 1, j – 1] â D[i, j].

1)
Ðàññòîÿíèå Â. Ëåâåíøòåéíà â ðàçëè÷íûõ èñòî÷íèêàõ îïðåäåëÿþò ïî-ðàçíî-
ìó. Â ðàáîòå Á. Ñìèòà â îïðåäåëåíèè ôèãóðèðóþò òîëüêî îïåðàöèè âñòàâêè è
óäàëåíèÿ, à äëÿ ðàññòîÿíèÿ, îïðåäåëåííîãî òàê, êàê ýòî ñäåëàíî â òåêñòå äàí-
íîé êíèãè, ââîäèòñÿ íîâîå ïîíÿòèå — ðàññòîÿíèå ïðåîáðàçîâàíèÿ.
158 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Ïðèîñòàíîâèì ïîêà ïîïûòêè îáîñíîâàíèÿ ýòèõ óòâåðæ-


äåíèé è ðàññìîòðèì íåñêîëüêî ïðèìåðîâ, òåì áîëåå ÷òî ëî-
ãèêà ôîðìèðîâàíèÿ ìàññèâà D àáñîëþòíî «ïðîçðà÷íà» (êàê
è â áîëüøèíñòâå çàäà÷ äèíàìè÷åñêîãî ïðîãðàììèðîâàíèÿ,
åñëè îñîçíàíà ñóòü àääèòèâíîñòè):

Procedure CreateDist;
Var i,j,t:Word;
Begin
D[0,0]:=0;
For i:=1 To n Do D[i,0]:=i;
For j:=1 To m Do D[0,j]:=j;
For i:=1 To n Do
For j:=1 To m Do Begin
If S1[i]=S2[j] Then t:=0 Else t:=1;
D[i,j]:=Min(D[i-1,j]+1,D[i,j-1]+1,
D[i-1,j-1]+t);
{Ôóíêöèÿ âû÷èñëåíèÿ ìèíèìàëüíîãî èç òðåõ ÷èñåë}
End;
End;

Ïðèìåð 1
S1 = abcdbad, S2 = bacaba. Ìàññèâ D (òàáë. 4.1) çàïîë-
íÿåòñÿ ïîñëåäîâàòåëüíî: ñíà÷àëà ýëåìåíòû ïåðâîé ñòðîêè,
çàòåì — âòîðîé è ò. ä. Çíà÷åíèå D[6, 7] ãîâîðèò î òîì, ÷òî
ñòðîêà S1 ïðåîáðàçóåòñÿ â ñòðîêó S2 çà ÷åòûðå îïåðàöèè.
Òàê, ïîäñòðîêà S1[1..6] = abcdba ïðåîáðàçóåòñÿ â
S2[1..6] = bacaba çà òðè îïåðàöèè (D[6, 6] = 3), à óäàëÿÿ èç
S1[1..7] ïîñëåäíèé ñèìâîë (îäíà îïåðàöèÿ), ìû ïîëó÷àåì
÷åòûðå îïåðàöèè. Ïîäñòðîêà S1[1..6] = abcdba ïðåîáðàçó-
åòñÿ â S2[1..5] = bacab çà ÷åòûðå îïåðàöèè. Âûïîëíÿÿ çàìå-
íó ñèìâîëà S1[7] = d íà ñèìâîë S2[6] = a, ìû èìååì îäíó
îïåðàöèþ, à â èòîãå — ïÿòü. Ïîäñòðîêà S1[1..7] = abcdbad
ïðåîáðàçóåòñÿ â S2[1..5] = bacab çà ïÿòü îïåðàöèé. Âûïîë-
íÿÿ âñòàâêó â S1 ñèìâîëà a, ìû ïîëó÷àåì øåñòü îïåðàöèé.
Ìèíèìàëüíîå èç òðåõ ÷èñåë {3, 4, 5} åñòü 3. Ïî òàêîé æå ëî-
ãèêå â ñîîòâåòñòâèè ñ óñòàíîâëåííîé î÷åðåäíîñòüþ ôîðìè-
ðóþòñÿ è äðóãèå ýëåìåíòû D.
4.1. Îñíîâíîé àëãîðèòì 159

Òàáëèöà 4.1

Íîìåð
D 0 1 2 3 4 5 6 7
ñèìâîëà
Íîìåð
Ñèìâîë a b c d b a d
ñèìâîëà
0 Ñèìâîë 0 1 2 3 4 5 6 7
1 b 1 1 1 2 3 4 5 6
2 a 2 1 2 2 3 4 4 5
3 c 3 2 2 2 3 4 5 6
4 a 4 3 3 3 3 4 4 5
5 b 5 4 3 4 4 3 4 5
6 a 6 5 4 4 5 4 3 4

Ïðèìåð 2
Ñòðîêà S1 = aababab ïðåîáðàçóåòñÿ â S2 = abbaa çà òðè
îïåðàöèè (ìàññèâ D ïðèâåäåí â òàáë. 4.2). Ïîñëåäíåé îïåðà-
öèåé ïî ïðåîáðàçîâàíèþ S1 â S2 ìîæåò áûòü êàê çàìåíà ñèì-
âîëà b íà ñèìâîë a — ìû ïåðåõîäèì èç D[4, 6] â D[5, 7], òàê
è óäàëåíèå ñèìâîëà b èç S1 — ïåðåõîäèì èç D[5, 6] â D[5, 7].
Íî è â òîì, è â äðóãîì ñëó÷àå ïðåîáðàçîâàíèå (S1[1..6] â
S2[1..5] è S1[1..6] â S2[1..4]) îñóùåñòâëÿåòñÿ çà äâå îïåðà-
öèè.

Òàáëèöà 4.2

Íîìåð
D 0 1 2 3 4 5 6 7
ñèìâîëà
Íîìåð
Ñèìâîë a a b a b a b
ñèìâîëà
0 Ñèìâîë 0 1 2 3 4 5 6 7
1 a 1 0 1 2 3 4 5 6
2 b 2 1 1 1 2 3 4 5
3 b 3 2 2 1 2 2 3 4
4 a 4 3 2 2 1 2 2 3
5 a 5 4 3 3 2 2 2 3
160 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Âåðíåìñÿ ê îáñóæäåíèþ ðåêóððåíòíîãî ñîîòíîøåíèÿ.


Íàì íåîáõîäèìî âû÷èñëèòü D[i, j] (ìèíèìàëüíîå êîëè÷åñò-
âî îïåðàöèé ïî ïðåîáðàçîâàíèþ S1[1..i] â S2[1..j]), è èçâåñò-
íû çíà÷åíèÿ D[i – 1, j], D[i, j – 1] è D[i – 1, j – 1]. Ïðè
ýòîì ëîãè÷åñêè âîçìîæíû ÷åòûðå ñëó÷àÿ:
l âñòàâêà ñèìâîëà S2[j] íà ìåñòî i â S1 (ïåðåõîä îò
D[i – 1, j] ê D[i, j] çà îäíó îïåðàöèþ);
l óäàëåíèå ñèìâîëà S1[i] èç S1 (ïåðåõîä îò D[i, j – 1] ê
D[i, j] çà îäíó îïåðàöèþ);
l çàìåíà ñèìâîëà S1[i] íà ñèìâîë S2[j] (ïåðåõîä îò
D[i – 1, j – 1] ê D[i, j] çà îäíó îïåðàöèþ);
l îòñóòñòâèå îïåðàöèè — S1[i] = S2[j] (ïåðåõîä îò
D[i – 1, j – 1] ê D[i, j] çà íóëåâîå êîëè÷åñòâî îïåðà-
öèé).
Âûáîð ìèíèìàëüíîãî èç ýòèõ ÷èñåë äàåò èñêîìîå çíà÷å-
íèå êîëè÷åñòâà îïåðàöèé ïî ïðåîáðàçîâàíèþ S1[1..i] â
S2[1..j]. Äðóãèå ñïîñîáû ïðåîáðàçîâàíèé (à îíè, êîíå÷íî,
åñòü, íàïðèìåð óäàëåíèå âñåõ ñèìâîëîâ èç S1[1..i], à çàòåì
âñòàâêà ñèìâîëîâ, ïðèñóòñòâóþùèõ â S2[1..j], — êîëè-
÷åñòâî îïåðàöèé i + j: ìû èäåì âíà÷àëå ïî ãîðèçîíòàëè äî
ñòîëáöà ñ íîìåðîì j, à çàòåì ïî âåðòèêàëè äî ñòðîêè i) ëèøà-
þò íàñ ñâîéñòâà ìèíèìàëüíîñòè.
Âðåìåííàÿ ñëîæíîñòü òàêîãî àëãîðèòìà — O(n · m), îíà
ïðîïîðöèîíàëüíà ðàçìåðó çàïîëíÿåìîãî ìàññèâà D, êîòî-
ðûé ôàêòè÷åñêè îïðåäåëÿåò è îáúåì ïàìÿòè, íåîáõîäèìûé
äëÿ ðåøåíèÿ çàäà÷è.
Çàìåòèì, ÷òî ïðè âñåì ýòîì ìû âû÷èñëÿåì ðàññòîÿíèå,
íî íå ïîñëåäîâàòåëüíîñòü îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â
S2!  ïîñëåäíåì æå ñëó÷àå èñïîëüçóþòñÿ äâà ñòàíäàðòíûõ
ïðèåìà (ñ÷èòàåì, ÷òî ìàññèâ D ñôîðìèðîâàí), ñòàâøèõ óæå
òðàäèöèîííûìè. Îïðåäåëèì èõ êàê îáðàòíûé ïðîñìîòð
ìàññèâà ðàññòîÿíèé D.
 ïåðâîì ñëó÷àå äîïîëíèòåëüíàÿ ïàìÿòü íå èñïîëüçóåò-
ñÿ, à ðàáîòà ïðîèçâîäèòñÿ òîëüêî ñ ìàññèâîì D. Îïðåäåëèì â
êà÷åñòâå «ñîñåäåé» ýëåìåíòà D[i, j] ýëåìåíòû D[i – 1, j],
D[i, j – 1] è D[i – 1, j – 1], (i > 0, j > 0). Íà÷íåì ñ ýëåìåíòà
D[n, m] è âûáåðåì åãî «ñîñåäà» ñ ìèíèìàëüíûì çíà÷åíèåì
D. Åñëè íåñêîëüêî «ñîñåäåé» èìåþò îäíî è òî æå (ìèíè-
ìàëüíîå) çíà÷åíèå D è ñðåäè íèõ åñòü D[i – 1, j – 1], òî âû-
áèðàåì åãî (îñóùåñòâëÿåì ïåðåõîä ê ýòîìó ýëåìåíòó D).
4.1. Îñíîâíîé àëãîðèòì 161

Åñëè æå D[i – 1, j – 1] íåò, òî âûáèðàåì ëþáîé ñîñåäíèé ýëå-


ìåíò — ïðè ðåøåíèè çàäà÷è î âûâîäå îäíîé ïîñëåäîâàòåëü-
íîñòè îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â S2. (Ïðè ïîèñêå æå
âñåõ ïîñëåäîâàòåëüíîñòåé îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â
S2 ýòó «ðàçâèëêó» ñëåäóåò çàïîìíèòü, ÷òîáû çàòåì, ïîñëå
òîãî êàê áóäåò íàéäåíà î÷åðåäíàÿ ïîñëåäîâàòåëüíîñòü îïå-
ðàöèé, âåðíóòüñÿ ê íåé.) Äëÿ âûáðàííîãî ýëåìåíòà D äåé-
ñòâèÿ àíàëîãè÷íû, è ýòîò ïðîöåññ ïðîäîëæàåòñÿ äî òåõ ïîð,
ïîêà íå áóäåò äîñòèãíóò ýëåìåíò D[1, 1]. Â òàáë. 4.1 æèð-
íûì øðèôòîì è ñåðûì öâåòîì ôîíà áûë âûäåëåí ýòîò îáðàò-
íûé ïóòü ïî D. Ïåðåõîä îò D[i, j] ê D[i, j – 1] ïðè ýòîì ñîîò-
âåòñòâóåò óäàëåíèþ (Dl) ñèìâîëà S1[i]; ïåðåõîä îò D[i, j] ê
D[i – 1, j] — âñòàâêå (In) ñèìâîëà S2[j] ïîñëå S1[i]; íàêîíåö,
ïåðåõîä îò D[i, j] ê D[i – 1, j – 1] ñîîòâåòñòâóåò ïîäñòàíîâêå
(Re) ñèìâîëà S1[i] íà ñèìâîë S2[j] èëè îòñóòñòâèþ îïåðàöèè
(Ma). Òàê, â ïðèìåðå, ïîêàçàííîì â òàáë. 4.1, ñòðîêà
S1 = abcdbad ïðåîáðàçóåòñÿ â S2 = bacaba ïîñëåäîâàòåëü-
íîñòüþ îïåðàöèé ReReMaReMaMaDl, è ýòà ïîñëåäîâàòåëüíîñòü
ìèíèìàëüíà. Âî âòîðîì ðàññìàòðèâàåìîì ïðèìåðå (ñì.
òàáë. 4.2) ñòðîêà S1 = aababab ïðåîáðàçóåòñÿ â S2 = abbaa
ïîñëåäîâàòåëüíîñòÿìè îïåðàöèé MaReMaMaDlMaDl è
MaDlMaDlMaMaRe.
Âî âòîðîì æå ñëó÷àå èñïîëüçóåòñÿ äîïîëíèòåëüíàÿ ïà-
ìÿòü — ìàññèâ óêàçàòåëåé Dp[0..n, 0..m], ôîðìèðóåìûé
ïðè çàïîëíåíèè ìàññèâà D. Ôàêòè÷åñêè â íåì â êàæäîì ýëå-
ìåíòå Dp[i, j] çàïîìèíàåòñÿ (òàê èëè èíà÷å) èíôîðìàöèÿ î
òîì, îò êàêîãî «ñîñåäà» áûë îñóùåñòâëåí ïåðåõîä ê D[i, j].
Òàê, åñëè ñ÷èòàòü, ÷òî îò D[i, j – 1] ê D[i, j] ýòî çíà÷åíèå
ðàâíî åäèíèöå (îïåðàöèÿ Dl), îò D[i – 1, j] ê D[i, j] — äâóì
(îïåðàöèÿ In), à îò D[i – 1, j – 1] ê D[i, j] — ÷åòûðåì (îïåðà-
öèè Re èëè Ìa), òî ëîãèêó ïîëó÷åíèÿ D ñëåäóåò äîïîëíèòü
ôðàãìåíòîì:
If D[i,j–1]=D[i,j]–1 Then Dp[i,j]:=Dp[i,j]+1;
If D[i–1,j]=D[i,j]–1 Then Dp[i,j]:=Dp[i,j]+2;
If D[i–1,j–1]=D[i,j]–t Then Dp[i,j]:=Dp[i,j]+4;

Ïîñëå òîãî êàê ìàññèâû D è Dp ñôîðìèðîâàíû, îñòàåòñÿ


âûïîëíèòü îáðàòíûé ïðîñìîòð îò ýëåìåíòà Dp[n, m] ïî óêà-
çàòåëÿì äî ýëåìåíòà Dp[1, 1], çàïèñûâàÿ ïðè ýòîì îïåðà-
öèè, ñîîòâåòñòâóþùèå ïåðåõîäàì. Âðåìÿ ðàáîòû ýòîãî ôðàã-
ìåíòà ëîãèêè — O(n + m).
162 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåðû ñòðîê S1 è S2. Íàéäèòå âñå ñïîñîáû
ïðåîáðàçîâàíèÿ S1 â S2. Âûáåðèòå èç íèõ òå, êîòîðûå ðå-
øàþò çàäà÷ó çà ìèíèìàëüíîå êîëè÷åñòâî îïåðàöèé.
2. Ïðèâåäèòå ïðèìåðû ñòðîê S1 è S2. Ñôîðìèðóéòå âðó÷-
íóþ ìàññèâ ðàññòîÿíèé D. Âûïîëíèòå îáðàòíûé ïðî-
ñìîòð ìàññèâà D.
3. Ðàçðàáîòàéòå àëãîðèòì âû÷èñëåíèÿ ðàññòîÿíèÿ Õåì-
ìèíãà ìåæäó äâóìÿ ñòðîêàìè äëèíû n.
4. Ïðè èçâåñòíîì ìàññèâå D íàéäèòå ïîñëåäîâàòåëüíîñòü
îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â S2.
5. Ïðè èçâåñòíûõ ìàññèâàõ D è Dp íàéäèòå âñå ïîñëåäîâà-
òåëüíîñòè îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â S2.
6. Âçâåøåííîå ðàññòîÿíèå. Îáîçíà÷èì ÷åðåç ds «ñòîè-
ìîñòü» îïåðàöèé âñòàâêè è óäàëåíèÿ ñèìâîëà, ÷åðåç
rs — «ñòîèìîñòü» îïåðàöèè ïîäñòàíîâêè èëè çàìåíû, à
÷åðåç es — «ñòîèìîñòü» ñîâïàäåíèÿ. Ñòàâèòñÿ çàäà÷à ïå-
ðåâîäà ñòðîêè S1 â ñòðîêó S2 ñ ìèíèìàëüíîé ñóììàðíîé
«ñòîèìîñòüþ» îïåðàöèé (ñ ìèíèìàëüíûì âçâåøåííûì
ðàññòîÿíèåì). Ïðîâåðüòå ïðèâåäåííóþ íèæå ëîãèêó è
óáåäèòåñü (íà êîíêðåòíîì ïðèìåðå), ÷òî â ýòîì ñëó÷àå
âû÷èñëÿåòñÿ êàê âçâåøåííîå ðàññòîÿíèå, òàê è ìàññèâ
óêàçàòåëåé Dp.
Procedure CreateD;
Var i,j,t:Word;
Begin
D[0,0]:=0;
For i:=1 To n Do Begin
D[i,0]:=i*ds;Dp[i,0]:=2; End;
For j:=1 To m Do Begin
D[0,j]:=j*ds;Dp[0,j]:=1; End;
For i:=1 To n Do
For j:=1 To m Do Begin
If S1[i]=S2[j] Then t:=es Else t:=rs;
D[i,j]:=Min(D[i–1,j]+ds,D[i,j–1]+ds,
D[i–1,j–1]+t);
4.1. Îñíîâíîé àëãîðèòì 163

If D[i,j–1]=D[i,j]–ds Then
Dp[i,j]:=Dp[i,j]+1;
If D[i–1,j]=D[i,j]–ds Then
Dp[i,j]:=Dp[i,j]+2;
If D[i–1,j–1]=D[i,j]–t Then
Dp[i,j]:=Dp[i,j]+4;
End;
End;

7. Âûÿñíèòå, êàêàÿ çàäà÷à ðåøàåòñÿ ñ ïîìîùüþ ïðèâåäåí-


íîé ëîãèêè (è êàê èìåííî). Óïðîñòèòå ðåøåíèå (íàïðè-
ìåð, íàïèñàâ ðåêóðñèâíûé âàðèàíò ðåàëèçàöèè).
Procedure FindAllWay;
Var s:String;
ok:Boolean;
St:Array[1..2*MaxN,1..2] Of Word; {Ñòåê}
Stm:Array[1..2*MaxN] Of Set Of 1..3;
yk:Word; {Óêàçàòåëü ñòåêà}
it,jt,k,mask:Word;
Begin
s:='';
yk:=1;
St[yk,1]:=n;
St[yk,2]:=m;
Stm[yk]:=[1..3];
While yk<>0 Do Begin {Ïîêà ñòåê íå ïóñò}
it:=St[yk,1];
jt:=St[yk,2];
If (it=0) And (jt=0) Then Begin
{Íàøëè îäíî èç ðåøåíèé}
WriteLn(s);
yk:=yk–1;
Delete(s,1,1);
Continue;
End;
k:=0;
ok:=False;
Repeat
{Âûáîð íàïðàâëåíèÿ ïåðåìåùåíèÿ}
k:=k+1;
164 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

mask:=(1 Shl (k-1));


If (Dp[it,jt]) (And Mask = Mask)
And (k In Stm[yk])
Then ok:=True;
Until ok Or (k>=3);
If ok Then Begin {Ïåðåìåùåíèå íàéäåíî}
Stm[yk]:=Stm[yk]-[k];
yk:=yk+1;
Stm[yk]:=[1..3];
Case k Of
1: Begin
St[yk,1]:=it;St[yk,2]:=jt–1;
s:='In'+s;
End;
2: Begin
St[yk,1]:=it–1;St[yk,2]:=jt;
s:='Dl'+s;
End;
3: Begin
St[yk,1]:=it–1;St[yk,2]:=jt–1;
If S1[it]<>S2[jt] Then s:='Re'+s
Else s:='Ma'+s;
End;
End;
End Else Begin
yk:=yk–1;
Delete(s,1,1);
End;
End;
End;

8. Ñõîäñòâî ñòðîê. Ïóñòü àëôàâèò A äîïîëíåí ñèìâîëîì


ïðîáåëà (îáîçíà÷èì åãî êàê «__»), è äëÿ ëþáûõ äâóõ
ñèìâîëîâ x, y Î A* (A* = A + «__») îïðåäåëåíà îöåíêà
rs[x, y] (îò ñëîâà resemblance — «ñõîäñòâî»), çàäàþùàÿ
ñõîäñòâî ñèìâîëîâ x è y ïðè ðàçìåùåíèè èõ äðóã ïîä
äðóãîì ïðè âûðàâíèâàíèè. Âûðàâíèâàíèå äâóõ ñòðîê
S1 è S2 ïîëó÷àåòñÿ âñòàâêîé ñèìâîëà ïðîáåëà â S1 è S2 è
ðàçìåùåíèåì ñòðîê äðóã ïîä äðóãîì òàê, ÷òîáû êàæäî-
ìó ñèìâîëó ïåðâîé ñòðîêè (âêëþ÷àÿ ïðîáåëû) ñîîòâåò-
ñòâîâàëè ñèìâîëû äðóãîé ñòðîêè, è íàîáîðîò.
4.2. Àëãîðèòì Ý. Óêêîíåíà – Þ. Ìàéåðñà 165

Ïðèìåð
A = {a, b, c}, S1 = aabbcc, S2 = aacb, Þ
æ 1 -2 -4 -3 ö
ç ÷
ç 3 -1 -2 ÷
rs = ç .
2 -5 ÷
çç ÷÷
è 0 ø
a a b bc c
Âûðàâíèâàíèå èìååò ñóììàðíóþ îöåíêó
a a _ _ cc

1 + 1 – 2 – 2 + 2 – 5 = –5, à âûðàâíèâàíèå a a b b c c ïî-


aac b _ _
ëó÷àåò ñóììàðíóþ îöåíêó 1 + 1 – 1 + + 3 – 5 – 5 = –6.
Ñõîäñòâî ñòðîê S1 è S2 îïðåäåëÿåòñÿ êàê ìàêñèìàëüíîå
ñóììàðíîå çíà÷åíèå îöåíîê, ïîëó÷àþùååñÿ â ðåçóëüòàòå
âûïîëíåíèÿ ðàçëè÷íûõ ñïîñîáîâ âûðàâíèâàíèÿ S1 è S2 îò-
íîñèòåëüíî äðóã äðóãà.
Îáîçíà÷èì ÷åðåç R[i, j] çíà÷åíèå ìàêñèìàëüíîé îöåíêè
äëÿ ïðåôèêñîâ S1[1..i] è S2[1..j]. Òîãäà çíà÷åíèå R[n, m]
äàåò ìàêñèìàëüíóþ îöåíêó â öåëîì äëÿ ñòðîê S1 è S2.
1. Îáîñíóéòå ñïðàâåäëèâîñòü ðåêóððåíòíîãî ñîîòíîøå-
íèÿ:
R [0, j] = å rs [_, S2 [k]] è R [i,0] = å rs [S1 [k], _ ] ;
1„ k „ j 1„ k „ i
ì R [i - 1, j - 1] + rs [S1 [i], S2 [j]],ü
ï ï
R [i, j] = max í R [i - 1, j] + rs [S1 [i], _ ], ý.
ï R [i, j - 1] + rs [_, S [j]] ï
î 2 þ
2. Ðàçðàáîòàéòå ïðîãðàììó âû÷èñëåíèÿ ñõîäñòâà ñòðîê
è íàõîæäåíèÿ âñåõ ñïîñîáîâ âûðàâíèâàíèÿ, ïðè êî-
òîðûõ îáåñïå÷èâàåòñÿ ýòî ñõîäñòâî.

4.2. Àëãîðèòì Ý. Óêêîíåíà – Þ. Ìàéåðñà


Âïåðåä, â ðóêîïàøíóþ!
(Ì/ô «Îñòðîâ ñîêðîâèù»)
Óòî÷íèì ìåðó áëèçîñòè ìåæäó ñòðîêàìè S1 è S2, ââåäåí-
íóþ â ï. 4.1. Çàìåíèì (óñëîâíî) îïåðàöèþ ïîäñòàíîâêè èëè
çàìåíû ñèìâîëà (Replace) íà äâå îïåðàöèè — âñòàâêó
166 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

(Insert) è óäàëåíèå (Delete) ñèìâîëîâ. Äðóãèìè ñëîâàìè,


îïåðàöèÿ Re áóäåò èìåòü âåñ 2. Âû÷èñëèì ìàòðèöó ðàññòîÿ-
íèé D. Íàïîìíèì ðåêóððåíòíîå ñîîòíîøåíèå äëÿ D[i, j] ïðè
1 „ i „ n è 1 „ j „ m:
D[i, j] = min{D[i – 1, j] + 1, D[i, j – 1] + 1, D[i – 1, j – 1] + t},
ãäå t = 2, åñëè S1[i] ¹ S2[j], è t = 0, åñëè S1[i] = S2[j] (èíèöè-
àëèçàöèÿ D îñóùåñòâëÿåòñÿ òàê æå, êàê è â ï. 4.1).
Äëÿ ñòðîê S1 = abcaadbbd è S2 = bcadabbdc ìàòðèöà D
ïðåäñòàâëåíà â òàáë. 4.3. Çíà÷åíèå D[n, m] çäåñü ðàâíî 4,
ò. å. çà ÷åòûðå îïåðàöèè ñòðîêà S1 ìîæåò áûòü ïðåîáðàçîâà-
íà â ñòðîêó S2, è ýòî — ìèíèìàëüíîå êîëè÷åñòâî îïåðàöèé.

Òàáëèöà 4.3

D 0 b c a d a b b d c
0 0 1 2 3 4 5 6 7 8 9
a 1 2 3 2 3 4 5 6 7 8
b 2 1 2 3 4 5 4 5 6 7
c 3 2 1 2 3 4 5 6 7 6
a 4 3 2 1 2 3 4 5 6 7
a 5 4 3 2 3 2 3 4 5 6
d 6 5 4 3 2 3 4 5 4 5
b 7 6 5 4 3 4 3 4 5 6
b 8 7 6 5 4 5 4 3 4 5
d 9 8 7 6 5 6 5 4 3 4

Ïðåäñòàâèì ýòó èíôîðìàöèþ â âèäå ãðàôà G = (V, E),


ãäå V — êîíå÷íîå ìíîæåñòâî âåðøèí, êîòîðûå ñîîòâåòñòâó-
þò èíäåêñàì (i, j), i Î 0 ... n, j Î 0 ... m, à E — äóãè ãðàôà.
Êàæäàÿ âåðøèíà (i, j) èìååò íå áîëåå òðåõ âõîäÿùèõ äóã
(êðîìå âåðøèíû (0, 0)), íàïðàâëåííûõ èç âåðøèíû (i – 1, j),
èç âåðøèíû (i, j – 1) è èç âåðøèíû (i – 1, j – 1). Êàæäîé òà-
êîé äóãå ìû ïðèïèøåì âåñ, ðàâíûé ðàçíîñòè ìåæäó D[i, j] è
D[i¢, j¢]. Âåñ æå ñàìîé âåðøèíû (i, j) îïðåäåëèì êàê çíà÷åíèå
D[i, j].
Âåñ âåðøèíû (i, j) îïðåäåëÿåò ìèíèìàëüíîå êîëè÷åñòâî
îïåðàöèé ïî ïðåîáðàçîâàíèþ ïðåôèêñà S1[1..i] â ïðåôèêñ
S2[1..j] è ðàâåí ñóììå âåñîâ äóã îðèåíòèðîâàííîãî ïóòè èç
(0, 0) â (i, j). Òîãäà ïóòü ñ ìèíèìàëüíûì ñóììàðíûì âåñîì èç
4.2. Àëãîðèòì Ý. Óêêîíåíà – Þ. Ìàéåðñà 167

(0, 0) â (n, m) îïðåäåëÿåò íàèëó÷øèé ñïîñîá ïðåîáðàçîâàíèÿ


S1 â S2. Çàìåòèì, ÷òî â ïîäîáíîì ãðàôå íåò äóã îò âåðøèí ñ
áîëüøèì âåñîì ê âåðøèíàì ñ ìåíüøèì âåñîì. Íà ðèñ. 4.1
ïîêàçàí ãðàô G, ñîîòâåòñòâóþùèé ìàòðèöå D äëÿ ðàññìàò-
ðèâàåìîãî ïðèìåðà.

Ðèñ. 4.1. Ãðàô G, ñîîòâåòñòâóþùèé ìàòðèöå D

Ïîêà ìû ïðåäñòàâèëè èñõîäíûå äàííûå çàäà÷è â äðóãîì


âèäå, è òîëüêî. Êîíå÷íî, ó íàñ åñòü âîçìîæíîñòü èñïîëüçî-
âàòü àëãîðèòìû òåîðèè ãðàôîâ ïî ïîèñêó êðàò÷àéøèõ ïó-
òåé1), íî èõ âðåìåííàÿ ñëîæíîñòü ñîïîñòàâèìà ñ âðåìåíåì
ôîðìèðîâàíèÿ D, òàê ÷òî íà ýòîì ïóòè óñêîðåíèå íå äîñòè-
ãàåòñÿ.
1)
Îêóëîâ Ñ. Ì. Äèñêðåòíàÿ ìàòåìàòèêà. Òåîðèÿ è ïðàêòèêà ðåøåíèÿ çàäà÷ ïî
èíôîðìàòèêå. — Ì.: ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2008.
168 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Îáðàòèìñÿ âíîâü ê ãðàôó G è âîñïîëüçóåìñÿ î÷åâèäíûì


íàáëþäåíèåì. Íà ïóòè ñ ìèíèìàëüíûì ñóììàðíûì âåñîì èç
(0, 0) â (n, m) íå ìîæåò áûòü òàêèõ âåðøèí (i, j), ÷òî
D[i, j] > D[n, m]. Åñëè òåïåðü èç G óáðàòü âñå âåðøèíû ñ òà-
êèì âåñîì è âñå ïóòè, âåäóùèå òîëüêî ê íèì, òî ïîëó÷èòñÿ
ñîêðàùåííûé (óìåíüøåííûé) ãðàô. Äëÿ ðàññìàòðèâàåìîãî
ïðèìåðà îí ïðèâåäåí íà ðèñ. 4.2. ×òî îí äàåò? Î÷åðåäíîå íà-
áëþäåíèå: âåðøèíû «êîíöåíòðèðóþòñÿ» âîêðóã ãëàâíîé
äèàãîíàëè, êîòîðàÿ ñîäåðæèò íå áîëåå ÷åì n äóã (ñ÷èòàåì,
÷òî n „ m). Èíòóèòèâíî ÿñíî, ÷òî âåðøèíû ñîêðàùåííîãî
ãðàôà íå ìîãóò îòñòóïàòü îò ýòîé äèàãîíàëè áîëåå ÷åì íà
éd ù
d = D[n, m] øàãîâ (äóã). Äàæå áîëåå òî÷íî — íà ê ú øàãîâ.
ê2 ú

Ðèñ. 4.2. Ñîêðàùåííûé âàðèàíò ãðàôà G


4.2. Àëãîðèòì Ý. Óêêîíåíà – Þ. Ìàéåðñà 169

Òîãäà îáùåå êîëè÷åñòâî âåðøèí â ñîêðàùåííîì ãðàôå èìååò


ïîðÿäîê O(n · d). È âîò ó íàñ î÷åðåäíîé ìîìåíò «ýâðèêà»:
÷òî åñëè ñòðîèòü ñðàçó ñîêðàùåííûé ãðàô, òîãäà âðåìÿ åãî
ïîñòðîåíèÿ (åñòåñòâåííî, ñ ïîëó÷åíèåì îöåíîê) áóäåò ïðî-
ïîðöèîíàëüíî êîëè÷åñòâó âåðøèí, à çàäà÷à ðåøàåòñÿ çà
O(n · d)? Ïðîâåðèì ýòó èäåþ äëÿ «êðàéíèõ» ñëó÷àåâ.
Ïðèìåð 1
Ïóñòü S1 = abcde, S2 = fghijk. Ìàòðèöà D ïðåäñòàâëå-
íà â òàáë. 4.4.

Òàáëèöà 4.4

D 0 f g h i j k
0 0 1 2 3 4 5 6
a 1 2 3 4 5 6 7
b 2 3 4 5 6 7 8
c 3 4 5 6 7 8 9
d 4 5 6 7 8 9 10
e 5 6 7 8 9 10 11

Ñîêðàùåííûé ãðàô G çäåñü ñîâïàäåò ñ èñõîäíûì, íî


åñëè èçâåñòíà âåðõíÿÿ îöåíêà d, òî, ïðîéäÿ ïî ãëàâíîé äèà-
ãîíàëè îäèí ðàç (ïî ñîîòâåòñòâóþùåìó ïóòè â ãðàôå), ìîæ-
íî íàéòè çíà÷åíèå d.
Ïðèìåð 2
Ïóñòü S1 = aaaaa, S2 = aaaaaa. Ìàòðèöà D ïðèâåäåíà
â òàáë. 4.5.

Òàáëèöà 4.5

D 0 a a a a a a
0 0 1 2 3 4 5 6
a 1 0 1 2 3 4 5
a 2 1 0 1 2 3 4
a 3 2 1 0 1 2 3
a 4 3 2 1 0 1 2
a 5 4 3 2 1 0 1
170 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

À çäåñü — ýôôåêò ìàêñèìàëüíûé! Îò ãëàâíîé äèàãîíà-


ëè, èäóùåé îò (0, 0) äî (n, n), ìû îòñòóïàåì òîëüêî íà îäèí
øàã ââåðõ è âíèç (ñ÷èòàåì, ÷òî n „ m).

Íî êàê ñòðîèòü ñîêðàùåííûé ãðàô G? À åñëè åãî âîîáùå


íå ñòðîèòü, à ïðîñòî çàïîëíÿòü ìàòðèöó D ëèøü ÷àñòè÷íî â
òîé ìåðå, â êîòîðîé îíà áóäåò ñîîòâåòñòâîâàòü ñîêðàùåííî-
ìó ãðàôó, òî÷íåå, ïðåäïîëîæåíèþ îá åãî ñòðóêòóðå ïðè èç-
âåñòíîé îöåíêå d?  ýòîì ñëó÷àå ïðè çàïîëíåíèè D äëÿ êàæ-
äîãî çíà÷åíèÿ i (íîìåðà ñòðîêè) ñëåäóåò ôîðìèðîâàòü íå âñå
ýëåìåíòû ñòðîêè (èíäåêñ j), à òîëüêî îò íèæíåãî çíà÷åíèÿ
(îáîçíà÷èì åãî êàê a) äî âåðõíåãî çíà÷åíèÿ (îáîçíà÷èì åãî
êàê b).
Âåëè÷èíû a è b îïðåäåëÿþòñÿ îöåíêîé d è ðàçìåðàìè
ìàòðèöû n è m. Ïóñòü m ðàâíî n. Òîãäà ïðè i = 1 çíà÷åíèå j
äîëæíî èçìåíÿòüñÿ îò 1 äî 1 + d (íà d äèàãîíàëåé ââåðõ), à
ïðè i = n — îò n – d (íà d äèàãîíàëåé âíèç) äî n. Îáîáùàÿ,
ïîëó÷àåì: a = max(1, i – d) è b = min(n, i + d). Îñòàëîñü
ó÷åñòü ñëó÷àé íåðàâåíñòâà m è n. Íî òîãäà ïðè äîñòèæåíèè
ïîñëåäíåé ñòðîêè ïî ãëàâíîé äèàãîíàëè íåîáõîäèìî ñäåëàòü
m – n (n < m) øàãîâ âïðàâî ïî ñòðîêå. Ýòà ðàçíîñòü è îïðå-
äåëÿåò îêîí÷àòåëüíûå ãðàíèöû èíäåêñà j ïðè êàæäîì çíà-
÷åíèè i.
Îôîðìèì ýòó ëîãèêó â âèäå ôóíêöèè Trail.
Function Trail(d:Integer):Integer;
Var i,j,q,t:Integer;
Begin
q:=|d-(m-n) Div 2|;
For i:=1 To n Do
For j:= Max(1,i–q) To Min(m,i+q+m-n) Do Begin
D[i,j]:=Min(D[i–1,j]+1,D[i,j–1]+1);
If S1[i]=S2[j] Then t:=0 Else t:=2;
D[i,j]:=Min(D[i,j],D[i–1,j–1]+t);
End;
Trail:=D[n,m];
End;

 îñíîâíîé ïðîöåäóðå îñòàåòñÿ òîëüêî èíèöèàëèçèðî-


âàòü D è âû÷èñëÿòü D[n, m] äî òåõ ïîð, ïîêà ýòî çíà÷åíèå íå
ñòàíåò áîëüøå îöåíêè d, êîòîðóþ ìû óâåëè÷èâàåì âäâîå íà
êàæäîé èòåðàöèè:
4.2. Àëãîðèòì Ý. Óêêîíåíà – Þ. Ìàéåðñà 171

Procedure Dist;
Var i,j,d:Integer;
Begin
D[0,0]:=0;
For i:=1 To n Do D[i,0]:=D[i–1,0]+1;
For j:=1 To m Do D[0,j]:=D[0,j–1]+1;
d:=1;
While d<Trail(d) Do d:=2*d;
WriteLn(D[n,m]);
End;
Âðåìÿ âûïîëíåíèÿ ôóíêöèè Trail ñîñòàâëÿåò O(n · d),
à âûïîëíÿåòñÿ îíà äëÿ çíà÷åíèé d, ðàâíûõ 1, 2, … 2t, ãäå t —
íàèìåíüøåå öåëîå, òàêîå, ÷òî d „ 2t. Ñëåäîâàòåëüíî, îáùåå
âðåìÿ ðàáîòû Trail èìååò òàêóþ æå îöåíêó.

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåð äâóõ ñòðîê. Ïîäñ÷èòàéòå äëÿ íèõ ìàò-
ðèöó D. Ïîñòðîéòå ãðàô G è åãî ñîêðàùåííûé âàðèàíò.
2. Âûïîëíèòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Ý. Óêêîíåíà è Þ. Ìàéåðñà.
3. Ðàçðàáîòàéòå ìîäèôèêàöèþ àëãîðèòìà Ý. Óêêîíåíà è
Þ. Ìàéåðñà, îáåñïå÷èâàþùóþ íå òîëüêî ïîèñê íàèáîëü-
øåé îáùåé ïîäïîñëåäîâàòåëüíîñòè, íî è âûâîä ñàìîé
ýòîé ïîäïîñëåäîâàòåëüíîñòè.
4. Ïóñòü èçâåñòíà âåðõíÿÿ îöåíêà äëÿ d. Ìîäèôèöèðóéòå
àëãîðèòì Ý. Óêêîíåíà è Þ. Ìàéåðñà äëÿ ýòîãî ñëó÷àÿ.
5. Ïðåäñòàâèì ãðàô, ñîîòâåòñòâóþùèé ñòðîêàì S1 è S2, íå-
ñêîëüêî èíà÷å. Ïóñòü â íåì äèàãîíàëüíîå ðåáðî îò âåðøè-
íû (i – 1, j – 1) ê âåðøèíå (i, j) èäåò òîëüêî â òîì ñëó÷àå,
åñëè S1[i] = S2[j]. Äëÿ ñòðîê S1 = abcaadbbd è
S2 = bcadabbdc òàêîé ãðàô ïðåäñòàâëåí íà ðèñ. 4.3.
Ïóòü äëèíîé L — ýòî ïóòü, ñîäåðæàùèé L âåðøèí ãðàôà
(i1, j1), (i2, j2), ..., (iL, jL), äëÿ êîòîðûõ S1[ik] = S2[jk]
(k = 1..L) è ik–1 < ik, jk–1 < jk. Òîãäà ïðîáëåìà íàõîæäå-
íèÿ íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè S1 è S2
ýêâèâàëåíòíà íàõîæäåíèþ ïóòè èç âåðøèíû (0, 0) â
âåðøèíó (n, m) íàèáîëüøåé äëèíû èëè ñîäåðæàùåãî íà-
èáîëüøåå êîëè÷åñòâî äèàãîíàëüíûõ ðåáåð. Îáîçíà÷èì
172 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Ðèñ. 4.3. Ãðàô, îòðàæàþùèé ñâÿçè ìåæäó ñèìâîëàìè ñòðîê


S1 = abcaadbbd è S2 = bcadabbdc

êàê d-ïóòü íåêîòîðûé ïóòü, íà÷èíàþùèéñÿ â (0, 0) è ñî-


äåðæàùèé d íåäèàãîíàëüíûõ ðåáåð. Òîãäà 0-ïóòü ñîñòî-
èò òîëüêî èç äèàãîíàëüíûõ ðåáåð, à d-ïóòü ñòðîèòñÿ èç
(d – 1)-ïóòè äîáàâëåíèåì åùå îäíîãî íåäèàãîíàëüíîãî
ðåáðà è âîçìîæíîé ïîñëåäîâàòåëüíîñòè äèàãîíàëüíûõ
ðåáåð. Ïðîöåññ ïîñòðîåíèÿ d-ïóòåé çàêàí÷èâàåòñÿ ïðè
äîñòèæåíèè âåðøèíû (n, m). Çíà÷åíèå d ïðè ýòîì äàåò
êîëè÷åñòâî îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â S2, à êîëè-
÷åñòâî äèàãîíàëüíûõ ðåáåð — äëèíó íàèáîëüøåé îáùåé
ïîäïîñëåäîâàòåëüíîñòè.
4.2. Àëãîðèòì Ý. Óêêîíåíà – Þ. Ìàéåðñà 173

Âûÿñíèòå, êàêàÿ çàäà÷à ðåøàåòñÿ ñ ïîìîùüþ íèæåïðè-


âåäåííîé ïðîöåäóðû Solve. Èññëåäóéòå âîïðîñ î åå
óëó÷øåíèè (íàïðèìåð, ñ òî÷êè çðåíèÿ âîçìîæíîñòè âû-
âîäà íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè, à íå
òîëüêî êîëè÷åñòâà îïåðàöèé ïî ïðåîáðàçîâàíèþ S1 â S2
èëè åå äëèíû):

Procedure Solve;
Var d,j,x,y:Integer;
Begin
Res[1]:=0;
{Ìàññèâ Res èìååò òèï
TArray=Array[-NMax..NMax] Of Integer;}
For d:=0 To Max(n,m) Do Begin
{Max – ôóíêöèÿ îïðåäåëåíèÿ ìàêñèìàëüíîãî
èç äâóõ ÷èñåë}
For j:=-d To d Do
If (Abs(j) Mod 2)=(d Mod 2) Then Begin
If (j=-d) Or (j<>d) And (Res[j-1]<Res[j+1])
Then x:=Res[j+1]
Else x:=Res[j-1]+1;
y:=x-j;
{Èäåì ïî äèàãîíàëè îò êîíöà ïðåäûäóùåãî
ó÷àñòêà íà äèàãîíàëè j}
While (x<n) And (y<m)
And (S1[x+1]=S2[y+1]) Do
Begin
x:=x+1;
y:=y+1;
End;
Res[j]:=x;
{Çàïîìèíàåì êîíåö äèàãîíàëüíîãî ó÷àñòêà}
If (x>=n) And (y>=m) Then Begin
WriteLn(d); {WriteLn(Max(n,m)-d);}
Exit;
End;
End;
End;
End;
174 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

4.3. Çàäà÷à î íàèáîëüøåé îáùåé


ïîäïîñëåäîâàòåëüíîñòè äâóõ ñòðîê
Íóæíî èìåòü ÷òî-òî îáùåå, ÷òîáû
ïîíèìàòü äðóã äðóãà, è ÷åì-òî îòëè-
÷àòüñÿ, ÷òîáû ëþáèòü äðóã äðóãà.
Ïîëü Æåðàëüäè

4.3.1. Ïðîñòîé àëãîðèòì ðåøåíèÿ


À ñóïðóãà ó ìåíÿ ïðîñòàÿ, èç íà-
ðîäà.
Ñåðãåé Äîâëàòîâ
Îïðåäåëèì ïî èìåþùåéñÿ ñòðîêå S ñòðîêó S¢ êàê
S¢ = S[i1]S[i2]...S[ik], ãäå 1 „ i1 < i2 < … < ik „ n è 1 „ k „ n.
Î ñòðîêå S¢ ìû â ýòîì ñëó÷àå áóäåì ãîâîðèòü êàê î ïîäïîñëå-
äîâàòåëüíîñòè S è ñ÷èòàòü, ÷òî ïóñòàÿ ñòðîêà e òàêæå ÿâëÿ-
åòñÿ ïîäïîñëåäîâàòåëüíîñòüþ S.
Åñëè äàíû äâå ñòðîêè S1 è S2, òî âîçíèêàåò çàäà÷à î íà-
õîæäåíèè íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè ýòèõ
ñòðîê — lcs(S1, S2) (Longest Common Subsequence — «íàè-
áîëüøàÿ îáùàÿ ïîäïîñëåäîâàòåëüíîñòü»).
Ïðèìåð
S1 = abcdefgk, S2 = bdqfk Þ lcs(S1, S2) = bdfk.
Îïðåäåëèì V[i, j] êàê äëèíó íàèáîëüøåé îáùåé ïîä-
ïîñëåäîâàòåëüíîñòè ïðåôèêñîâ S1[1..i] è S2[1..j] —
|lcs(S1[1..i], S2[1..j])|. Êàê îíà ôîðìèðóåòñÿ? Åñëè èçâåñòíî
çíà÷åíèå V[i – 1, j – 1] è S1[i] = S2[j], òî î÷åâèäíî ðàâåíñòâî
V[i, j] = V[i – 1, j – 1] + 1 — äëèíà íàèáîëüøåé îáùåé ïîä-
ïîñëåäîâàòåëüíîñòè óâåëè÷èâàåòñÿ íà åäèíèöó. Åñëè æå
íåò — S1[i] ¹ S2[j] è îïðåäåëåíû çíà÷åíèÿ V[i – 1, j] è
V[i, j – 1] (|lcs(S1[1..i – ], S2[1..j])| è |lcs(S1[1..i], S2[1..j – ])|),
òî ñ òîé æå î÷åâèäíîñòüþ ñëåäóåò, ÷òî V[i, j] ðàâíî ìàêñè-
ìàëüíîìó èç ÷èñåë V[i – 1, j] è V[i, j – 1].
Èòàê:
l V[0, j] = 0, 0 „ j „ m;
l V[i, 0] = 0, 0 „ i „ n;
ìï V [i - 1, j - 1] + 1, åñëè S1 [i] = S [j];
l V [i, j] = í 2
ïî max(V [i - 1, j], V [i, j - 1]) — â ïðîòèâíîì ñëó÷àå.
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 175

Çàïèñü ýòîãî àëãîðèòìà â ôîðìàëèçîâàííîì âèäå ïðîñòà


è íå òðåáóåò ïîÿñíåíèé.
Procedure CreateV;
Var i,j:Word;
Begin
For i:=1 To n Do V[i,0]:=0;
For j:=1 To m Do V[0,j]:=0;
For i:=1 To n Do
For j:=1 To m Do
If S1[i]=S2[j] Then V[i,j]:=V[i–1,j–1]+1
Else V[i,j]:=max(V[i–1,j],V[i,j–1]);
{Ôóíêöèÿ íàõîäèò ìàêñèìàëüíîå èç äâóõ ÷èñåë}
End;
Ïðèìåð
Ïóñòü S1 = abcaadbbd è S2 = bcadabbdc. Â òàáë. 4.6 ïî-
êàçàí ìàññèâ V. Äëèíà íàèáîëüøåé îáùåé ïîäïîñëåäîâà-
òåëüíîñòè ðàâíà 7. Íî èõ — äâå: bcaabbd è bcadbbd. Äëÿ èõ
âûâîäà â ïðîöåññå ïîëó÷åíèÿ V ñëåäóåò ôîðìèðîâàòü è ìàñ-
ñèâ óêàçàòåëåé Vp (àíàëîãè÷íî ìàññèâó Dp èç ï. 4.1), à çàòåì
âûïîëíèòü îáðàòíûé ïðîñìîòð îò ýëåìåíòà Vp[n, m] ê
Vp[1,1]. Â òàáë. 4.6 ïîñëåäîâàòåëüíîñòü ïåðåõîäîâ ïðè îá-
ðàòíîì ïðîñìîòðå âûäåëåíà ñåðûì ôîíîì.

Òàáëèöà 4.6

Íîìåð
V 0 1 2 3 4 5 6 7 8 9
ñèìâîëà
Íîìåð
Ñèìâîë a b c a a d b b d
ñèìâîëà
0 0 0 0 0 0 0 0 0 0 0
1 b 0 0 1 1 1 1 1 1 1 1
2 c 0 0 1 2 2 2 2 2 2 2
3 a 0 1 1 2 3 3 3 3 3 3
4 d 0 1 1 2 3 3 4 4 4 4
5 a 0 1 1 2 3 4 4 4 4 4
6 b 0 1 2 2 3 4 4 5 5 5
7 b 0 1 2 2 3 4 4 5 6 6
8 d 0 1 2 2 3 4 5 5 6 7
9 c 0 1 2 3 3 4 5 5 6 7
176 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Âðåìÿ ðàáîòû ýòîãî àëãîðèòìà ïðîïîðöèîíàëüíî


O(n · m), òàê æå êàê è îáúåì èñïîëüçóåìîé ïàìÿòè. Åñëè
ðå÷ü èäåò òîëüêî î äëèíå íàèáîëüøåé îáùåé ïîäïîñëåäîâà-
òåëüíîñòè, òî äîñòàòî÷íî î÷åâèäíî åãî óïðîùåíèå. Äëèíà
lcs ðàâíà V[n, m], è ïðè ôîðìèðîâàíèè î÷åðåäíîé ñòðîêè V
äîñòàòî÷íî çíàíèÿ òîëüêî ïðåäûäóùåé ñòðîêè, ïîýòîìó òðå-
áîâàíèå ê ïàìÿòè ìîæåò áûòü óìåíüøåíî äî çíà÷åíèÿ
O(min(n, m)). Ñ ýòîé öåëüþ â ëîãèêó ôîðìèðîâàíèÿ V ââî-
äèòñÿ äîïîëíèòåëüíàÿ ïåðåìåííàÿ q, ñ ïîìîùüþ êîòîðîé
îñóùåñòâëÿåòñÿ ïåðåàäðåñàöèÿ ìåæäó äâóìÿ îäíîìåðíûìè
ìàññèâàìè ðàçìåðíîñòè min(n, m). Ïðèâåäåì ôîðìàëüíóþ
çàïèñü (ïðîöåäóðà CreateM), ïîñêîëüêó îíà ïîòðåáóåòñÿ
íàì â äàëüíåéøèõ ïîèñêàõ óëó÷øåíèé ïåðâîíà÷àëüíîãî ðå-
øåíèÿ:
Const NMax=...;
Type
TArray=Array[0..NMax] Of Integer;
FArray=Array[0..1] Of TArray;
...
Procedure CreateM(S1,S2:String;Var V:TArray);
{Ïàðàìåòðû ýòîé ïðîöåäóðû ïîòðåáóþòñÿ
â äàëüíåéøåì èçëîæåíèè}
Var Vs:FArray;
i,j,q,n,m:Integer;
Begin
n:=Length(S1);
m:=Length(S2);
For j:=0 To m Do Vs[0,j]:=0;
{Èíèöèàëèçàöèÿ äàííûõ}
Vs[1,0]:=0;
q:=0;
{Ïåðåêëþ÷àòåëü ñòðîê ìàññèâà Vs}
For i:=1 To n Do Begin
q:=1-q;
For j:=1 To m Do
If S1[i]=S2[j] Then Vs[q,j]:=Vs[1-q,j-1]+1
Else Vs[q,j]:=Max(Vs[1-q,j],Vs[q,j-1]);
End;
V:=Vs[q];
{Ðåçóëüòàò – ïîñëåäíÿÿ ñôîðìèðîâàííàÿ ñòðîêà}
End;
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 177

Èòàê, òðåáîâàíèÿ ïî ïàìÿòè ñîêðàùåíû, ðåçóëüòàò


îïðåäåëÿåòñÿ çíà÷åíèåì V[q, m], íî âîçìîæíîñòè îáðàòíîãî
ïðîñìîòðà ñ öåëüþ âûâîäà ñàìîé lcs ìû ëèøèëèñü. À ìîæíî
ëè è â ýòîì ñëó÷àå íàéòè íå òîëüêî äëèíó lcs, íî è âûâåñòè
ñàìó ïîñëåäîâàòåëüíîñòü? Åñòåñòâåííûé ïóòü ïîèñêà: ðàç-
áèâêà ñòðîê íà ïîäñòðîêè, ðåøåíèå çàäà÷ äëÿ ïîäñòðîê, ðå-
êóðñèâíàÿ ðåàëèçàöèÿ ýòîé ñõåìû è ñêëåéêà ðåçóëüòàòîâ íà
âûõîäå èç ðåêóðñèâíîãî ñïóñêà. Âñÿ ñëîæíîñòü â òîì, êàê
ðàçáèòü ñòðîêè S1 è S2. Ñëåäóåò âûáðàòü ïàðó ÷èñåë (is, js)
òàê, ÷òîáû ðåøåíèå çàäà÷è äëÿ ïîäñòðîê S1[1..is], S2[1..js] è
S1[is + 1..n], S2[js + 1..m] (èõ ñêëåéêà) äàâàëî ðåçóëüòàò
äëÿ S1 è S2. Àíàëîãè÷íóþ ïàðó ÷èñåë ñëåäóåò íàõîäèòü è
äëÿ êàæäîé ñëåäóþùåé ïàðû ïîäñòðîê. Òàêàÿ çàäà÷à, ïðè
óñïåøíîñòè íàõîæäåíèÿ (is, js), îáëàäàëà áû ñâîéñòâîì àä-
äèòèâíîñòè.
Ïóñòü, êàê è ðàíåå, S1 = abcaadbbd è S2 = bcadabbdc.
Ðàçîáüåì S1 íà äâå ïîäñòðîêè S11 è S12 (äåëåíèåì ïîïîëàì —
is:=n Div 2). Äëÿ êàæäîé ïàðû (S11, S2) è (S12, S2) «ïðîãî-
íèì» ëîãèêó CreateM. Ðåçóëüòàòû ïðåäñòàâëåíû â òàáë. 4.7
è òàáë. 4.8.

Òàáëèöà 4.7

Íîìåð
V 0 1 2 3 4 5 6 7 8 9
ñèìâîëà
Íîìåð
Ñèìâîë b c a d a b b d c
ñèìâîëà
0 0 0 0 0 0 0 0 0 0 0
1 a 0 0 0 1 1 1 1 1 1 1
2 b 0 1 1 1 1 1 2 2 2 2
3 c 0 1 2 2 2 2 2 2 2 3
4 a 0 1 2 3 3 3 3 3 3 3

Ïîäñòðîêè abca è bcadabbdc èìåþò íàèáîëüøóþ îá-


ùóþ ïîäïîñëåäîâàòåëüíîñòü äëèíû 3, è â íàøåì ðàñïîðÿ-
æåíèè îñòàëàñü òîëüêî ïîñëåäíÿÿ ñòðîêà ñ ðåçóëüòàòîì
(îáîçíà÷èì åå êàê V1). Ïîäñòðîêè adbbd è bcadabbdc èìåþò
lcs äëèíû 5, è ó íàñ åñòü ìàññèâ ñ ðåçóëüòàòîì V2. À ÷òî äàëü-
øå? Ìîæíî ðàçáèâàòü S2 ïî òàêîìó æå ïðèíöèïó, íî îùó-
ùåíèÿ ãàðàíòèðîâàííîñòè ðåçóëüòàòà âñå æå íå âîçíèêàåò.
178 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Òàáëèöà 4.8

Íîìåð
V 0 1 2 3 4 5 6 7 8 9
ñèìâîëà
Íîìåð
Ñèìâîë b c a d a b b d c
ñèìâîëà
0 0 0 0 0 0 0 0 0 0 0
1 a 0 0 0 1 1 1 1 1 1 1
2 d 0 0 0 1 2 2 2 2 2 2
3 b 0 1 1 1 2 2 3 3 3 3
4 b 0 1 1 1 2 2 3 4 4 4
5 d 0 1 1 1 2 2 3 4 5 5

Ïðîàíàëèçèðóåì V1 (ïîñëåäíÿÿ ñòðîêà â òàáë. 4.7). Â íåé


íåÿâíûì îáðàçîì çàëîæåíà èíôîðìàöèÿ î ñïîñîáàõ âûðàâ-
íèâàíèÿ S12 îòíîñèòåëüíî S2 — òî÷íåå, î ïîñëåäíåì ñèìâî-
ëå S12 îòíîñèòåëüíî S2. Ñïîñîáû òàêîãî âûðàâíèâàíèÿ ïðè-
âåäåíû â òàáë. 4.9. Çíà÷åíèå ìàêñèìóìà â V1 äîñòèãàåòñÿ
óæå íà ýëåìåíòå V1[3], ÷òî ñîîòâåòñòâóåò ïîñëåäíåé ñòðîêå â
òàáë. 4.9.

Òàáëèöà 4.9

b c a d a b b d c
a __ b __ c a
a b __ __ c a
a __ __ __ b __ c a
a __ __ b __ __ c a
a b c __ __ a
a b c a

Èòàê, çíà÷åíèå 3 äîñòèãàåòñÿ óæå íà ïîäñòðîêàõ abca è


bca — V1[3]. Åñëè èç S2 óáðàòü bca, òî îñòàíåòñÿ ñòðîêà
dabbdc. Äëèíà íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè
S12 (adbbd) è dabbdc ðàâíà 4 — V2[m] – V2[3]. Âîçíèêàåò
ïðåäïîëîæåíèå î òîì, ÷òî â êà÷åñòâå js ñëåäóåò âçÿòü çíà÷å-
íèå j, ïðè êîòîðîì äîñòèãàåòñÿ ìàêñèìóì âåëè÷èíû
V1[j] + V2[m] – V2[j]. Ïðîâåðèì åãî (è èäåþ â öåëîì), èáî
åãî ôîðìàëèçàöèÿ íå ïðåäñòàâëÿåò îñîáîé ñëîæíîñòè
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 179

(ôóíêöèÿ Lcs). Åñëè îíà ðàáîòîñïîñîáíà1), òî âåñü îñíîâ-


íîé êîä ñâåäåòñÿ ê ââîäó ñòðîê è âûâîäó ðåçóëüòàòîâ ðàáî-
òû ôóíêöèè.
Function Lcs(S1,S2:String):String;
Var n,m,i,j,is,js,max:Integer;
V1,V2:TArray;
Begin
n:=Length(S1);
m:=Length(S2);
If (n=0) Or (m=0) Then Lcs:=''
Else If S1=S2 Then Lcs:=S1
Else
If n=1 Then Begin
{Íàõîäèì ñèìâîë S1 â S2}
j:=1;
While (j<=m) And (S1[1]<>S2[j]) Do j:=j+1;
If j>=m+1 Then Lcs:=''
Else Lcs:=S2[j];
End
Else Begin
is:=n Div 2;
CreateM(Copy(S1,1,is),S2,V1);
CreateM(Copy(S1,is+1,n-is),S2,V2);
js:=0; max:=0;
For j:=1 To m Do
If (V1[j]<>0) And ((V1[j]+V2[m]-
V2[j])>max)
Then Begin
js:=j;
max:=V1[j]+V2[m]-V2[j];
End;
Lcs:=Lcs(Copy(S1,1,is),Copy(S2,1,js)) +
Lcs(Copy(S1,is+1,n-is),
Copy(S2,js+1,m-js));
End;
End;

1)
 êíèãå Á. Ñìèòà (ñ. 288–291) äîêàçûâàåòñÿ (ëåììû, òåîðåìà) ïðàâèëüíîñòü
äàííîãî ðåçóëüòàòà, íî íàñ èíòåðåñóåò íå êîíå÷íûé ðåçóëüòàò êàê òàêîâîé,
îôîðìëåííûé äîêàçàòåëüíî, à ïðîöåññ åãî «ðîæäåíèÿ» (ïðåäïîëàãàåìûé)
ó ñïåöèàëèñòà ïî èíôîðìàòèêå. Ìîæíî ñ îïðåäåëåííîé äîëåé óâåðåííîñòè
óòâåðæäàòü, ÷òî ëåììû è òåîðåìû îôîðìëÿþòñÿ óæå ïîñëå åãî ïîëó÷åíèÿ
(è íå âñåãäà óäà÷íî).
180 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Äëÿ ðàññìàòðèâàåìîãî ïðèìåðà (è åìó ïîäîáíûõ) ïðèâå-


äåííàÿ âûøå ëîãèêà äàåò ïðàâèëüíûé ðåçóëüòàò. Ðàçáèâêà
íà ïîäñòðîêè ïðîèñõîäèò òàê, êàê îïèñàíî ðàíåå, è ìû ïî-
ëó÷àåì îäíó èç îáùèõ ïîäïîñëåäîâàòåëüíîñòåé, à èìåííî
bcadbbd. Îäíàêî íå áóäåì òîðîïèòüñÿ. Âîçüìåì ñòðîêè èç
îäíîé áóêâû a ðàçíîé äëèíû, íàïðèìåð S1 = aaaaaa è
S2 = aaaaa. Ïðè ïåðâîì âûçîâå ôóíêöèè Lcs çíà÷åíèå is áó-
äåò ðàâíî 3, à js — 1, è ðåêóðñèâíûå âûçîâû Lcs âûïîëíÿþò-
ñÿ ñ ïîäñòðîêàìè: ïåðâûé — S11 = aaa è S21 = a; âòîðîé —
S12 = aaa è S22 = aaaa, ÷òî ïðèâîäèò ê ÿâíî íåòî÷íîìó ðå-
çóëüòàòó, à èìåííî lcs = aaaa. Âîïðîñ î âîçìîæíîñòè äîâå-
äåíèÿ ôóíêöèè Lcs äî ðàáîòîñïîñîáíîãî ñîñòîÿíèÿ âûíåñåí
â óïðàæíåíèÿ.

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåðû äâóõ ñòðîê è âû÷èñëèòå âðó÷íóþ
äëèíó èõ íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè.
Âûïîëíèòå îáðàòíûé ïðîñìîòð ïî çíà÷åíèÿì èç V è íàé-
äèòå âñå lcs (åñëè èõ íåñêîëüêî).
2. Èñêëþ÷èì â ðàññòîÿíèè Â. Ëåâåíøòåéíà îïåðàöèþ ïîä-
ñòàíîâêè Re. Òî÷íåå, áóäåì ñ÷èòàòü, ÷òî ýòà îïåðàöèÿ
èìååò âåñ 2 è âûïîëíÿåòñÿ ïóòåì óäàëåíèÿ ñèìâîëà èç
S1 è ïîñëåäóþùåé âñòàâêè ñèìâîëà, ðàâíîãî ñîîòâåò-
ñòâóþùåìó ñèìâîëó èç S2. Ïîêàæèòå, ÷òî â ýòîì ñëó÷àå
d(S1, S2) = n + m – 2 · lcs(S1, S2).
3. Äîïîëíèòå ëîãèêó âû÷èñëåíèÿ äëèíû íàèáîëüøåé îá-
ùåé ïîäïîñëåäîâàòåëüíîñòè S1 è S2 âû÷èñëåíèåì ìàññè-
âà óêàçàòåëåé è ïîñëåäóþùèì âûâîäîì âñåõ lcs(S1, S2).
4. Èññëåäóéòå âîçìîæíîñòü äîâåäåíèÿ ðåêóðñèâíîé ñõåìû
âû÷èñëåíèÿ lcs äî ðàáîòîñïîñîáíîãî ñîñòîÿíèÿ.

4.3.2. Àëãîðèòì Ä. Õàíòà – Ò. Çèìàíñêîãî


Âîîáðàæåíèå âàæíåå, ÷åì çíàíèÿ. Çíà-
íèÿ îãðàíè÷åíû, òîãäà êàê âîîáðàæå-
íèå îõâàòûâàåò öåëûé ìèð, ñòèìóëè-
ðóÿ ïðîãðåññ, ïîðîæäàÿ ýâîëþöèþ.
Àëüáåðò Ýéíøòåéí
Äàííûé àëãîðèòì îñíîâàí (êàê ýòî, âåðîÿòíî, è áûâàåò
ñ íîâûìè ðåçóëüòàòàìè) íà äîñòàòî÷íî ïðîñòîé èäåå. Ïîÿñ-
íèì åå ñ ïîìîùüþ ïðèìåðà. Ïðåäñòàâèì ðàññìàòðèâàåìûå
ñòðîêè S1 = abcaadbbd è S2 = bcadabbdc íà êâàäðàòíîé ñåò-
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 181

êå, êàê ïîêàçàíî íà ðèñ. 4.4. Òî÷êàìè âûäåëåíû óçëû ñåòêè,


ñîîòâåòñòâóþùèå ñîâïàäàþùèì ñèìâîëàì â S1 è S2. Ýòè òî÷-
êè ìîæíî ñîåäèíÿòü äðóã ñ äðóãîì îòðåçêàìè è ïîëó÷àòü ðàç-
ëè÷íûå ëîìàíûå ëèíèè. Ñîâïàäàþùèì ïîäïîñëåäîâàòåëü-
íîñòÿì â S1 è S2 òîãäà ñîîòâåòñòâóþò ñòðîãî óáûâàþùèå äèà-
ãîíàëüíûå (áåç ãîðèçîíòàëüíûõ è âåðòèêàëüíûõ îòðåçêîâ)
ëèíèè, à íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè ñîîòâåò-
ñòâóåò ëèíèÿ, ñîñòîÿùàÿ èç íàèáîëüøåãî êîëè÷åñòâà òàêèõ
îòðåçêîâ.

Ðèñ. 4.4. Ñåòêà äëÿ ïðåäñòàâëåíèÿ ñòðîê

Òàêèì îáðàçîì, çàäà÷à î íàõîæäåíèè íàèáîëüøåé îá-


ùåé ïîäïîñëåäîâàòåëüíîñòè ýêâèâàëåíòíà ïîèñêó ìàêñè-
ìàëüíîé ìîíîòîííî âîçðàñòàþùåé ïîñëåäîâàòåëüíîñòè òà-
êèõ ïàð ÷èñåë (i, j), ÷òî S1[i] = S2[j]. Ïî ðèñ. 4.4 äëÿ ðàñ-
ñìàòðèâàåìîãî ïðèìåðà åå î÷åíü ïðîñòî âûïèñàòü, õîòÿ
íîìåðà ñèìâîëîâ ñòðîê íå ïðèâåäåíû íà ðèñ. 4.4: (2, 1),
(3, 2), (4, 3), (5, 5), (7, 6), (8, 7), (9, 8). Íî êðîìå ìàêñèìàëü-
íîé ïîñëåäîâàòåëüíîñòè íà ðèñ. 4.4 ÿâíî ïðîñìàòðèâàþòñÿ è
äðóãèå îáùèå ïîäïîñëåäîâàòåëüíîñòè S1 è S2, îäíà èç êîòî-
ðûõ èçîáðàæåíà ïóíêòèðíîé ëèíèåé.
182 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Ñëåäóþùèì øàãîì ÿâëÿåòñÿ íîâûé ñïîñîá îïèñàíèÿ


âçàèìîñâÿçè ñèìâîëîâ â ñòðîêàõ S1 è S2. Ââåäåì äâóìåðíûé
ìàññèâ V. Ïåðâûì èíäåêñîì (i) â íåì ÿâëÿåòñÿ íîìåð ñèìâî-
ëà â S1, âòîðûì (q) — äëèíà îáùåé ïîäïîñëåäîâàòåëüíîñòè
ïðåôèêñà S1[1..i] è S2, à çíà÷åíèåì ýëåìåíòà ìàññèâà V[i, q]
ÿâëÿåòñÿ ìèíèìàëüíîå çíà÷åíèå j (íîìåðà ñèìâîëà â S2), íà
êîòîðîì äëèíà íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè
ïðåôèêñîâ S1[1..i] è S2[1..j] ðàâíà çíà÷åíèþ q.
Ïîäñ÷èòàåì âðó÷íóþ çíà÷åíèÿ, íàïðèìåð äëÿ V[7], ò. å.
äëÿ ïðåôèêñà ñòðîêè S1, ðàâíîãî abcaadb. Ïóñòü q = 1. Ìè-
íèìàëüíîå çíà÷åíèå j, äëÿ êîòîðîãî äëèíà îáùåé ïîñëåäîâà-
òåëüíîñòè S1[1..i] è S2[1..j] ðàâíà q, åñòü åäèíèöà — S2[1..1].
Àíàëîãè÷íî, äëÿ q = 2 (bc), 3 (bca), 4 (bcad). Äëÿ q = 5 òðå-
áóåòñÿ âçÿòü ïðåôèêñ S2 èç øåñòè ñèìâîëîâ — bcadab. Åñëè
ïðîäåëàòü òàêóþ æå ðàáîòó äëÿ âñåõ îñòàâøèõñÿ ïðåôèêñîâ
S1, òî ìû ïîëó÷èì ìàññèâ ñëåäóþùåãî âèäà (ïðè óñëîâèè,
÷òî ïåðâîíà÷àëüíî åãî ýëåìåíòàì ïðèñâàèâàþòñÿ çíà÷åíèÿ
m + 1, à ýëåìåíòàì íóëåâîãî ñòîëáöà — çíà÷åíèÿ 0):
æ 0 10 10 10 10 10 10 10 10 10 ö
ç ÷
ç 0 3 10 10 10 10 10 10 10 10 ÷
ç 0 1 6 10 10 10 10 10 10 10 ÷
ç ÷
ç 0 1 2 9 10 10 10 10 10 10 ÷
ç 0 1 2 3 10 10 10 10 10 10 ÷
V =ç ÷
ç 0 1 2 3 5 10 10 10 10 10 ÷
ç ÷
ç 0 1 2 3 4 8 10 10 10 10 ÷
ç 0 1 2 3 4 6 10 10 10 10 ÷
ç ÷
ç 0 1 2 3 4 6 7 10 10 10 ÷
ç 0 1 2 3 4 6 7 8 10 10 ÷
è ø
Èìåÿ â ñâîåì ðàñïîðÿæåíèè ìàññèâ V, âûïèñàòü ìàêñè-
ìàëüíóþ ìîíîòîííî âîçðàñòàþùóþ ïîñëåäîâàòåëüíîñòü òà-
êèõ ïàð ÷èñåë (i, j), ÷òî S1[i] = S2[j], íå ñîñòàâëÿåò òðóäà.
×òî îòðàæàåòñÿ â ìàññèâå V? Â öåëîì — íåêîå ïîäîáèå
ïóòè íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè äâóõ ñòðîê
S1 è S2, ãäå èíäåêñ i (íîìåð ñòðîêè) îïðåäåëÿåò íîìåð ñèìâî-
ëà S1, èíäåêñ q (íîìåð ñòîëáöà) — íîìåð ñèìâîëà â lcs, à çíà-
÷åíèå V[i, q] — ìèíèìàëüíîå çíà÷åíèå äëèíû ïðåôèêñà S2,
ïðè êîòîðîì ïîëó÷àåòñÿ ýòà lcs.
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 183

Èòàê, V [i, q] = min (j). Êàê ôîðìèðóåòñÿ ýëåìåíò V[i, q]?


1 £ j £ | S2 |
Ìîæíî óòâåðæäàòü, ÷òî çíà÷åíèå V[i, q] íàõîäèòñÿ â èíòåð-
âàëå îò V[i – 1, q – 1] äî V[i – 1, q] (ïðîâåðüòå ýòî óòâåðæäå-
íèå íà ïðèâåäåííîì ìàññèâå V). Äåéñòâèòåëüíî, åñëè
S1[i] ¹ S2[j], òî lcs íå ìîæåò áûòü ïðîäîëæåíà ñèìâîëîì S1[i],
è V[i, q] = V[i – 1, q]. Ðàññìîòðèì òåïåðü ñëó÷àé ðàâåíñòâà
S1[i] = S2[j] è ðàçáåðåìñÿ ñ ëåâîé ãðàíèöåé èíòåðâàëà. Çíà÷å-
íèå j äëÿ íàèáîëüøåé îáùåé ïîñëåäîâàòåëüíîñòè äëèíû q íå
ìîæåò áûòü ìåíüøå çíà÷åíèÿ j äëÿ lcs äëèíû q – 1. Äåéñòâè-
òåëüíî, lcs(S1[1..i], S2[1..V[i, q]]) îáðàçóåòñÿ ïóòåì äîáàâëå-
íèÿ îäíîãî ñèìâîëà èç S1 è S2 ê lcs(S1[1..i – 1], S2[1..V[i – 1, q]]),
ò. å. V[i – 1, q – 1] < V[i, q]. Îïðåäåëèì ïðàâóþ ãðàíèöó:
V[i, q] „ V[i – 1, q]. Òàê êàê íàèáîëüøàÿ îáùàÿ ïîäïîñëåäî-
âàòåëüíîñòü äëèíû q óæå ïîñòðîåíà, òî ïðè ôîðìèðîâàíèè
ëó÷øåé lcs ýòîé äëèíû (q) íåîáõîäèìî âçÿòü ñèìâîë èç S2, îá-
ëàäàþùèé áîëüøèì «ïîòåíöèàëîì» ñîçäàíèÿ lcs (ò. å. ñèì-
âîë ñ ìåíüøèì èíäåêñîì), òîãäà â ñóôôèêñå S2[j..m] îêàæåò-
ñÿ áîëüøå ñèìâîëîâ, êîòîðûå ìîãóò âõîäèòü â lcs.
Ôîðìàëèçîâàííàÿ çàïèñü ýòîé ëîãèêè èìååò âèä:

Procedure Build;
Var i,j,q,t:Integer;
Begin
t:=1;
For i:=1 To n Do Begin
For j:=m DownTo 1 Do
{Ñêàíèðóåì âòîðóþ ñòðîêó â îáðàòíîì íàïðàâëåíèè.
 ìàññèâå V èùóòñÿ èíäåêñû j, óäîâëåòâîðÿþùèå
óñëîâèþ: V[i–1,q–1]<jm<jm–1<...<j1<V[i–1,q]}
If S1[i]=S2[j] Then Begin
q:=Find(V[i-1],j);
{Ïîèñê "ñàìîãî ëåâîãî" èíäåêñà,
óäîâëåòâîðÿþùåãî óñëîâèþ}
If q<>0 Then Begin V[i,q]:=j; t:=q; End;
{Çàïîìèíàåì çíà÷åíèå q, òàê êàê â ýòîé ñòðîêå
ïîòðåáóåòñÿ êîððåêòèðîâêà çíà÷åíèé (ïóòåì
ïåðåïèñûâàíèÿ èç ïðåäûäóùåé ñòðîêè) V
ñ ìåíüøèìè èíäåêñàìè}
End;
184 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

For j:=1 To t-1 Do


If V[i,j]>=m Then V[i,j]:=V[i-1,j];
{Çíà÷åíèåì m+1 áûëè ïðîèíèöèàëèçèðîâàíû âñå
ýëåìåíòû V, êðîìå ýëåìåíòîâ èç íóëåâîãî ñòîëáöà}
End;
End;

Íàçíà÷åíèå ôóíêöèè Find ñòðîãî îïðåäåëåíî: íàéòè


÷èñëî â èíòåðâàëå îò V[i – 1, q – 1] äî V[i – 1, q], îïðåäåëÿ-
þùåå äëèíó lcs, ïðè çàäàííîì íîìåðå ñèìâîëà S2 (ýòèì ñèì-
âîëîì lcs ìîæåò áûòü óâåëè÷åíà íà åäèíèöó, ïîñêîëüêó
Find âûçûâàåòñÿ ïðè óñëîâèè ðàâåíñòâà S1[i] è S2[j]).
Function Find(A:TArray;w:Integer):Integer;
{Â ðàçäåëå òèïîâ (Type) îïðåäåëÿåì:
TArray=Array[0..NMax] Of Integer;
FArray=Array[0..NMax] Of TArray, òîãäà â íîòàöèè
Ïàñêàëÿ ñòðîêó ìàññèâà ìîæíî ïåðåäàòü êàê ïàðàìåòð}
Var i:Integer;
Begin
i:=1;
While (i<m+1) And (A[i]<w) Do i:=i+1;
If A[i]=w Then Find:=0
{Òðåáóåòñÿ íàéòè ìåíüøåå, ÷åì w, çíà÷åíèå èíäåêñà, -
òîëüêî â ýòîì ñëó÷àå lcs ìîæíî óëó÷øèòü}
Else Find:=i;
End;

Ïî îêîí÷àíèè ðàáîòû ïðîöåäóðû Build çíà÷åíèå äëèíû


íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè ñòðîê S1 è S2
îïðåäåëÿåòñÿ ìàêñèìàëüíûì îïðåäåëåííûì (íå ðàâíûì
m + 1) çíà÷åíèåì V[n, q].
Âðåìåííàÿ ñëîæíîñòü àëãîðèòìà — O(n · m · q), ãäå q —
äëèíà íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè. Äåéñòâè-
òåëüíî, ïóñòü ñòðîêè S1 è S2 ðàâíû è ñîñòîÿò èç îäíîãî ñèì-
âîëà (íàïðèìåð, an). Òîãäà ïîèñê ïîçèöèè j áóäåò âûïîë-
íÿòüñÿ n · m ðàç, à âðåìÿ ïîèñêà áóäåò ïðîïîðöèîíàëüíî
äëèíå óæå èìåþùåéñÿ lcs.
Ìîæíî ëè óëó÷øèòü ýòîò àëãîðèòì? Ñàìûì î÷åâèäíûì
óëó÷øåíèåì ÿâëÿåòñÿ îïòèìèçàöèÿ ôóíêöèè Find — ïîèñ-
êà ïîçèöèè â ìàññèâå îáùèõ ïîñëåäîâàòåëüíîñòåé. Çíà÷å-
íèÿ ýëåìåíòîâ ìàññèâà V (â ñòðîêå) ÿâëÿþòñÿ âîçðàñòàþùåé
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 185

ïîñëåäîâàòåëüíîñòüþ ÷èñåë, ïîýòîìó ëèíåéíûé ïîèñê èí-


äåêñà ìîæåò áûòü çàìåíåí íà áèíàðíûé ïîèñê. Âðåìåííàÿ
ñëîæíîñòü àëãîðèòìà â ýòîì ñëó÷àå îöåíèâàåòñÿ êàê
O(n · m · log2q). Íîâàÿ âåðñèÿ Find âûãëÿäèò òàê:
Function Find(A:TArray;w:Integer):Integer;
Var up, down, mid:Integer;
Begin
up:=m+1; down:=0;
While down+1<up Do Begin
mid:=(down+up) Shr 1;
If A[mid]<=w Then down:=mid Else up:=mid;
End;
If A[down]<>w Then Find:=up Else Find:=0;
End;
Âòîðîå óëó÷øåíèå òîæå ÿâíî ïðîñìàòðèâàåòñÿ èç ðàíåå
ïðèâåäåííîé ëîãèêè — ýòî ïîèñê ñîâïàäàþùèõ ñèìâîëîâ:
For i:=1 To n Do Begin
For j:=m DownTo 1 Do
If S1[i]=S2[j] Then ...
Ýòà êîíñòðóêöèÿ äàåò íàì êâàäðàòè÷íóþ âðåìåííóþ
îöåíêó — O(n · m). Âåðîÿòíî, åäèíñòâåííûé ïóòü ðåøåíèÿ
ïðîáëåìû çàêëþ÷àåòñÿ â âûíåñåíèè ÷àñòè ðàáîòû íà ñòàäèþ
ïðåäâàðèòåëüíîé îáðàáîòêè. Âîçüìåì áîëåå äëèííóþ ñòðî-
êó è ïðåäñòàâèì íîìåðà ïîçèöèè ñ îäèíàêîâûìè ñèìâîëàìè
â âèäå ñâÿçíîãî ñïèñêà (çäåñü ýòà ïðîöåäóðà íå ïðèâîäèòñÿ).
Òîãäà, çíàÿ ñèìâîë, ìû îäíîçíà÷íî âûáèðàåì ñïèñîê, ñî-
äåðæàùèé íîìåðà ïîçèöèé, â êîòîðûõ îí íàõîäèòñÿ. Âîç-
ìîæíîå îïèñàíèå äàííûõ äëÿ ðåàëèçàöèè ýòîé èäåè — ñëå-
äóþùåå:
Type
PListEl=^TListEl;
TListEl=Record
x:Integer;
next:PListEl;
End;
TListAr=Array[Byte] Of PListEl;
Var AListEl:TListEl;
Èçìåíåííàÿ âåðñèÿ ïðîöåäóðû Build (ïðåîáðàçóåì åå â
ôóíêöèþ) âûãëÿäèò òàê:
186 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Function Build:Integer;
Var i,j,q,t:Integer;
p:PListEl;
Begin
t:=1;
For i:=1 To n Do Begin
p:=AListEl[Byte(S1[i])];
{Ôóíêöèÿ Byte ïðåîáðàçóåò ñèìâîë â åãî äâîè÷íîå
ïðåäñòàâëåíèå — ÷èñëî. Ñïèñêè íîìåðîâ ïîçèöèé
ñèìâîëîâ â S2 îðãàíèçîâàíû â óáûâàþùåì ïîðÿäêå}
While p<>Nil Do Begin
q:=Find(V[i-1],p^.x);
If q>0 Then Begin V[i,q]:=p^.x; t:=q; End;
p:=p^.next;
End;
For j:=1 To t-1 Do
If V[i,j]>=m Then V[i,j]:=V[i-1,j];
End;
Build:=t-1;
End;
Âðåìÿ ðàáîòû òàêîãî àëãîðèòìà óìåíüøàåòñÿ ñ îöåíêè
O(n · m) äî O(n + r), ãäå r — êîëè÷åñòâî ïàð ñîâïàäàþùèõ
ñèìâîëîâ â S1 è S2. Îäíàêî åñòü åùå êîíñòðóêöèÿ
For j:=1 To t-1 Do
If V[i,j]>=m Then V[i,j]:=V[i-1,j];.

Òàêèì îáðàçîì, îáùàÿ âðåìåííàÿ îöåíêà îñòàåòñÿ â âèäå


O((n + r) · log2q + n · q). Äëÿ õóäøåãî ñëó÷àÿ (ñîâïàäàþ-
ùèõ ñòðîê) ìû èìååì O((n + n · n) · log2n + n · n), à äëÿ
ñòðîê èç ðàçíûõ ñèìâîëîâ — O(n).
Ñïîñîá óìåíüøåíèÿ òðåáîâàíèé ê èñïîëüçóåìîé ïàìÿòè
(óõîä îò ìàññèâà V) òàêæå î÷åâèäåí. Äëÿ âû÷èñëåíèÿ çíà÷å-
íèé ýëåìåíòîâ ñòðîêè V[i] èñïîëüçóåòñÿ òîëüêî ïðåäûäóùàÿ
ñòðîêà V[i – 1], ïðè÷åì îáðàáîòêà âåäåòñÿ ïî ñòîëáöàì, ÷òî
äàåò âîçìîæíîñòü âûïîëíèòü çàìåíó äâóìåðíîãî ìàññèâà íà
îäíîìåðíûé. Íî ýòî ïîçâîëÿåò çàîäíî èñêëþ÷èòü «äîáàâêó»
ê ëîãèêå â âèäå çàïîëíåíèÿ íåîïðåäåëåííûõ çíà÷åíèé
V[i, q], ÷òî ñâîäèò âðåìåííóþ îöåíêó ê O((n + r) · log2q).
Îäíàêî ïðè ýòîì ìû ëèøàåìñÿ äàííûõ äëÿ âûâîäà ñàìîé
íàèáîëüøåé îáùåé ïîñëåäîâàòåëüíîñòè è îïðåäåëÿåì òîëü-
êî åå äëèíó. ×òîáû íå èñêëþ÷àòü ýòîé âîçìîæíîñòè, ñëåäó-
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 187

åò èçìåíèòü êîíñòðóêöèþ (ïðè èñòèííîñòè óñëîâèÿ) If q>0


Then Begin V[i,q]:=p^.x; t:=q; End; — íåîáõîäèìî çà-
ïîìèíàòü âñå ïàðû îäèíàêîâûõ ñèìâîëîâ â òîì ïîðÿäêå, â
êîòîðîì îíè ïðîõîäèëèñü â óñëîâèè, à òàêæå íîìåð ïîçè-
öèè ýòèõ ñèìâîëîâ â lcs. Äëÿ ýòîé öåëè ñëåäóåò èñïîëüçî-
âàòü åùå îäèí ñâÿçíûé ñïèñîê òèïà:
Type
PSeqEl=^TSeqEl;
TSeqEl=Record
xv:Integer;
yv:Integer;
sv:Integer;
next:PSeqEl;
End;
Var pt:PseqEl;
{Óêàçàòåëü íà ïåðâûé ýëåìåíò ñïèñêà -
ãëîáàëüíàÿ ïåðåìåííàÿ}
 êà÷åñòâå ñïðàâî÷íîãî ìàòåðèàëà ïðèâåäåì ïðîöåäóðó
âñòàâêè â íà÷àëî ñïèñêà1):
Procedure AddSeq(Var sq:PSeqEl; Const a,b,c:Integer);
Var temp:PSeqEl;
Begin
New(temp);
temp^.xv:=a;
temp^.yv:=b;
temp^.sv:=c;
temp^.next:=sq;
sq:=temp;
End;
Ïîñëå ýòèõ ðàçìûøëåíèé íîâàÿ âåðñèÿ ôóíêöèè Build
áóäåò âûãëÿäåòü òàê:
Function Build:Integer;
Var i,j,q,t:Integer;
p:PListEl;
Begin
t:=1; {Êîëè÷åñòâî ýëåìåíòîâ â ìàññèâå V}

1)
Îêóëîâ Ñ. Ì. Ðàçâèòèå èíòåëëåêòà øêîëüíèêà. Àáñòðàêòíûå òèïû äàí-
íûõ. — Ì.:ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2009.
188 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

For i:=1 To n Do Begin


p:=AList[Byte(S1[i])];
{Âûáèðàåì ñïèñîê íîìåðîâ ïîçèöèé âõîæäåíèÿ
ñèìâîëà S1[i] â ñòðîêó S2}
While p<>Nil Do Begin
q:=Find(V,p^.x,t);
{Ìàññèâ V èìååò òèï:
TArray=Array[0..NMax] Of Integer;}
If q>0 Then Begin
t:=Max(t,q+1);
AddSeq(pt,i,p^.x,q);
V[q]:=p^.x;
End;
p:=p^.next;
End;
End;
Build:=t-1;
End;

Îñòàëîñü ïðèâåñòè ïðîöåäóðó âûâîäà íàèáîëüøåé îá-


ùåé ïîäïîñëåäîâàòåëüíîñòè (Path) è íà ýòîì çàêîí÷èòü ðà-
áîòó ïî îïòèìèçàöèè àëãîðèòìà Ä. Õàíòà è Ò. Çèìàíñêîãî:
Procedure Path;
Var temp:PSeqEl;
i,j,ln:Integer;
Begin
temp:=pt;
{pt – óêàçàòåëü íà ïåðâûé ýëåìåíò
ñïèñêà ñèìâîëîâ, îáðàçóþùèõ íàèáîëüøóþ
îáùóþ ïîäïîñëåäîâàòåëüíîñòü}
ln:=Build;
ln:=ln+1;
lcs:='';
{Ãëîáàëüíàÿ ïåðåìåííàÿ ñòðîêîâîãî òèïà –
íàèáîëüøàÿ îáùàÿ ïîäïîñëåäîâàòåëüíîñòü
ñòðîê S1 è S2}
i:=MaxInt; j:=MaxInt;
{MaxInt – ìàêñèìàëüíîå öåëîå ÷èñëî}
While (temp<>Nil) And (ln>0) Do Begin
If(temp^.xv<i) And (temp^.yv<j) Then Begin
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 189

i:=temp^.xv;
j:=temp^.yv;
lcs:=S1[i]+lcs;
ln:=ln-1;
End;
temp:=temp^.next;
End;
End;
Âðåìåííàÿ îöåíêà ðàáîòû îïèìèçèðîâàííîãî âàðèàíòà
àëãîðèòìà èìååò âèä O((n + r) · log2q), ãäå n — äëèíà ìåíü-
øåé ñòðîêè, r — êîëè÷åñòâî ñîâïàäàþùèõ ñèìâîëîâ, à q —
êîëè÷åñòâî ñèìâîëîâ â îáùåé ïîäïîñëåäîâàòåëüíîñòè íàè-
áîëüøåé äëèíû.

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåðû äâóõ ñòðîê. Ïóòåì ôîðìèðîâàíèÿ
ìàññèâà V ïîäñ÷èòàéòå äëÿ íèõ äëèíó íàèáîëüøåé îá-
ùåé ïîäïîñëåäîâàòåëüíîñòè.
2. Ïóòåì îáðàòíîãî ïðîñìîòðà ýëåìåíòîâ V âûïèøèòå íàè-
áîëüøóþ îáùóþ ïîäïîñëåäîâàòåëüíîñòü ñòðîê.
3. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Ä. Õàíòà è Ò. Çèìàíñêîãî (íåîïòèìèçèðîâàííûé âàðèàíò).
4. Äàíà ñòðîêà S. Ðàçðàáîòàéòå ïðîãðàììó ôîðìèðîâàíèÿ
ñïèñêîâ èç íîìåðîâ ïîçèöèé ñ îäèíàêîâûìè ñèìâîëàìè
ñòðîêè.
5. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Ä. Õàíòà è Ò. Çèìàíñêîãî (îïòèìèçèðîâàííûé âàðèàíò).
Îöåíèòå âðåìÿ ðàáîòû â íàèõóäøåì è íàèëó÷øåì ñëó-
ֈ؛.

4.3.3. Àëãîðèòì Ë. Ýëëèñîíà – Ò. Äèêñà


Íåèçâåñòíî, ÷òî ÷åëîâåê åùå âûäó-
ìàåò: ãîëîâà — êðóãëàÿ.
Õåíðèê ßãîäçèíüñêèé
Âåñü ñìûñë ýòîãî àëãîðèòìà çàêëþ÷àåòñÿ â ïîñòðîåíèè
äâîè÷íîé ìàòðèöû R, îòðàæàþùåé ñâÿçè ìåæäó ñèìâîëàìè
ñòðîê S1 è S2, äëèíà íàèáîëüøåé îáùåé ïîñëåäîâàòåëüíîñòè
(lcs) êîòîðûõ èùåòñÿ. Ïîñòðîåíèå íà÷èíàåòñÿ ñ ïîñëåäíåé
ñòðîêè R[m]. Åñëè â àëãîðèòìå Ð. Áîéåðà – Äæ. Ìóðà îáðà-
190 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

çåö ñðàâíèâàëñÿ ñ ôðàãìåíòîì ñòðîêè ñïðàâà íàëåâî (îò ïî-


ñëåäíåãî ñèìâîëà äî ïåðâîãî), òî è çäåñü, ïî àíàëîãèè, èùåò-
ñÿ äëèíà lcs ïîñëåäíåãî ñèìâîëà S2[m] è S1, çàòåì — ñóô-
ôèêñà S2[m – 1..m] è S1 è ò. ä. Ïî îêîí÷àíèè ýòîãî ïðîöåññà
â ïåðâîé ñòðîêå R ïðåäñòàâëåíà èíôîðìàöèÿ î äëèíå lcs.
Ïî÷åìó ìû íà÷èíàåì ñ êîíöà ñòðîêè S2? Îòâåò çàêëþ-
÷àåòñÿ â òîì, ÷òî íà êàæäîì øàãå èùåòñÿ ñàìîå ïðàâîå
âõîæäåíèå lcs ñóôôèêñà S2[i..m] è ñòðîêè S1. (Ïîêà ìû íå
ãîâîðèì î òîì, êàê èìåííî ïðåäñòàâëåíà èíôîðìàöèÿ î äëè-
íå lcs â ñòðîêå.)
Âòîðàÿ èäåÿ çàêëþ÷àåòñÿ â èñïîëüçîâàíèè õàðàêòåðèñ-
òè÷åñêèõ âåêòîðîâ, îïèñûâàþùèõ âõîæäåíèå ñèìâîëîâ â
îäíó èç ñòðîê (â ðàññìàòðèâàåìîì ñëó÷àå S1, ò. å. n = m è
n < 32), è â ïðèìåíåíèè èäåîëîãèè àëãîðèòìà Shift-And
(ñì. ï. 2.4) äëÿ îñóùåñòâëåíèÿ ïåðåõîäà îò îáðàáîòêè îäíî-
ãî ñóôôèêñà S2 ê äðóãîìó.
«Ïðèâÿæåì» èçëîæåíèå ìàòåðèàëà ýòîãî ïàðàãðàôà ê
ñêâîçíîìó ïðèìåðó.

Ïðèìåð
Àëôàâèò À ñîñòîèò èç ñèìâîëîâ {a, b, c, d}. Äàíû ñòðîêè
S1 = bcadabbdc, S2 = abcaadbbd. Òðåáóåòñÿ íàéòè äëèíó
íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè ýòèõ ñòðîê.
 òàáë. 4.10 ïðåäñòàâëåíû õàðàêòåðèñòè÷åñêèå âåêòîðû
äëèíîé n áèò, îïèñûâàþùèå âõîæäåíèå ñèìâîëîâ â S1 (ìàò-
ðèöà V).

Òàáëèöà 4.10

V b c a d a b b d c
a 0 0 1 0 1 0 0 0 0
b 1 0 0 0 0 1 1 0 0
c 0 1 0 0 0 0 0 0 1
d 0 0 0 1 0 0 0 1 0

Ðåøèì ïðîñòóþ çàäà÷ó. Òðåáóåòñÿ îñòàâèòü â õàðàêòå-


ðèñòè÷åñêîì âåêòîðå îäíó åäèíèöó, îïèñûâàþùóþ òîëüêî
ñàìîå ïðàâîå âõîæäåíèå ñèìâîëà â ñòðîêó. Ïóñòü ýòî áóäåò
ñèìâîë a. Òðåáóåìàÿ ïîñëåäîâàòåëüíîñòü äåéñòâèé ïðèâåäå-
íà â òàáë. 4.11 è èìååò âèä: ((V[a] – 1) Xor V[a]) And V[a].
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 191

Òàáëèöà 4.11

V[a] 0 0 1 0 1 0 0 0 0
Åäèíèöà 0 0 0 0 0 0 0 0 1
Âû÷èòàíèå: V[a] – 1 0 0 1 0 0 1 1 1 1
(V[a] – 1) Xor V[a] 0 0 0 0 1 1 1 1 1
((V[a] – 1) Xor V[a]) And V[a] 0 0 0 0 1 0 0 0 0

À òåïåðü ÷óòü-÷óòü óñëîæíèì çàäà÷ó, âðåìåííî îòâëåê-


øèñü îò íàøåãî ñêâîçíîãî ïðèìåðà. Ïóñòü S1 = aaaaa è
S2 = aaaa, n = 5, m = 4 (çíà÷åíèå m ìîæåò áûòü è óâåëè÷å-
íî — ñìûñë îò ýòîãî íå èçìåíèòñÿ). Åäèíñòâåííûé õàðàêòå-
ðèñòè÷åñêèé âåêòîð V[a] äëÿ ñèìâîëà a ñîñòîèò èç îäíèõ
åäèíèö. Ñòðîêà ìàòðèöû R[5] — íóëåâàÿ. Ñòðîêè R ôîðìè-
ðóþòñÿ â î÷åðåäíîñòè 4, 3, 2, 1. Ïîñëåäîâàòåëüíîñòü äåé-
ñòâèé ïðèâåäåíà â òàáë. 4.12.

Òàáëèöà 4.12

R Äåéñòâèå Ðàçðÿäû
R[4] x = V[a] Or R[5] 1 1 1 1 1
t = R[5]¬ íà 1ðàçðÿä+1 0 0 0 0 1
x–t 1 1 1 1 0
x Xor (x – t) 0 0 0 0 1
x And (x Xor (x – t)) 0 0 0 0 1
R[3] x = V[a] Or R[4] 1 1 1 1 1
t = R[4]¬ íà 1ðàçðÿä + 1 0 0 0 1 1
x–t 1 1 1 0 0
x Xor (x – t) 0 0 0 1 1
x And (x Xor (x – t)) 0 0 0 1 1
R[2] x = V[a] Or R[3] 1 1 1 1 1
t = R[3]¬ íà 1ðàçðÿä + 1 0 0 1 1 1
x–t 1 1 0 0 0
x Xor (x – t) 0 0 1 1 1
x And (x Xor (x – t)) 0 0 1 1 1
R[1] x = V[a] Or R[2] 1 1 1 1 1
t = R[2]¬ íà 1ðàçðÿä + 1 0 1 1 1 1
x–t 1 0 0 0 0
x Xor (x – t) 0 1 1 1 1
x And (x Xor (x – t)) 0 1 1 1 1
192 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

æ0 1 1 1 1ö
ç ÷
ç0 0 1 1 1÷
Òàêèì îáðàçîì, R = ç . Â ñòðîêå R[4] îäíà
0 0 0 1 1÷
çç ÷÷
è0 0 0 0 1ø
åäèíèöà, è îíà ãîâîðèò î òîì, ÷òî ñóôôèêñû a ñòðîê S2 è S1
èìåþò lcs äëèíû 1 è óêàçûâàåòñÿ ñàìîå ïðàâîå âõîæäåíèå
lcs. Àíàëîãè÷íî — äëÿ ñòðîê R[3] è R[2]. Êîëè÷åñòâî æå åäè-
íèö â R[1] äàåò äëèíó lcs äëÿ ñòðîê S1 è S2.
Ðàññìîòðèì åùå îäèí ïðèìåð. Ïóñòü R[i] = 000110010,
à î÷åðåäíûì, (i – 1)-ì ñèìâîëîì S2 ÿâëÿåòñÿ ñèìâîë b (åãî
õàðàêòåðèñòè÷åñêèé âåêòîð — 100001100). Ðàçäåëèì R[i]
íà áëîêè (ðàçäåëèòåëü îáîçíà÷åí ñèìâîëîì «­»)
000­1­100­10 ïî ñëåäóþùåìó ïðàâèëó: èäåì ïî ñòðîêå ñëå-
âà íàïðàâî; áëîê çàêàí÷èâàåòñÿ ïåðåä ïåðâîé åäèíèöåé
ñïðàâà (óñëîâíî ñ÷èòàåì, ÷òî ñòðîêà R âñåãäà íà÷èíàåòñÿ ñ
åäèíèöû — íóëåâîé ñòîëáåö), à ñëåäóþùèé íà÷èíàåòñÿ ñ
ýòîé åäèíèöû; áëîê ìîæåò çàêîí÷èòüñÿ íóëåì, åñëè îí —
ïîñëåäíèé â ñòðîêå. Îáúåäèíåíèåì R[i] c V[b] ñ ïîìîùüþ
îïåðàöèè Or ôèêñèðóåòñÿ ïðèñóòñòâèå ñèìâîëîâ b â êàæäîì
áëîêå: x = R[i] Or V[b] = 100111110. Ñäâèã íà îäèí ðàçðÿä
âëåâî ñòðîêè R[i] è äîáàâëåíèå åäèíèöû ê ìëàäøåìó ðàçðÿ-
äó (t = R[i] ¬1 ðàçðÿä + 1 = 001100101) ñîõðàíÿåò ñòðóêòóðó
ðàçáèåíèÿ ñòðîêè íà áëîêè è ââîäèò îäèí (âîçìîæíûé) áëîê
â ñëåäóþùåé R[i – 1]-é ñòðîêå. Îñòàëüíûå îïåðàöèè: ((x – t)
Xor x) And x = ((100111110 – 001100101) Xor 100111110) And
100111110 = 100­100­1­10 — ðåøàþò çàäà÷ó ôèêñàöèè
ñòàðøåé åäèíèöû, íî óæå â êàæäîì áëîêå. Ñòðîêà R[i – 1]
ñîäåðæèò ÷åòûðå åäèíèöû, ò. å. ó ñóôôèêñà S2[i – 1..m] è S1
ñóùåñòâóåò lcs äëèíû 4 (îáðàòèòå âíèìàíèå, ÷òî çäåñü íå ãî-
âîðèòñÿ î òîì, èç êàêèõ ñèìâîëîâ ñîñòîèò lcs, — ãîâîðèòñÿ
ëèøü î òîì, ÷òî îíà ñîñòîèò èç ÷åòûðåõ ñèìâîëîâ!).
Îáðàòèìñÿ âíîâü ê íàøåìó ñêâîçíîìó ïðèìåðó. Îêîí÷à-
òåëüíûé âèä ìàòðèöû R ïðèâåäåí â òàáë. 4.13.
Ïóñòü ôîðìèðóåòñÿ R[4]. Èìååì: R[5] = 00­10­1­1­1­10
(ðàçäåëèëè íà áëîêè), à õàðàêòåðèñòè÷åñêèé âåêòîð ñèìâî-
ëà a ðàâåí 001010000. Ëîãè÷åñêàÿ ñóììà ðàâíà
x = 001011110. Çíà÷åíèå R[5], ñäâèíóòîå íà îäèí ðàçðÿä
âëåâî ñ ïðèáàâëåíèåì åäèíèöû, ðàâíî 010111101. Ðàçíîñòü
t = 110100001 (îáðàòèòå âíèìàíèå, ÷òî ïðèøëîñü çàèìñòâî-
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 193

Òàáëèöà 4.13

R S1 b c a d a b b d c
S2 i/j 0 1 2 3 4 5 6 7 8 9
a 1 1 1 1 1 0 1 1 1 0 1
b 2 1 1 1 1 0 1 1 1 0 1
c 3 1 0 1 1 0 1 1 1 0 1
a 4 1 0 0 1 0 1 1 1 1 0
a 5 1 0 0 1 0 1 1 1 1 0
d 6 1 0 0 0 1 0 1 1 1 0
b 7 1 0 0 0 0 0 1 1 1 0
b 8 1 0 0 0 0 0 0 1 1 0
d 9 1 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0

âàòü åäèíèöó èç íóëåâîãî ñòîëáöà). Äàëüíåéøèå äåéñòâèÿ


(îïåðàöèè Xor è And) ïðèâîäÿò ê çíà÷åíèþ R[4], ðàâíîìó
00­10­1­1­1­10. Ñòðóêòóðà lcs íå èçìåíèëàñü.
Íà ñëåäóþùåì øàãå îáðàáàòûâàåòñÿ ñóôôèêñ caadbbd.
Èìååì x = 011011111, t = 011011111 – 010111101 =
= 000100010. Îïåðàöèè Xor è And ïðèâîäÿò ê R[3] =
= 0­1­10­1­1­10­1. Çíà÷åíèå äëèíû lcs äëÿ ýòîãî ñóôôèê-
ñà è S1 ðàâíî øåñòè.
Î÷åâèäíî, ÷òî ïðè ïîäñ÷åòå äëèíû lcs íà êàæäîì øàãå
äîñòàòî÷íî çíàòü òîëüêî ïðåäûäóùóþ ñòðîêó R. Ôîðìàëè-
çîâàííàÿ çàïèñü ýòîãî ëèíåéíîãî ïî âðåìåíè âàðèàíòà ëîãè-
êè èìååò ñëåäóþùèé âèä:
Procedure Search(S1,S2:String);
Var V:Array[Chr(0)..Chr(255)] Of LongInt;
n,m,i:Byte;
r,t,x:LongInt;
j:Char;
Begin
n:=Length(S1);
m:=Length(S2);
For j:=Chr(0) To Chr(255) Do V[j]:=0;
For i:=1 To n Do V[S1[i]]:=V[S1[i]] Or
(1 ShL (n-i));
t:=0; {Çíà÷åíèå r íà ïðåäûäóùåì øàãå îáðàáîòêè}
194 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

For i:=m DownTo 1 Do Begin


x:=V[S2[i]] Or t; {Ðàáî÷àÿ ïåðåìåííàÿ}
r:=x And ((x-((t ShL 1)+1)) Xor x);
t:=r; {Çàïîìèíàåì r}
End;
i:=0;
While (r>0) Do
{Ïîäñ÷èòûâàåì êîëè÷åñòâî åäèíèö â r}
If (r Mod 2=1) Then Begin
i:=i+1;
r:=r ShR 1;
End;
WriteLn('äëèíà lcs ðàâíà ',i);
End;
Çäåñü íàéäåíà äëèíà lcs ñòðîê, íî íå ñàìà ïîäïîñëåäîâà-
òåëüíîñòü! Îäíàêî åñëè ìàòðèöà R ïîëíîñòüþ îïðåäåëåíà, òî
äëÿ âûâîäà ñàìîé lcs ó íàñ åñòü èñõîäíàÿ èíôîðìàöèÿ.
 òàáë. 4.13 åäèíèöû, ñîîòâåòñòâóþùèå lcs, âûäåëåíû æèð-
íûì êóðñèâîì. Äëÿ âûâîäà ïîäïîñëåäîâàòåëüíîñòè íà÷èíàÿ
ñ ïåðâîé ñòðîêè R ñëåäóåò íàéòè ïîñëåäíþþ ñòðîêó ñ ìàêñè-
ìàëüíûì çíà÷åíèåì êîëè÷åñòâà åäèíèö, à çàòåì ñîâåðøèòü
«óãëîâîé îáõîä». Ñóòü ýòîãî îáõîäà â òîì, ÷òî â êàæäîé ñòðî-
êå ìû íàõîäèì ïåðâóþ åäèíèöó è îáõîäèì åå, ò. å. «ñïóñ-
êàåìñÿ» â ñëåäóþùóþ ñòðîêó, èùåì ñ ýòîé ïîçèöèè ïåðâóþ
åäèíèöó è ò. ä., ïîêà íå áóäåò äîñòèãóò ïîñëåäíèé ñòîëáåö.
Ñèìâîëû èç S1, ñîîòâåòñòâóþùèå âûäåëåííûì åäèíèöàì,
êàê ðàç è ñîñòàâëÿþò lcs.

@ Óïðàæíåíèÿ
1. Äëÿ ñòðîê S1 = tgcctaag è S2 = gctacctc óáåäèòåñü,
÷òî ìàòðèöà R èìååò âèä:
æ0 1 0 1 1 0 0 1 ö
ç ÷
ç1 0 0 1 1 0 1 0 ÷
ç1 0 1 0 1 0 1 0 ÷
ç ÷
ç0 0 1 1 0 0 1 0÷
R =ç ,
0 0 1 1 0 0 1 0÷
ç ÷
ç0 0 0 1 1 0 0 0÷
ç ÷
ç1 0 0 0 1 0 0 0 ÷
ç0 0 0 1 0 0 0 0÷
è ø
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 195

ò. å. äëèíà lcs ðàâíà 4. Èñïîëüçóÿ «óãëîâîé îáõîä», íàé-


äèòå ñàìó ýòó ïîäïîñëåäîâàòåëüíîñòü.
2. Ïóñòü S1 = aaaaaaa è S2 = aaaaab. Ñôîðìèðóéòå äëÿ
íèõ ìàòðèöó R.
3. Ïðèâåäèòå ïðèìåð äâóõ ñòðîê íà çàäàííîì àëôàâèòå.
Âû÷èñëèòå äëèíó èõ íàèáîëüøåé îáùåé ïîäïîñëåäîâà-
òåëüíîñòè.
4. Ïðè èçâåñòíîé ìàòðèöå R ðàçðàáîòàéòå ïðîöåäóðó ïîèñ-
êà íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè.
5. Èñïîëüçóÿ ìàòåðèàë ïðåäûäóùåãî ðàçäåëà, ðàçðàáîòàé-
òå ëîãèêó âûâîäà lcs äëÿ ñëó÷àÿ, êîãäà äëÿ ïîäñ÷åòà
äëèíû lcs èñïîëüçóåòñÿ òîëüêî ïðåäûäóùàÿ ñòðîêà ìàò-
ðèöû R (à îíà ñàìà íå ôîðìèðóåòñÿ).
6. Íèæå ïðåäñòàâëåí âàðèàíò ëîãèêè, ðåàëèçóþùåé ïîèñê
äëèíû íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè ñòðîê
(n = |S1|, m = |S2|) ïðè n > 32. Ïðîâåðüòå åãî ðàáîòîñïî-
ñîáíîñòü è íàéäèòå âîçìîæíîñòü óëó÷øèòü ïðèâåäåí-
íûé íèæå ïðîãðàììíûé êîä.
Procedure SearchLong(S1,S2:String);
Const nmax=10;
{Çíà÷åíèå 10 óñëîâíî, îíî îïðåäåëÿåòñÿ
êîíêðåòíîé çàäà÷åé. Îñòàëüíûå êîíñòàíòû
îñòàâëåíû â ëèñòèíãå äëÿ íàãëÿäíîñòè}
Type mas=Array[1..nmax] Of Longint;
Var V:Array [Chr(0)..Chr(255),1..nmax]
Of Longint;
n,m,i,j,q:Byte;
R,T:mas;
y:Char;
Begin
n:=Length(S1);
q:=n Div 31;
If (n Mod 31>0) Then q:=q+1;
For y:=Chr(0) To Chr(255) Do
For j:=1 To q Do V[y,j]:=0;
For i:=1 To n Do
If (i Mod 31=0)
Then V[S1[n–i+1],i Div 31]:=
W[S1[n–i+1],i Div 31] Or
(1 ShL(i–31*(i Div 31–1)–1))
196 Ãëàâà 4. Âû÷èñëåíèå ðàññòîÿíèÿ ìåæäó ñòðîêàìè

Else V[S1[n–i+1],i Div 31+1]:=


V[S1[n–i+1],i Div 31+1] Or
(1 ShL (i–31*(i Div 31)–1));
m:=Length(S2);
For i:=m DownTo 1 Do Begin
For j:=1 To q Do Begin
R[j]:=T[j] Or V[S2[i],j];
If (j=1) Or ((T[j-1] Div 1073741824=1)
And (j>1)) Then T[j]:=(T[j] ShL 1)+1
Else T[j]:=(T[j] ShL 1);
T[j]:=R[j] And ((R[j]–T[j]) Xor R[j]);
End;
End;
i:=0;
For j:=1 To q Do
While (T[j]>0) Do Begin
If (T[j] Mod 2=1) Then i:=i+1;
T[j]:=T[j] ShR 1;
End;
WriteLn('äëèíà lcs ðàâíà',i);
End;

Ìåòîäè÷åñêèé êîììåíòàðèé
Àëãîðèòìû âû÷èñëåíèÿ ðàññòîÿíèÿ ìåæäó ñòðîêàìè è íà-
õîæäåíèÿ ïîäïîñëåäîâàòåëüíîñòåé ÿâëÿþòñÿ, åñëè òàê ìîæíî
âûðàçèòüñÿ, «ïðåàìáóëîé» ê öåëîìó êëàññó àëãîðèòìîâ ïðè-
áëèæåííîãî ñîïîñòàâëåíèÿ ñòðîê. Ïîñëåäíèå èìåþò îãðîìíîå
çíà÷åíèå êàê â ìîëåêóëÿðíîé áèîëîãèè, òàê è â äðóãèõ îáëàñ-
òÿõ çíàíèÿ, âêëþ÷àÿ computer science.
Àëãîðèòì íàõîæäåíèÿ ðàññòîÿíèÿ ìåæäó ñòðîêàìè äîñòà-
òî÷íî èçâåñòåí, õîòÿ åãî îïèñàíèå ìîæíî âñòðåòèòü íå òàê ÷àñ-
òî (â ñèëó åãî ïðîñòîòû è î÷åâèäíîñòè). Á. Ñìèò íàçûâàåò åãî
«àëãîðèòìîì Ð. Âàãíåðà (Robert Wagner) è Ì. Ôèøåðà
(Michael Fischer)». Ïðîñòîé àëãîðèòì íàõîæäåíèÿ íàèáîëü-
øåé îáùåé ïîäïîñëåäîâàòåëüíîñòè ïðèïèñûâàþò ðàçëè÷íûì
àâòîðàì, íî íà ðóññêîì ÿçûêå îí ñòàë èçâåñòåí êàê «àëãîðèòì
Ñ. Íóäåëüìàíà (Saul Needleman) – Ê. Âóíøà (Chris-
tian Wunsch)»1). Åãî èçìåíåíèÿ, íàïðàâëåííûå íà óìåíüøå-
íèå îáúåìà èñïîëüçóåìîé ïàìÿòè, îïðåäåëÿþò êàê àëãîðèòì

1)
Needleman Saul B., Wunsch Christian D. A general method applicable to the
search for similarities in the amino–acid principle of two proteins //
J. Molecular Biology 48, 1970. P. 443–453.
4.3. Çàäà÷à î íàèáîëüøåé îáùåé ïîäïîñëåäîâàòåëüíîñòè 197

Ä. Õåøáåðãà (Dan Hischberg)1). Ñ àëãîðèòìàìè Ä. Õàíòà


(James Hunt) – Ò. Çèìàíñêîãî (Thomas Szymanski)2) è
Ý. Óêêîíåíà (Esko Ukkonen)3) – Þ. Ìàéåðñà (Gene Myers)4)äëÿ
îáîñíîâàíèÿ íåêîòîðûõ äåòàëåé ìîæíî ïîðàáîòàòü è ïî êíèãå
Á. Ñìèòà. Àëãîðèòì Ë Ýëëèñîíà (Lloyd Allison) è Ò. Äèêñà
(Trevor Dix)5) èíòåðåñåí ñèíòåçîì èäåé ìåòîäîâ Ð. Áîéðà –
Äæ. Ìóðà è Ð. Áåçà-Éåòñ è Ã. Ãîííåò (àëãîðèòì Shift-And).
Ïðåäñòàâëåííûé â äàííîé ãëàâå ìàòåðèàë, êîíå÷íî æå, íå
ïîëíîñòüþ îõâàòûâàåò ðàññìàòðèâàåìóþ ïðîáëåìàòèêó. Íàè-
áîëåå ïåðñïåêòèâíûì íàïðàâëåíèåì åå ðàçâèòèÿ, âèäèìî, ÿâ-
ëÿåòñÿ èñïîëüçîâàíèå èäåé àëãîðèòìà Shift-And äëÿ ðåøåíèÿ
ïîñòàâëåííîé çàäà÷è. Ïðèìåðîì òîìó ÿâëÿåòñÿ íå òîëüêî ðàñ-
ñìîòðåííûé àëãîðèòì Ë. Ýëëèñîíà – Ò. Äèêñà, íî è ìîäèôèêà-
öèÿ àëãîðèòìîâ Ä. Õåøáåðãà è Ä. Õàíòà – Ò. Çèìàíñêîãî6),
îñòàâëåííàÿ çà ïðåäåëàìè ðàññìîòðåíèÿ.

1)
Hirschberg Dan S. Algorithms for the longest common subsequence problem //
JACM 24–4, 1977. P. 664–675.
2)
Hynt James W., Szymancki Thomas G. A fast algorithm for computing longest
common subsequences // CACM 20–5, 1977. P. 350–353.
3)
Ukkonen Esko. Algorithms for approximate string matching // Information &
Control, 64, 1985. P. 100–118.
4)
Myers Gene W. An O(ND) difference algorithm and its variations //
Algorithmica I, 1986. P. 251–266.
5)
Allison Lloyd, Dix Trevor. A bit string longest subsequence algorithm // IPL,
23–6, 1986. P. 305–310.
6)
Crochemore Maxime, Iliopoulos Costas, Pinzon Yoan. Speeding up Hirschberg
and Hunt–Szymancki LCS algorithms // Proc. Eighth IEEE Internal. Symp.
String Processing & Information Retrieval. IEEE Computer Science Press,
2001. P. 59–67.
Ãëàâà 5

Àëãîðèòìû ïðèáëèæåííîãî
ïîèñêà ïîäñòðîê

— Êàêîé ó íåãî òåëåôîí?


— Íå ïîìíþ.
— Íó, õîòÿ áû ïðèáëèçèòåëüíî?
Ñåðãåé Äîâëàòîâ

Êîëè÷åñòâî àëãîðèòìîâ ïðèáëèæåííîãî ïîèñêà ïîä-


ñòðîê, ïðåäëîæåííûõ ñ 1980-õ ãã., ñîïîñòàâèìî ñ êîëè÷åñò-
âîì àëãîðèòìîâ òî÷íîãî ïîèñêà ïîäñòðîêè. Èõ èçó÷åíèå
ïðåñëåäóåò öåëü íå òîëüêî àíàëèçà õîäà ìûñëåé ó÷åíûõ-
èíôîðìàòèêîâ, íî è ôîðìèðîâàíèÿ áàçû äëÿ ðåøåíèÿ ìíî-
ãî÷èñëåííûõ ïðèêëàäíûõ çàäà÷.

5.1. Ïðîñòîé àëãîðèòì


Ìîëîäîñòü ìíå ìíîãî îáåùàëà,
Áûëî ìíå êîãäà-òî äâàäöàòü ëåò,
Ýòî áûëî ñàìîå íà÷àëî,
ß áûë ãëóï, è ýòî íå ñåêðåò.
Áîðèñ Ðûæèé
 ï. 4.1 áûëè ââåäåíû ðàçëè÷íûå ìåðû áëèçîñòè ìåæäó
ñòðîêàìè S1 è S2: ðàññòîÿíèå Ð. Õåììèíãà è ðàññòîÿíèå
Â. Ëåâåíøòåéíà.  íåêîòîðûõ ñëó÷àÿõ îïåðàöèÿ ïîäñòàíîâ-
êè èìååò âåñ 1; â äðóãèõ îíà çàìåíÿåòñÿ äâóìÿ îïåðàöèÿ-
ìè — âñòàâêîé è óäàëåíèåì — è èìååò âåñ 2.
Ïóñòü äàí òåêñò T (n = |T|)è îáðàçåö P (m = |P|). Îïðåäå-
ëèì ðàññòîÿíèå d ìåæäó ïðåôèêñàìè T[1..i] è P[1..j] êàê
d(i, j) = min (d[T [i¢, i], P[1.. j]]) äëÿ âñåõ i Î 0..n, j Î 1..m.
0„ i ¢„ i
Áóäåì õðàíèòü çíà÷åíèÿ d â ìàññèâå D. Ãëàâíîå, íà ÷òî
ñëåäóåò îáðàòèòü âíèìàíèå â ýòîé ôîðìóëå, çàêëþ÷àåòñÿ â
íåîáÿçàòåëüíîñòè ðàâåíñòâà i – i¢ + 1 = j. Èùåòñÿ ìèíè-
ìàëüíîå çíà÷åíèå ðàññòîÿíèÿ ìåæäó ñóôôèêñàìè ïðåôèêñà
T[1..i] è ïðåôèêñîì P[1..j].
5.1. Ïðîñòîé àëãîðèòì 199

Îïðåäåëèì çàâèñèìîñòè:
l D[0, 0] = 0 — ïóñòàÿ ñòðîêà ïðåîáðàçóåòñÿ â ïóñòóþ
ñòðîêó çà íóëü îïåðàöèé;
l D[0, j] = j äëÿ j îò 1 äî m — ïóñòàÿ ñòðîêà ïðåîáðàçó-
åòñÿ â ïðåôèêñ P[1..j] çà j îïåðàöèé âñòàâêè, è ýòî ìè-
íèìàëüíîå êîëè÷åñòâî îïåðàöèé;
l D[i, 1] = min(D[i – 1,1] + 1, D[T[i], P[j]]) — èùåòñÿ
ìèíèìàëüíîå ðàññòîÿíèå ìåæäó P[1] è ïîäñòðîêîé
T[i¢, i]. Åñëè T[i] = P[j], òî D[T[i], P[j]] = 0; ïðè
T[i] ¹ P[j] ìû èìååì D[T[i], P[j]] = 2.
Ðåêóððåíòíîå ñîîòíîøåíèå äëÿ D[i, j] ïðè 1 „ i „ n è
1 < j „ m èìååò âèä:
D[i, j] = min{D[i – 1, j] + 1, D[i, j – 1] + 1, D[i – 1, j – 1] + t},
ãäå t = 2, åñëè T[i] ¹ P[j], è t = 0, åñëè T[i] = P[j].
Ïîñëå âû÷èñëåíèÿ ìàññèâà ðàññòîÿíèé D äëÿ ëþáîãî íå-
îòðèöàòåëüíîãî öåëîãî ÷èñëà k è ïðåôèêñà P[1..j] ó íàñ åñòü
âîçìîæíîñòü îòâåòèòü íà âîïðîñ î òîì, âõîäèò ëè P[1..j] â T
ñ òî÷íîñòüþ äî k îïåðàöèé ðåäàêòèðîâàíèÿ (k-ïðèáëèæåí-
íîå âõîæäåíèå P â T). Äëÿ ýòîãî äîñòàòî÷íî ïðîñìîòðåòü
ñòîëáåö j è íàéòè çíà÷åíèÿ D[i, j] „ k. Íàéäåííîå çíà÷åíèå
D[i, j] ãîâîðèò î òîì, ÷òî ñóùåñòâóåò ïîäñòðîêà T[i¢..i], îòëè-
÷àþùàÿñÿ îò P[1..j] íå áîëåå ÷åì íà çíà÷åíèå k (k-ïðèáëèæå-
íèå). Èëè, äðóãèìè ñëîâàìè, ýòà ïîäñòðîêà è ïðåôèêñ
P[1..j] ìîãóò áûòü ïðåîáðàçîâàíû äðóã â äðóãà îïåðàöèÿìè
ðåäàêòèðîâàíèÿ ñ ñóììàðíûì âåñîì íå áîëåå ÷åì k.

Ïðèìåð
Ïóñòü T = abcaadbbd è P = bcadab. Ïîëó÷àåìûé äëÿ
íèõ ìàññèâ D ïðåäñòàâëåí â òàáë. 5.1.
Âîçüìåì ïðåôèêñ P[1..4] = bcad. Ïðîàíàëèçèðóåì äàí-
íûå èç ñòîëáöà ¹ 4:
l T[1..1] = a — âñòàâêà òðåõ ñèìâîëîâ;
l T[1..2] = ab — ïîäñòðîêà b, âñòàâêà òðåõ ñèìâîëîâ;
l T[1..3] = abc — ïîäñòðîêà bc, âñòàâêà äâóõ ñèìâîëîâ;
l T[1..4] = abca — ïîäñòðîêà bca, âñòàâêà îäíîãî ñèì-
âîëà;
l T[1..5] = abcaa — ïîäñòðîêà bcaa, ïîäñòàíîâêà îäíî-
ãî ñèìâîëà;
l T[1..6] = abcaad — ïîäñòðîêà bcaad, óäàëåíèå îäíîãî
ñèìâîëà a;
200 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Òàáëèöà 5.1

Íîìåð
D 1 2 3 4 5 6
ñèìâîëà
Íîìåð
Ñèìâîë b c a d a b
ñèìâîëà
0 Ñèìâîë 1 2 3 4 5 6
1 a 2 3 2 3 4 5
2 b 0 1 2 3 4 4
3 c 1 0 1 2 3 4
4 a 2 1 0 1 2 3
5 a 2 2 1 2 1 2
6 d 2 3 2 1 2 3
7 b 0 1 2 2 3 2
8 b 0 1 2 3 4 3
9 d 1 2 3 2 3 4

T[1..7] = abcaadb — ïîäñòðîêà bcaadb, óäàëåíèå


l
äâóõ ñèìâîëîâ;
l T[1..8] = abcaadbb — ïîäñòðîêà bcaadbb, óäàëåíèå
òðåõ ñèìâîëîâ;
l T[1..9] = abcaadbbd — ïîäñòðîêà bd, âñòàâêà äâóõ
ñèìâîëîâ.
Äàííûé àëãîðèòì ïðàêòè÷åñêè ñîâïàäàåò ñ òåì, ÷òî áûë
îïèñàí â ï. 4.1. Åäèíñòâåííîå îòëè÷èå çàêëþ÷àåòñÿ â âîç-
ìîæíîñòè åãî èñïîëüçîâàíèÿ äëÿ ðàññòîÿíèé, îïðåäåëåí-
íûõ ðàçëè÷íûì îáðàçîì.  äàííîì ñëó÷àå îïåðàöèè âñòàâêè
è óäàëåíèÿ èìåëè âåñ 1, à îïåðàöèÿ ïîäñòàíîâêè — âåñ 2, íî
ýòè çíà÷åíèÿ ìîãóò áûòü è äðóãèìè.
Äëÿ îïðåäåëåíèÿ ïîäñòðîêè T[i¢..i], ñîâïàäàþùåé ñ ïðå-
ôèêñîì P[1..j], ñëåäóåò (òàê æå, êàê ýòî îïèñàíî â ï. 4.1) ââåñ-
òè äîïîëíèòåëüíûå ñòðóêòóðû äàííûõ, â êîòîðûõ ïðåäïîëà-
ãàåòñÿ ôèêñèðîâàòü êîîðäèíàòû ïðåäøåñòâóþùåé ïîçèöèè,
îáåñïå÷èâàþùåé ìèíèìàëüíîå çíà÷åíèå ðàññòîÿíèÿ.
Àëãîðèòì çàòðàòíûé: ñ òî÷êè çðåíèÿ êàê âðåìåíè —
O(n · m), òàê è îáúåìà ïàìÿòè, èìåþùåãî àíàëîãè÷íóþ
îöåíêó. Îäíàêî òðåáîâàíèå ê ïàìÿòè ìîæíî óìåíüøèòü,
ïîñêîëüêó çíà÷åíèÿ â ñòðîêå i çàâèñÿò òîëüêî îò çíà÷åíèé â
ñòðîêå i – 1.  ýòîì ñëó÷àå òðåáîâàíèÿ ê îáúåìó ïàìÿòè ñî-
êðàùàþòñÿ äî O(m).
5.2. Àëãîðèòì Ñ. Âó – Þ. Ìåíáåðà 201

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåðû ñòðîê P è T. Âû÷èñëèòå äëÿ íèõ
ìàòðèöó ðàññòîÿíèé D. Äëÿ êàæäîãî ïðåôèêñà P îïðå-
äåëèòå ïîäñòðîêó T, íà êîòîðîé äîñòèãàåòñÿ ïîëó÷åííàÿ
îöåíêà.
2. Ðàçðàáîòàéòå ïðîãðàììó ôîðìèðîâàíèÿ ìàññèâà D è ïî-
èñêà òàêîãî çíà÷åíèÿ i¢, ÷òî d(T[i¢..n], P) = D[n, m].
3. Äëÿ çàäàííîãî çíà÷åíèÿ k íàéäèòå âñå òàêèå çíà÷åíèÿ
i¢ è i, ÷òî d(T[i¢..i], P) „ k.

5.2. Àëãîðèòì Ñ. Âó – Þ. Ìåíáåðà


Áåñöåíåí òîò, êòî ïîäàë öåííóþ èäåþ.
Ãåîðãèé Àëåêñàíäðîâ

Àëãîðèòì Ñ. Âó è Þ. Ìåíáåðà ðàáîòîñïîñîáåí ïðè ðàç-


ëè÷íûõ âåñàõ îïåðàöèé âñòàâêè, óäàëåíèÿ è ïîäñòàíîâêè
(çàìåíû) è îïèðàåòñÿ íà áàçîâûå ðåêóððåíòíûå ñîîòíîøå-
íèÿ, ïðèâåäåííûå â ï. 5.1. Îäíàêî ìàòðèöà D çäåñü íå âû-
÷èñëÿåòñÿ, à âìåñòî ýòîãî èñïîëüçóþòñÿ èäåè àëãîðèòìà
Shift-And, ñâîäÿùèå çàäà÷ó ê ìàíèïóëÿöèÿì ñ áèòîâûìè
âåêòîðàìè. Äëÿ îïðåäåëåííîñòè è ïðîñòîòû èçëîæåíèÿ
ïðèìåì çíà÷åíèÿ âåñîâ, ðàâíûå 1 äëÿ îïåðàöèé âñòàâêè è
óäàëåíèÿ è 2 äëÿ îïåðàöèè çàìåíû. Ðå÷ü â ýòîì ñëó÷àå èäåò
íå î k-íåñîâïàäåíèÿõ, à î k-ïðèáëèæåíèè (k … 1). Äðóãèìè
ñëîâàìè, òðåáóåòñÿ íàéòè âõîæäåíèå P â T ñ òî÷íîñòüþ äî
k — êîãäà ñóììàðíûé âåñ îïåðàöèé ïî ïðåîáðàçîâàíèþ P
â êàêóþ-òî ïîäñòðîêó T[i¢..i] íå ïðåâûøàåò çíà÷åíèÿ k. Âû-
÷èñëèâ ìàòðèöó D (ï. 5.1) è ïðîñìîòðåâ ïîñëåäíèé ñòîëáåö,
îòâåò çàäà÷è ìîæíî íàéòè, íî ñóòü àëãîðèòìà èìåííî â òîì,
÷òîáû íå âû÷èñëÿòü åå â ïðÿìîì âèäå.
«Ïî òðàäèöèè» ðàññìîòðèì ïðèìåð.

Ïðèìåð
Ïóñòü P = bacaba, T = abcdabd è k = 3. Ïðèâåäåì ìàò-
ðèöó D (òàáë. 5.2), íî òîëüêî äëÿ ïîíèìàíèÿ èäåéíîé îñíî-
âû àëãîðèòìà.
202 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Òàáëèöà 5.2

D b a c a b a
a 2 1 2 3 4 5
b 0 1 2 3 3 4
c 1 2 1 2 3 4
d 2 3 2 3 4 5
b 0 1 2 3 3 4
a 1 0 1 2 3 3
d 2 1 2 3 4 4

Ïðåäïîëîæèì, ÷òî êàêèì-òî ñïîñîáîì âû÷èñëåíû ìàòðè-


öû Rq, ãäå q = 0, 1, 2 è 3 (òàáë. 5.3). Ýëåìåíò Rq[i, j] ðàâåí
íóëþ òîãäà è òîëüêî òîãäà, êîãäà ïðåôèêñ P[1..j] ñ òî÷íîñòüþ
q âõîäèò â êàêóþ-òî ïîäñòðîêó (T[i¢..i]) ïðåôèêñà T[1..i], èíà-
÷å Rq[i, j] = 1. Ïðè íàëè÷èè ìàòðèöû D ýëåìåíòû Rq äëÿ âñåõ
çíà÷åíèé q âûïèñûâàþòñÿ ïðîñòî. Äëÿ R0: åñëè D[i, j] = 0, òî
R0[i, j] = 0, èíà÷å R0[i, j] = 1. Äëÿ R1: åñëè D[i, j] „ 1, òî
R0[i, j] = 0, èíà÷å R0[i, j] = 1. Àíàëîãè÷íî — è äëÿ îñòàâ-
øèõñÿ çíà÷åíèé q.

Òàáëèöà 5.3

R0 R1 R2 R3
b a c a b a b a c a b a b a c a b a b a c a b a
a 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1
b 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 1
c 1 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1
d 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1
b 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 1
a 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0
d 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1

Î ÷åì ãîâîðèò, íàïðèìåð, çíà÷åíèå R3[6, 6] = 0? Äà


òîëüêî î òîì, ÷òî ñòðîêà P = bacaba ìîæåò áûòü ïðåîáðàçî-
âàíà â ïîäñòðîêó T[2..6] = bcdba çà îïåðàöèè ñ ñóììàðíîé
ñòîèìîñòüþ 3. Âîò ýòè îïåðàöèè: âñòàâêà ñèìâîëà a ïîñëå
ïåðâîãî ñèìâîëà b è çàìåíà ñèìâîëà d íà ñèìâîë a. Ïðè âå-
ñàõ îïåðàöèé, î êîòîðûõ ìû ãîâîðèëè â íà÷àëå ýòîãî ðàçäå-
5.2. Àëãîðèòì Ñ. Âó – Þ. Ìåíáåðà 203

ëà, ýòî êàê ðàç ñîñòàâëÿåò çíà÷åíèå 3. Ïðàâäà, ìû çäåñü


÷óòü-÷óòü ñëóêàâèëè: çíà÷åíèå R3[6, 6] = 0 ãîâîðèò òîëüêî
î ñàìîì ýòîì ôàêòå, íî äëÿ òîãî, ÷òîáû îïðåäåëèòü ïîäñòðî-
êó T è ñàìè òðåáóåìûå îïåðàöèè, íåîáõîäèìû äîïîëíèòåëü-
íûå óñèëèÿ.
Ïðèìå÷àíèå. Îáðàòèòå âíèìàíèå, ÷òî ïî îòíîøåíèþ ê
ïðåäûäóùåìó âàðèàíòó ìàòðèö R (îáîáùåíèå àëãîðèòìà
Shift-And) çíà÷åíèÿ 1 è 0 èíâåðòèðîâàíû. Çàáåãàÿ âïåðåä,
ñêàæåì, ÷òî â äàííîì àëãîðèòìå è çíà÷åíèÿ ýëåìåíòîâ ìàò-
ðèöû V (õàðàêòåðèñòè÷åñêèå âåêòîðû), îòðàæàþùèõ âõîæ-
äåíèå ñèìâîëîâ àëôàâèòà A â îáðàçåö P, òîæå èíâåðòèðîâà-
íû. Òàê, äëÿ ðàññìàòðèâàåìîãî ïðèìåðà V èìååò âèä, ïðèâå-
äåííûé â òàáë. 5.4.

Òàáëèöà 5.4

V b a c a b a
a 1 0 1 0 1 0
b 0 1 1 1 0 1
c 1 1 0 1 1 1
d 1 1 1 1 1 1

È âîò, íàêîíåö, ïðèøëî âðåìÿ çàäàòü ãëàâíûé âîïðîñ:


ìîæíî ëè çíà÷åíèÿ R âû÷èñëÿòü áåç çíàíèÿ D?
Áèíàðíûìè âåêòîðàìè â äàííîì ñëó÷àå ÿâëÿþòñÿ ñòðî-
êè Rq[i]: R0[i], R1[i], …, Rk[i] (0 „ q „ k). Çàäà÷à çàêëþ÷àåòñÿ
â òîì, ÷òîáû íà îñíîâå èçâåñòíûõ çíà÷åíèé Rq[i – 1] âû÷èñ-
ëèòü Rq[i]. Äðóãèìè ñëîâàìè, âû÷èñëÿþòñÿ ïåðâûå ñòðîêè
âñåõ ìàòðèö R, çàòåì âòîðûå, òðåòüè è ò. ä. Ïîÿâëåíèå íóëÿ
â ñòîëáöå m (m — ýòî êîìïîíåíò êàêîãî-òî èç q + 1 âåêòî-
ðîâ) ãîâîðèò î òîì, ÷òî îáðàçåö P âõîäèò â ïðåôèêñ T (åñëè
íà ïîñëåäíåì øàãå, òî â òåêñò T, à èíà÷å — â T[1..i]) c òî÷-
íîñòüþ k. Åñòåñòâåííûì ÿâëÿåòñÿ è ââîä íóëåâîé ñòðîêè è
íóëåâîãî ñòîëáöà: çíà÷åíèå Rq[0, j] = (0, 1, 1, …, 1) äëÿ
j = 0, 1, 2, …, m, à Rq[i, 1] = 0 äëÿ i = 0, 1, 2, …, n.
×òî íåîáõîäèìî çíàòü äëÿ âû÷èñëåíèÿ êîìïîíåíòû j
âåêòîðà Rq[i], ò. å. Rq[i, j] (îïðåäåëÿåòñÿ âõîæäåíèå ïðåôèê-
ñà P[1..j] â ïðåôèêñ T[1..i] ñ òî÷íîñòüþ q)? Âî-ïåðâûõ, âõî-
äèò ëè ïðåôèêñ P[1..j] â ïðåôèêñ T[1..i – 1] ñ òî÷íîñòüþ
q – 1. Âî-âòîðûõ, âõîäèò ëè ïðåôèêñ P[1..j – 1] â ïðåôèêñ
T[1..i] ñ òî÷íîñòüþ q – 1. È â-òðåòüèõ, âõîäèò ëè ïðåôèêñ
204 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

P[1..j – 1] â ïðåôèêñ T[1..i – 1] ñ òî÷íîñòüþ q – 2 (à åñëè áû


îïåðàöèÿ ïîäñòàíîâêè èìåëà âåñ, íàïðèìåð, 3, òî áûëî áû
q – 3). Âûïîëíåíèå õîòÿ áû îäíîãî èç ýòèõ òðåõ óñëîâèé (ðà-
âåíñòâî íóëþ ýëåìåíòà ñîîòâåòñòâóþùåé ìàòðèöû R) ãîâîðèò
î òîì, ÷òî ñîâïàäåíèå ñèìâîëîâ P[j] è T[i] íå ïðèíöèïèàëüíî,
èáî ãàðàíòèðîâàíî, ÷òî P[1..j] âõîäèò â T[1..i] ñ òî÷íîñòüþ q.
Îòñþäà ñëåäóåò íåîáõîäèìîñòü âû÷èñëåíèÿ âûðàæåíèÿ
Rq–1[i – 1, j] And Rq–1[i, j – 1] And Rq–2[i – 1, j – 1]. Íî ýòî —
åùå íå îêîí÷àòåëüíûé ðåçóëüòàò. Åñëè ïðåôèêñ P[1..j – 1]
âõîäèò â T[1..i – 1] ñ òî÷íîñòüþ q (Rq[i – 1, j – 1] = 0) è ñèì-
âîëû ñîâïàäàþò: P[j] = T[i], òî ìû èìååì âõîæäåíèå P[1..j]
â T[1..i] ñ òî÷íîñòüþ q. Òàêèì îáðàçîì, ìû ïîëó÷àåì íåîáõî-
äèìîñòü âû÷èñëåíèÿ âûðàæåíèÿ:
Rq[i, j]:=Rq–1[i – 1, j] And Rq–1[i, j – 1] And
Rq–2[i – 1, j – 1] And (Rq[i – 1, j – 1] Or V[T[i], j]).

Âåðíåìñÿ ê íàøåìó ïðèìåðó. Â òàáë. 5.3 ýëåìåíò R3[6,6]


âûäåëåí æèðíûì øðèôòîì, à çíà÷åíèÿ R2[5,6], R2[6,5],
R1[5,5] è R3[5,5] – êóðñèâîì. Âûðàæåíèå R2[5,6] And R2[6,5]
And R1[5,6] ðàâíî åäèíèöå, ò. å. îáðàçåö P íå ìîæåò áûòü
ïðåîáðàçîâàí â ïîäñòðîêó ïðåôèêñà T[1..6] îïåðàöèÿìè ñ
ñóììàðíûì âåñîì 3. Îäíàêî ïðåôèêñ P[1..5] = bacab ìîæåò
áûòü ïðåîáðàçîâàí â ïîäñòðîêó ñóôôèêñà T[1..5] = abcdb
(âñòàâêîé ñèìâîëà a ïîñëå ïåðâîãî ñèìâîëà b è çàìåíîé ñèì-
âîëà d íà ñèìâîë à â ïîäñòðîêå bcdb) è ñèìâîë T[6] = P[6].
Ñëåäîâàòåëüíî, îáðàçåö P ïðåîáðàçóåòñÿ â ïîäñòðîêó ïðå-
ôèêñà T[1..6] çà îïåðàöèè ñ ñóììàðíûì âåñîì 3.
Ýôôåêò ïî âðåìåíè âû÷èñëåíèé, êàê è â àëãîðèòìå
Shift-And, äîñòèãàåòñÿ çà ñ÷åò èñêëþ÷åíèÿ öèêëà ïî êîì-
ïîíåíòàì áèíàðíûõ âåêòîðîâ: îí çàìåíÿåòñÿ ëîãè÷åñêèìè
îïåðàöèÿìè â öåëîì ñ áèíàðíûìè âåêòîðàìè (ñòðîêàìè
ìàòðèö R è T), à âûðàâíèâàíèå ïîçèöèé (ïî èíäåêñó j) îñó-
ùåñòâëÿåòñÿ ñ ïîìîùüþ îïåðàöèè ñäâèãà íà îäèí ðàçðÿä
âïðàâî. Ïðè ýòîì íóëåâîé ðàçðÿä âñåõ âåêòîðîâ ðàâåí 0.
Èìååì:
Rq[i]:=Rq–1[i – 1] And Rq–1[i] ®1 And Rq–2[i – 1] ®1 And
(Rq[i – 1] ®1 Or V[T[i]]).
Âðåìÿ âûïîëíåíèÿ òàêîãî àëãîðèòìà èìååò ïîðÿäîê
O(kém/wùn), ãäå w — äëèíà (â áèòàõ) ïðåäñòàâëåíèÿ äàííûõ
â êîìïüþòåðå (ñêàæåì, äëÿ òèïà LongInt ýòî 32 áèòà).
5.3. Çàäà÷à î k-íåñîâïàäåíèÿõ 205

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåð P è T. Âû÷èñëèòå âõîæäåíèå P â Ò ñ
òî÷íîñòüþ äî òðåõ íåñîâïàäåíèé.
2. Ïóñòü îïåðàöèÿ âñòàâêè èìååò âåñ 2, îïåðàöèÿ óäàëå-
íèÿ — âåñ 3, à îïåðàöèÿ çàìåíû — òàêæå âåñ 3. Ïðîàíà-
ëèçèðóéòå ðàáîòó àëãîðèòìà Ñ. Âó – Þ. Ìåíáåðà äëÿ ýòî-
ãî ñëó÷àÿ ïóòåì ïîýòàïíîãî âû÷èñëåíèÿ áèíàðíûõ
âåêòîðîâ ïðè êîíêðåòíûõ çíà÷åíèÿõ P è T.
3. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Ñ. Âó – Þ. Ìåíáåðà.

5.3. Çàäà÷à î k-íåñîâïàäåíèÿõ


Íàíÿëè òðèäöàòü êîððåêòîðîâ, ÷òî-
áû èçáåæàòü îøèáêè, è âñå ðàâíî íà
òèòóëüíîì ëèñòå èçäàíèÿ ñòîÿëî
«Áðèòàíñêàÿ ýíöèêëîïóäèÿ».
Èëüÿ Èëüô è Åâãåíèé Ïåòðîâ

Äàí òåêñò T (n = |T|) è îáðàçåö P (m = |P|). Ìåðà áëèçîñ-


òè îïðåäåëÿåòñÿ êàê ðàññòîÿíèå ìåæäó P è ïîäñòðîêàìè T
äëèíû m. (Íàïîìíèì, ÷òî ðàññòîÿíèå Ð. Õåììèíãà ìåæäó
ñòðîêàìè îäèíàêîâîé äëèíû îïðåäåëÿåòñÿ êàê ìèíèìàëü-
íîå êîëè÷åñòâî îïåðàöèé ïîäñòàíîâîê, íåîáõîäèìûõ äëÿ
ïðåîáðàçîâàíèÿ îäíîé ñòðîêè â äðóãóþ.) Çàäàíî íåîòðèöà-
òåëüíîå öåëîå ÷èñëî k. Òðåáóåòñÿ íàéòè âñå âõîæäåíèÿ P â T
ñ òî÷íîñòüþ äî k (âêëþ÷èòåëüíî) íåñîâïàäåíèé.
Ðàññìîòðèì äâà âàðèàíòà ðåøåíèÿ ýòîé çàäà÷è: ìîäè-
ôèêàöèþ àëãîðèòìà Shift-And è, âåðîÿòíî, èñòîðè÷åñêè
ïåðâûé àëãîðèòì Ã. Ëàíäàó – Þ. Âèøêèíà.

5.3.1. Ìîäèôèêàöèÿ àëãîðèòìà Shift-And


 àëãîðèòìàõ Shift-And è Ñ. Âó – Þ. Ìåíáåðà ðàññìàò-
ðèâàëèñü áèíàðíûå âåêòîðû, îòðàæàþùèå õàðàêòåð âçàè-
ìîñâÿçè ñèìâîëîâ ïðåôèêñîâ îáðàçöà P è ïîäñòðîêè T.
Îñíîâíàÿ èäåÿ ïåðâîãî èç ðàññìàòðèâàåìûõ àëãîðèòìîâ çà-
êëþ÷àåòñÿ â òîì, ÷òîáû èñïîëüçîâàòü äëÿ ýòèõ öåëåé íå
îäèí áèò, à t áèòîâ, ãäå t = élog2kù + 1 (íàçîâåì ýòè t áèòîâ
206 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

«îáîáùåííûì áèòîì»). Ýòî çíà÷åíèå ïîçâîëÿåò ôèêñèðî-


âàòü âñå íåñîâïàäåíèÿ îò 0 äî k. Ôàêò æå áîëüøåãî êîëè-
÷åñòâà íåñîâïàäåíèé íàñ íå èíòåðåñóåò ñ òî÷êè çðåíèÿ èõ êî-
ëè÷åñòâà, íî íàëè÷èå ýòîãî ôàêòà ôèêñèðóåòñÿ â ñïåöèàëü-
íîì âåêòîðå ïåðåïîëíåíèÿ R¢. Åñëè ïðîâîäèòü àíàëîãèþ ñ
ðàíåå ðàññìîòðåííûìè àëãîðèòìàìè, òî R[i, j] ñîñòîèò èç t
áèòîâ, à åãî çíà÷åíèå q (q = 0..k) ãîâîðèò î òîì, ÷òî ïðåôèêñ
P[1..j] è ïîäñòðîêà T[i – j + 1..i], çàêàí÷èâàþùàÿñÿ â ïîçè-
öèè i, èìåþò q íåñîâïàäåíèé. Ëîãè÷åñêèå îïåðàöèè â àëãî-
ðèòìàõ Shift-And è Ñ. Âó – Þ. Ìåíáåðà ïðåîáðàçóþòñÿ â
ýòîì ñëó÷àå â îïåðàöèè ñëîæåíèÿ ïî ìîäóëþ k + 1 äëÿ êàæ-
äîãî îáîáùåííîãî áèòà âåêòîðîâ R[i] è V[T[i]] è ñäâèãà âåêòî-
ðà R[i] íà t áèòîâ âïðàâî (íà «îáîáùåííûé áèò»). Î÷åâèäíî,
÷òî â ýòîì ñëó÷àå è ôàêò âõîæäåíèÿ ñèìâîëîâ àëôàâèòà â îá-
ðàçåö P òðåáóåò äëÿ êàæäîé ïîçèöèè õàðàêòåðèñòè÷åñêèõ
âåêòîðîâ t áèòîâ — «îáîáùåííîãî áèòà». Íàïðèìåð,
òàáë. 5.4 äëÿ P = bacaba, A = [a, b, c, d] è t = 2 âûãëÿäèò
òàê, êàê ïðåäñòàâëåíî â òàáë. 5.5.

Òàáëèöà 5.5

V b a c a b a
a 01 00 01 00 01 00
b 00 01 01 01 00 01
c 01 01 00 01 01 01
d 01 01 01 01 01 01

Ïðîèëëþñòðèðóåì ëîãèêó ðàáîòû ýòîãî àëãîðèòìà òðà-


äèöèîííûì ìåòîäîì.

Ïðèìåð
P = bacaba, T = badabaacbabaca, k = 3. Îáðàçåö P âõî-
äèò â ïîäñòðîêó:
l badaba — ñ îäíèì íåñîâïàäåíèåì;
l baacba — ñ äâóìÿ íåñîâïàäåíèÿìè;
l acbaba — ñ òðåìÿ íåñîâïàäåíèÿìè;
l babaca — ñ äâóìÿ íåñîâïàäåíèÿìè.

 òàáë. 5.6 ýòè âõîæäåíèÿ âûäåëåíû ïîëóæèðíûì


øðèôòîì â ïîçèöèè R¢[m].
5.3. Çàäà÷à î k-íåñîâïàäåíèÿõ 207

Òàáëèöà 5.6

Ñèìâîë Âåêòîð Âåêòîð Ñèìâîë Âåêòîð Âåêòîð


T R R¢ T R R¢
b 000000 011111 c 011133 000000
011101 110111
011101 011111 121200 000011
a 001110 001111 b 012120 000001
101010 011101
102120 001111 023221 000001
d 010212 000111 a 002322 000000
111111 101010
121323 000111 103332 000000
a 012132 000011 b 010333
101010 011101
113102 000011 021030 000101
b 011310 000001 a 002103 000010
011101 101010
022011 000101 103113 000010
a 002201 000010 c 010311 000001
101010 110111
103211 000010 120022 000101
a 010321 000001 a 012002 000010
101010 101010
111331 000001 113012 000010

Íà÷àëüíîå ñîñòîÿíèå âåêòîðà R = 000000 (èç «îáîáùåí-


íûõ áèòîâ»), à âåêòîðà R¢ = 011111. Îáðàáàòûâàåòñÿ ñèìâîë
T[1]: R[1] = R[0] + V['b'] = 011101 (òàáë. 5.6). Çàòåì âåê-
òîð R ñäâèãàåòñÿ âïðàâî íà t áèòîâ, à âåêòîð R¢ — íà îäèí áèò
(ñëåâà èäåò, êàê îáû÷íî, äîïîëíåíèå íóëÿìè). Çàòåì îáðàáà-
òûâàåòñÿ ñèìâîë T[2] = 'a'. Ïðè îáðàáîòêå ñèìâîëà T[4] â
ïÿòîì ðàçðÿäå (èëè m – 1) ïðîèñõîäèò ñëîæåíèå 3 + 1 =
= 0 (Mod 4) — ïåðåïîëíåíèå, êîòîðîå ôèêñèðóåòñÿ â ñîîòâåò-
ñòâóþùåì áèòå R¢, íî â äàííîì ñëó÷àå òàì óæå åäèíèöà, è
íè÷åãî íå èçìåíÿåòñÿ. Îäíàêî â àíàëîãè÷íîé ñèòóàöèè ïðè
îáðàáîòêå T[5] = 'b' â ÷åòâåðòîì ðàçðÿäå R¢ ïîÿâëÿåòñÿ
åäèíèöà, îòìå÷àÿ ôàêò ïåðåïîëíåíèÿ.
208 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Ïðè îáðàáîòêå ñèìâîëà T[6] = 'a' ìû íàõîäèì ïåðâîå


1-íåñîâïàäåíèå: R¢[m] = 0 è R[m] = 1. Îäíàêî óæå ïðè îáðà-
áîòêå ñëåäóþùåãî ñèìâîëà ìû ïîëó÷àåì ïÿòü íåñîâïàäå-
íèé — R¢[m] = 1, à ýòî óæå ÷åòûðå (èëè áîëåå â îáùåì ñëó-
÷àå) íåñîâïàäåíèÿ, ïëþñ îäíî íåñîâïàäåíèå äàåò R[m] = 1.
Îáîáùàÿ, ìîæíî óòâåðæäàòü, ÷òî âåëè÷èíà R[j] + 2tR¢[j]
äàåò íèæíþþ îöåíêó êîëè÷åñòâà íåñîâïàäåíèé ïðåôèêñà
P[1..j] ñ ñîîòâåòñòâóþùåé ïîäñòðîêîé T. Ïðîäîëæàÿ îáðà-
áîòêó T, íàõîäèì åùå òðè óêàçàííûõ âûøå íåñîâïàäåíèÿ,
óäîâëåòâîðÿþùèõ óñëîâèÿì çàäà÷è.
Âîçìîæåí òàêæå ñëåäóþùèé âàðèàíò ðàáîòû ñ âåêòîðîì
ïåðåïîëíåíèÿ. Êàæäûé îáîáùåííûé áèò âåêòîðà R äîïîë-
íÿåòñÿ îäíèì ðàçðÿäîì. Ïîñëå âûïîëíåíèÿ îïåðàöèè ñëî-
æåíèÿ ýòè ðàçðÿäû èçâëåêàþòñÿ èç âåêòîðà (ëîãè÷åñêàÿ
îïåðàöèÿ And ñ ñîîòâåòñòâóþùèì îáðàçîì ïîäîáðàííîé êîí-
ñòàíòîé), à çàòåì èíâåðòèðóþòñÿ â íóëåâîå ñîñòîÿíèå. Ïî
èçâëå÷åííûì äàííûì ìîæåò áûòü ïîëó÷åí R¢ è åãî m-é áèò.
Îöåíêà âðåìåíè ðàáîòû àëãîðèòìà. Ïðåäïîëîæèì,
÷òî âåêòîð R ìîæåò áûòü ðàçìåùåí â ìàøèííîì ñëîâå
(w = 32). Íàïðèìåð, äëÿ ñëó÷àÿ k „ 3, m „ 10 ìû èìååì:
m · (élog2kù + 1) < w. Òîãäà îïåðàöèè ïî îáðàáîòêå êàæäîãî
ñèìâîëà T áóäóò âûïîëíÿòüñÿ çà êîíñòàíòíîå âðåìÿ, è ìû
ïîëó÷àåì îöåíêó O(n).

5.3.2. Àëãîðèòì Ã. Ëàíäàó – Þ. Âèøêèíà


 àëãîðèòìå Ã. Ëàíäàó – Þ. Âèøêèíà çàäà÷à î k-íåñîâ-
ïàäåíèÿõ ðåøàåòñÿ ñ íåñêîëüêî äðóãèõ ïîçèöèé. Èñïîëüçó-
åòñÿ ìåòîä ïðåäâàðèòåëüíîãî àíàëèçà îáðàçöà, íî îí îòëè÷à-
åòñÿ îò ðàíåå ðàññìîòðåííûõ (îò âûäåëåíèÿ ãðàíåé ïðåôèê-
ñîâ èëè áëîêîâ ñòðîêè).
Îáðàòèìñÿ äëÿ «âû÷ëåíåíèÿ» êëþ÷åâîé èäåè àëãîðèò-
ìà ê ïðèìåðó. Ïóñòü T, P è k òå æå, ÷òî è â ðàíåå ðàññìîòðåí-
íîé ìîäèôèêàöèè àëãîðèòìà Shift-And. Â òàáë. 5.7 ïðåä-
ñòàâëåíà îáû÷íàÿ ëîãèêà ïîèñêà îáðàçöà â òåêñòå. Åäèí-
ñòâåííîå îòëè÷èå — ïðè êàæäîì ïðèêëàäûâàíèè îáðàçöà ê
òåêñòó â ñîîòâåòñòâóþùåé ñòðîêå ìàòðèöû íåñîâïàäåíèé
(pc) ôèêñèðóþòñÿ íîìåðà ïîçèöèé íåñîâïàâøèõ ñèìâî-
ëîâ P. Ïåðâîíà÷àëüíî pc çàïîëíÿåòñÿ çíà÷åíèåì m + 1.
 ïîñëåäíåì ñòîëáöå òàáëèöû ïðèâîäèòñÿ êîëè÷åñòâî íåñîâ-
5.3. Çàäà÷à î k-íåñîâïàäåíèÿõ 209

ïàäåíèé (cnt) ïðè êàæäîì ïðèêëàäûâàíèè P ê T (íà êàæ-


äîì øàãå). Ðåøåíèå çàäà÷è äîñòèãàåòñÿ ïðè 0, 4, 6 è 8 ïðè-
êëàäûâàíèÿõ.

Òàáëèöà 5.7

Íîìåð
b a d a b a a c b a b a c a pc 1 2 3 4 cnt
øàãà
0 b a c a b a 0 3 7 7 7 1
1 b a c a b a 1 1 2 3 4 4
2 b a c a b a 2 1 3 5 6 4
3 b a c a b a 3 1 2 3 5 4
4 b a c a b a 4 3 4 7 7 2
5 b a c a b a 5 1 4 5 6 4
6 b a c a b a 6 1 2 3 7 3
7 b a c a b a 7 1 2 3 4 4
8 b a c a b a 8 3 5 7 7 2

Ïðèâåäåì îáû÷íóþ ëîãèêó ïîèñêà, ÷òîáû ïîÿñíèòü ñóòü


ïðîâîäèìûõ èçìåíåíèé:
Procedure Solve;
Var i,j,cnt:Integer;
Begin
For i:=0 To n–m Do Begin
cnt:=0;
j:=1;
While (j<=m) And (cnt<=k) Do Begin
If P[j]<>T[i+j] Then Begin
cnt:=cnt+1;
pc[i,cnt]:=j;
End;
j:=j+1;
End;
End;
End;
Íàøà î÷åâèäíàÿ öåëü — èçìåíåíèå äàííîãî ïðèíöèïà
ôîðìèðîâàíèÿ ìàòðèöû pc. Íî îíà (ìàòðèöà) äîëæíà ôîð-
ìèðîâàòüñÿ, ïîýòîìó ïåðâûì «êèðïè÷èêîì çäàíèÿ» ÿâëÿåò-
ñÿ ëîãèêà ïîëó÷åíèÿ çíà÷åíèé ÷àñòè êîíêðåòíîé ñòðîêè pc
210 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

(èíäåêñ i) ïðè ñðàâíåíèÿõ, ïðîâîäèìûõ ñ êîíêðåòíîé ïîçè-


öèè â P (èíäåêñ j). Äðóãèìè ñëîâàìè, ìû äîëæíû óìåòü
«âûòÿãèâàòü» («extend») ïðè íåîáõîäèìîñòè ñòðîêó pc.
Ïðèâåäåì ñîîòâåòñòâóþùóþ ëîãèêó:
Procedure Extend(i:Integer; Var j, cnt:Integer);
Begin
While (cnt<k+1) And (j–i<m) Do Begin
j:=j+1;
If T[j]<>P[j–i] Then Begin
cnt:=cnt+1;
pc[i,cnt]:=j–i;
End;
End;
End;

Êàê âèäèì, âûçîâ Extend(0,0,0) ïðèâîäèò ê ôîðìèðî-


âàíèþ ïåðâîé ñòðîêè pc, ò. å. îòðàæàåò ðåçóëüòàò íóëåâîãî
ïðèêëàäûâàíèÿ P ê T (ñì. òàáë. 5.7).

È âîò ïîäîøëî âðåìÿ äëÿ ðàññìîòðåíèÿ êëþ÷åâîãî âîï-


ðîñà. Ïåðâîíà÷àëüíî óïðîñòèì åãî. Êàêóþ ïðåäâàðèòåëü-
íóþ ðàáîòó ñ îáðàçöîì P ñëåäóåò âûïîëíèòü äëÿ èñêëþ÷å-
íèÿ ïîñèìâîëüíîãî ñðàâíåíèÿ P ñ T íà ïåðâîì øàãå, çíàÿ ðå-
çóëüòàòû íóëåâîãî øàãà? Îáðàòèìñÿ ê òàáë. 5.7.
Ïðîöåäóðîé Solve íà ýòîì øàãå ïîäñòðîêà T = adabaa ñðàâ-
íèâàåòñÿ ñ P = bacaba. Íî íà ïðåäûäóùåì øàãå ôðàãìåíò
ïîäñòðîêè adaba óæå ñðàâíèâàëñÿ ñ acaba è ðåçóëüòàò ýòèõ
äåéñòâèé óæå çàôèêñèðîâàí â pc[0]! Âûâîä óæå ïî÷òè íàïðà-
øèâàåòñÿ: åñëè íà ñòàäèè ïðåäâàðèòåëüíîé îáðàáîòêè â íå-
êîòîðîé ñòðóêòóðå äàííûõ áóäóò ñôîðìèðîâàíû ðåçóëüòàòû
ïîñèìâîëüíîãî ñðàâíåíèÿ bacab ñ acaba, òî îíè ìîãóò áûòü
èñïîëüçîâàíû äëÿ ñîïîñòàâëåíèÿ ïîäñòðîê adaba è bacab.
Äåéñòâèòåëüíî, íàïðèìåð, ïåðâûå ñèìâîëû bacab è acaba
íå ñîâïàäàþò, à ïåðâûå ñèìâîëû acaba è adaba ñîâïàäàþò.
Çíà÷èò, ïåðâûå ñèìâîëû bacab è adaba íå ñîâïàäàþò. Îñòà-
ëîñü ïðîäóìàòü âñå âîçìîæíûå âàðèàíòû ñðàâíåíèé, íî
êëþ÷åâàÿ èäåÿ ïðåäâàðèòåëüíîé îáðàáîòêè ó íàñ óæå
åñòü — ñëåäóåò çàôèêñèðîâàòü ðåçóëüòàòû ñðàâíåíèÿ ïîä-
ñòðîê P ìåæäó ñîáîé â íåêîòîðîé ñòðóêòóðå äàííûõ (ìàòðè-
öå pn[1..m – 1, 1..2k + 1]). Ðåçóëüòàòû ýòèõ äåéñòâèé äëÿ
ðàññìàòðèâàåìîãî ïðèìåðà ïðèâåäåíû â òàáë. 5.8.
5.3. Çàäà÷à î k-íåñîâïàäåíèÿõ 211

Òàáëèöà 5.8

Ïîäñòðîêè P Ñòðîêà ìàòðèöû pn Íîìåð


bacab
1234577 1
acaba
baca
1377777 2
caba
bac
1237777 3
aba
ba
7777777 4
ba
b
1777777 5
a

Äëèòåëüíîñòü òàêîé ïðåäâàðèòåëüíîé îáðàáîòêè P èìå-


åò îöåíêó O(m · k).
Procedure Form_pn;
Var i,j,t:Integer;
Begin
For i:=1 To m-1 Do Begin
j:=0;
t:=0;
While (j<2*k+1) And (j<m–i) Do Begin
j:=j+1;
If P[j]<>P[j+i] Then Begin
t:=t+1;
pn[i,t]:=j;
End;
End;
End;
End;
À ñåé÷àñ ñðàâíèì pn[1] èç òàáë. 5.8 è pc[1] èç òàáë. 5.7.
Îêàçûâàåòñÿ, ÷òî ìîæíî ïåðåïèñàòü k + 1 çíà÷åíèå èç ñòðî-
êè pn[1] â ñòðîêó pc[1], è ïðè ýòîì áóäåò âûïîëíåíî òîëüêî
îäíî äîïîëíèòåëüíîå ñðàâíåíèå ñèìâîëîâ èç P è T, à èìåí-
íî T[3] è P[2]. Ñòðîêà pc êàê áû «ïîãëîòèëà» ðåçóëüòàòû
ïðåäûäóùåé ðàáîòû.  äàííîì ñëó÷àå îíà ñôîðìèðîâàëàñü
ïîëíîñòüþ, íî âîçìîæíî è åå òîëüêî ÷àñòè÷íîå ôîðìèðîâà-
íèå (åñëè íå íàáèðàåòñÿ k + 1 íåñîâïàäåíèå è ñòðîêà P íå
212 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

ïðîéäåíà äî êîíöà ïðè î÷åðåäíîì ïðèêëàäûâàíèè).  ýòîì


ñëó÷àå ñëåäóåò çàïóñòèòü ïðîöåäóðó Extend ñ êîíêðåòíûìè
ïàðàìåòðàìè. Åñëè âûíåñòè äåéñòâèÿ ïî «ïîãëîùåíèþ» â
îòäåëüíóþ ïðîöåäóðó Merge, òî ðàçðàáàòûâàåìûé âàðèàíò
ðåøåíèÿ áóäåò èìåòü ñëåäóþùèé âèä:
Procedure Solve;
Var i,j,cnt,r:Integer;
Begin
r:=0;
j:=0;
For i:=0 To n-m Do Begin
cnt:=0;
If i<j Then Merge(i,r,j,cnt);
If cnt<k+1 Then Begin
r:=i;
{Çàïîìèíàåì íîìåð ïîñëåäíåãî ðàñøèðÿåìîãî
ïðèêëàäûâàíèÿ èëè íîìåð ñòðîêè,
íà êîòîðîé áóäåò äîñòèãíóòî çíà÷åíèå j}
Extend(i,j,cnt);
End;
End;
End;

×òî æå ïðîèñõîäèò â Solve? Î÷åâèäíî, ÷òî èíäåêñ i


«èäåò ïî òåêñòó» è óêàçûâàåò íà ëåâóþ ãðàíèöó ñðàâíèâàå-
ìîãî ó÷àñòêà, à çíà÷åíèå j — ýòî ñàìàÿ ïðàâàÿ ïîçèöèÿ òåê-
ñòà, äîñòèãíóòàÿ íà ïðåäûäóùèõ øàãàõ. Îáðàçåö P ïðîñìàò-
ðèâàåòñÿ îäíîâðåìåííî ñ òåêñòîì. Íà øàãå i ñ P ñðàâíèâàåò-
ñÿ ÷àñòü òåêñòà T[i + 1..i + m] (ãäå i — íîìåð ñòðîêè
ìàòðèöû pc). Çíà÷åíèå j ðàâíî r + pc[r, k + 1] (èëè r+m â
ñëó÷àå, êîãäà pc[r, k + 1] = m + 1). À çíà÷åíèå r — ýòî íî-
ìåð ñòðîêè, ïðè àíàëèçå êîòîðîé áûëî äîñòèãíóòî çíà÷åíèå j.
Ïðè i < j âûçûâàåìàÿ ïðîöåäóðà Merge íàõîäèò íåñîâïàäå-
íèÿ ìåæäó P[1..j – i] è T[i + 1..j] ïóòåì, êàê ìû îáðàçíî íà-
çâàëè, «ïîãëîùåíèÿ». Ïðè ýòîì îïðåäåëÿåòñÿ çíà÷åíèå
cnt — êîëè÷åñòâî íåñðàâíåíèé, èëè íîìåð ñòîëáöà â pc.
Åñëè â ðåçóëüòàòå îêàæåòñÿ, ÷òî çíà÷åíèå cnt < k + 1, òî
âûçûâàåòñÿ ïðîöåäóðà Extend, çàêàí÷èâàþùàÿ ôîðìèðîâà-
íèå ñòðîêè i + 1 ìàòðèöû pc (èçìåíÿþòñÿ r, j è, âîçìîæíî,
cnt). Åñëè æå ïî-ïðåæíåìó îñòàíåòñÿ cnt < k + 1, òî áóäåò
íàéäåíî î÷åðåäíîå k-íåñîâïàäåíèå.
5.3. Çàäà÷à î k-íåñîâïàäåíèÿõ 213

Îöåíèì âðåìÿ ðàáîòû Solve (âðåìÿ àíàëèçà òåêñòà).


Åñëè èñêëþ÷èòü âûçîâû ïðîöåäóð Merge è Extend, òî êàæ-
äàÿ èç n – m + 1 èòåðàöèé öèêëà âûïîëíÿåòñÿ çà ôèêñèðî-
âàííîå âðåìÿ, ÷òî äàåò â îáùåé ñëîæíîñòè îöåíêó O(n).
Îáùåå ÷èñëî îïåðàöèé, âûïîëíÿåìûõ ïðîöåäóðîé Extend
ïðè âñåõ âûçîâàõ, åñòü O(n), — êàæäûé ñèìâîë òåêñòà ïðî-
âåðÿåòñÿ íå áîëåå îäíîãî ðàçà. Åñëè æå îêàæåòñÿ, ÷òî ïðî-
öåäóðà Merge ðàáîòàåò çà âðåìÿ O(k), òî îáùåå âðåìÿ àíàëè-
çà òåêñòà ñîñòàâèò O(n · k).
Ðàññìîòðèì ëîãèêó ðàáîòû ïðîöåäóðû Merge (ðèñ. 5.1).
Ôîðìèðóåòñÿ ñòðîêà i ìàòðèöû pc. Èçâåñòíî, ÷òî íà øàãå r
äîñòèãíóòà ïîçèöèÿ j òåêñòà è ðåçóëüòàòû ýòîãî ïðèêëàäû-
âàíèÿ îòðàæåíû â pc[r]. Êðîìå òîãî, íà ñòàäèè ïðåäâàðè-
òåëüíîé îáðàáîòêè ñôîðìèðîâàíà ìàòðèöà pn, â ÷àñòíîñòè
ñòðîêà pn[i – r]. Äðóãèìè ñëîâàìè, íàì èçâåñòíû ðåçóëüòà-
òû ïîñèìâîëüíîãî ñðàâíåíèÿ ïîäñòðîêè P[1..j – i] ñ ïîä-
ñòðîêîé P[j – i + 1..m]. Íà îñíîâàíèè ýòèõ äàííûõ ìû
äîëæíû ñäåëàòü âûâîä î ðåçóëüòàòå ñðàâíåíèÿ P[1..j – i] è
T[j – i]. Åñëè êîëè÷åñòâî íåñðàâíåíèé «íàáåðåòñÿ» (áóäåò
ðàâíî k + 1), à èõ êîëè÷åñòâî ôèêñèðóåòñÿ â ñ÷åò÷èêå cnt,
òî ñëåäóåò ïåðåéòè íà ñëåäóþùèé øàã, à åñëè íåò, òî íàäî
çàäåéñòâîâàòü â àíàëèçå îñòàâøóþñÿ ÷àñòü îáðàçöà (îíà çà-
øòðèõîâàíà íà ðèñ. 5.1). Íî ýòî çàäåéñòâîâàíèå áóäåò îñó-
ùåñòâëÿòüñÿ óæå íå â ïðîöåäóðå Merge.

Ðèñ. 5.1. Ïîÿñíåíèå ê ëîãèêå ðàáîòû ïðîöåäóðû Merge

Ïóñòü àíàëèçèðóåòñÿ êîíêðåòíàÿ ïîçèöèÿ q (ðèñ. 5.1).


Èìåþòñÿ ðåçóëüòàòû ñðàâíåíèé A è B, íà îñíîâàíèè êîòî-
ðûõ íåîáõîäèìî ñäåëàòü çàêëþ÷åíèå î ñðàâíèìîñòè ñèìâî-
ëîâ P[q] è T[i + 1 + q]. Âñå âîçìîæíûå âàðèàíòû ïðåäñòàâ-
ëåíû â òàáë. 5.9.
214 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Òàáëèöà 5.9

À B Êîììåíòàðèé
= = Ñîâïàäåíèå; ïîçèöèè q íåò â ìàòðèöàõ pc è pn. Ïåðå-
õîä ê ñëåäóþùåìó çíà÷åíèþ q
= ¹ Íåñîâïàäåíèå; ïîçèöèè q íåò â pc, íî îíà åñòü â pn. Íî-
ìåð ïîçèöèè q ñëåäóåò çàïèñàòü â pc[i, cnt]
¹ = Íåñîâïàäåíèå; ïîçèöèÿ q åñòü â pc, íî åå íåò â pn. Íî-
ìåð ïîçèöèè q ñëåäóåò çàïèñàòü â pc[i, cnt]
¹ ¹ Íåîïðåäåëåííîñòü. Òðåáóåòñÿ ñðàâíåíèå ñèìâîëîâ
P[q] è T[i + q + 1], ïî ðåçóëüòàòàì êîòîðîãî ïðèíèìà-
åòñÿ ðåøåíèå

Çàâåðøàÿ îáñóæäåíèå àëãîðèòìà Ã. Ëàíäàó – Þ. Âèø-


êèíà, ïðèâåäåì äèàãðàììó ñðàáàòûâàíèé ïðîöåäóð Extend
è Merge ïðè ôîðìèðîâàíèè ìàòðèöû pc äëÿ ðàññìàòðèâàå-
ìîãî ðàíåå ïðèìåðà (ðèñ. 5.2). Çíà÷åíèÿ ýëåìåíòîâ pc äàíû â
òàáë. 5.7, à íà ðèñ. 5.2 óêàçàíî, ñ ïîìîùüþ êàêîé ïðîöåäóðû
îíè ôîðìèðóþòñÿ (îáîçíà÷åíèÿ «E» è «M»). Äëèíà ñòðîêè
äèàãðàììû ïðè ýòîì ïðîïîðöèîíàëüíà êîëè÷åñòâó ýëåìåí-
òîâ â ñòðîêå pc (èõ ÷åòûðå, òàê êàê k = 3).

Ðèñ. 5.2. Äèàãðàììà ñðàáàòûâàíèé ïðîöåäóð Extend è Merge


ïðè ôîðìèðîâàíèè ìàòðèöû pc
5.4. Àëãîðèòì Þ. Ìàéåðñà 215

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåðû ñòðîê P è T, çàäàéòå èõ çíà÷åíèå k
è âûïîëíèòå ðó÷íóþ òðàññèðîâêó ðàáîòû ìîäèôèöèðî-
âàííîãî àëãîðèòìà Shift-And ïîèñêà k-íåñîâïàäåíèé (ïî
òèïó òàáë. 5.6).
2. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ ìîäèôèöèðî-
âàííîãî àëãîðèòìà Shift-And ñ âðåìåííîé îöåíêîé O(n).
3. Çàäàéòå çíà÷åíèÿ P, T è k. Ïðîöåäóðà Extend àëãîðèòìà
Ã. Ëàíäàó – Þ. Âèøêèíà âûçûâàåòñÿ ñ îïðåäåëåííûìè
ïàðàìåòðàìè. Óêàæèòå òî ìåñòî òåêñòà, ñ êîòîðîãî áóäåò
ïðîèñõîäèòü ñðàâíåíèå ñèìâîëîâ.
4. Ïóñòü P = am è T = an (n > m). Ïðîàíàëèçèðóéòå ðàáîòó
îáîèõ ðàññìîòðåííûõ àëãîðèòìîâ ïðè ýòèõ èñõîäíûõ
äàííûõ.
5. Ïóñòü â P íåò ïîâòîðÿþùèõñÿ ñèìâîëîâ è íè îäèí ñèì-
âîë èç P íå ñîâïàäàåò ñ ñèìâîëàìè èç T (ò. å. P è T ñîñòî-
ÿò èç ðàçíûõ ñèìâîëîâ). Ïðîàíàëèçèðóéòå ðàáîòó ðàñ-
ñìîòðåííûõ àëãîðèòìîâ ïðè ýòèõ èñõîäíûõ äàííûõ.
6. Çàäàéòå çíà÷åíèÿ P, T è k. Áåç èñïîëüçîâàíèÿ ïðîãðàì-
ìíîãî êîäà àëãîðèòìà Ã. Ëàíäàó – Þ. Âèøêèíà ñîñòàâü-
òå äèàãðàììó ñðàáàòûâàíèé ïðîöåäóð Extend è Merge
(ïî òèïó ïðèâåäåííîé íà ðèñ. 5.2).
7. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà
Ã. Ëàíäàó – Þ. Âèøêèíà.

5.4. Àëãîðèòì Þ. Ìàéåðñà


Âñ¸, â òîì ÷èñëå è ëîæü, ñëóæèò
èñòèíå. Òåíè íå ãàñÿò ñîëíöà.
Ôðàíö Êàôêà

Àëãîðèòì Þ. Ìàéåðñà äëÿ ïðèáëèæåííîãî ïîèñêà îá-


ðàçöà â òåêñòå ñ÷èòàåòñÿ îäíèì èç ñàìûõ ýôôåêòèâíûõ.
Ðàññìîòðèì åãî èäåéíóþ îñíîâó íà «ñêâîçíîì» ïðèìåðå1).

1)
Èçëîæåíèå ìàêñèìàëüíî ïðèáëèæåííî ê òåêñòó êíèãè Á. Ñìèòà (ñ. 325–332)
ïî ïðè÷èíå, êîòîðàÿ ñòàíåò ÿñíà â êîíöå ýòîãî ðàçäåëà.
216 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Ïðèìåð
S1 = aabcab (m = |S1|), S2 = caabb (n = |S2|).
Ââåäåì ìàòðèöó V:
ì1, ïðè S1 [i] ¹ S2 [j],
V [i, j] = í
î0, ïðè S1 [i] = S2 [j].
Äëÿ S1 è S2 îíà ïðèâåäåíà â òàáë. 5.10.

Òàáëèöà 5.10

V a a b c a b
c 1 1 1 0 1 1
a 0 0 1 1 1 1
a 0 0 1 1 1 1
b 1 1 0 1 1 0
b 1 1 0 1 1 0

Ïîäñ÷èòàåì (òàê, êàê ýòî ñäåëàíî â ï. 4.1) ìàòðèöó ðàñ-


ñòîÿíèé (òàáë. 5.11): D[0, 0] = 0; D[0, j] = j äëÿ j îò 1 äî m;
D[i, 0] = i äëÿ i îò 1 äî n; D[i, j] = min{D[i – 1, j] + 1,
D[i, j – 1] + 1, D[i – 1, j – 1] + V[i, j]} ïðè 1 „ i „ n, 1 „ j „ m.
Åñëè îêàæåòñÿ, ÷òî D[i, m] „ k, ãäå k — öåëîå íåîòðèöàòåëü-
íîå ÷èñëî, òî ðåøàåòñÿ è çàäà÷à ïîèñêà S1 â S2[1..i] ñ çàäàí-
íûì ïðèáëèæåíèåì k.

Òàáëèöà 5.11

D a a b c a b
0 1 2 3 4 5 6
c 1 1 2 3 3 4 5
a 2 1 1 2 3 3 4
a 3 2 1 2 3 3 4
b 4 3 2 1 2 3 3
b 5 4 3 2 2 3 3

Èç ñïîñîáà ïîñòðîåíèÿ D ìû âèäèì, ÷òî çíà÷åíèå ðàç-


íîñòè D[i, j] – D[i – 1, j] ïðèíàäëåæèò ìíîæåñòâó èç òðåõ
ýëåìåíòîâ {–1, 0, 1}; àíàëîãè÷íî äåëà îáñòîÿò äëÿ
D[i, j] – D[i, j – 1] è D[i, j] – D[i – 1, j – 1].
5.4. Àëãîðèòì Þ. Ìàéåðñà 217

Ââåäåì, èñõîäÿ èç ýòîé îñîáåííîñòè D, äâå íîâûõ ìàòðè-


öû — D è D¢ (òàáë. 5.12 è 5.13):
l D[i, j] = D[i, j] – D[i,j – 1] — ãîðèçîíòàëüíûå ðàçíîñòè;
l D¢[i, j] = D[i, j] – D[i – 1, j] — âåðòèêàëüíûå ðàçíîñòè.

Òàáëèöà 5.12

D a a b c a b
0 1 1 1 1 1 1
c 0 0 1 1 1 1 1
a 0 –1 0 1 1 0 1
a 0 –1 –1 1 1 0 1
b 0 –1 –1 –1 1 1 0
b 0 –1 –1 –1 0 1 0

Òàáëèöà 5.13

D¢ a a b c a b
0 0 0 0 0 0 0
c 1 0 0 0 –1 –1 –1
a 1 0 –1 –1 0 –1 –1
a 1 1 0 0 0 0 0
b 1 0 1 –1 –1 0 –1
b 1 1 1 1 0 0 0

Ñëåäóþùèå çàâèñèìîñòè ñîñòàâëÿþò îñíîâó àëãîðèòìà


Ã. Ìàéåðñà:
l D[i, j] = min{D[i – 1, j];D¢[i, j – 1];V[i, j] – 1} + (1 – D¢[i,j – 1]);
l D¢[i,j] = min{D[i – 1,j]; D¢[i,j – 1];V[i,j] – 1} + (1 – D[i, j – 1]).

Êàê èõ ïîëó÷èòü? Ïðîâåðèòü ïðîñòî: ïîäñòàâëÿåì äàí-


íûå è ïîëó÷àåì ðàâåíñòâî. Îáðàòíûé æå ïðîöåññ, âåðîÿòíî,
èäåò èç ïðàêòèêè. Ó íàñ åñòü öåëü — ðàçðàáîòàòü àëãîðèòì
íà îñíîâå áèíàðíûõ îïåðàöèé, è àíàëîã — àëãîðèòì Shift-
And. Åñòü íàáëþäåíèå: D ðàçáèâàåòñÿ íà äâå ìàòðèöû, â êî-
òîðûõ ýëåìåíòû ïðèíèìàþò çíà÷åíèÿ èç èíòåðâàëà îò –1 äî
1. Äàëåå èç ïðàêòèêè (èç ïðèìåðîâ) ìû ïîëó÷àåì òðåáóåìûå
çàâèñèìîñòè è äåëàåì ñëåäóþùèé øàã, à èìåííî èçáàâëÿåì-
ñÿ îò –1, èáî â áèíàðíûõ îïåðàöèÿõ åå ïðèñóòñòâèå íåæåëà-
òåëüíî.
218 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Ñõåìà èñêëþ÷åíèÿ –1 îñíîâàíà íà çàìåíå êàæäîé èç


ìàòðèö D è D¢ íà î÷åðåäíûå äâå ìàòðèöû. Äëÿ D — ýòî ìàòðè-
öû P è M, à äëÿ D¢ — ìàòðèöû P¢ è M¢.
Ââîäèì ýòè ìàòðèöû:
ì1, åñëè D [i,j] =1;
P [i, j] = í
î0 — â ïðîòèâíîì ñëó÷àå
è
ì1, åñëè D [i,j] = -1;
M[i, j] = í
î0 — â ïðîòèâíîì ñëó÷àå.
ì -1 Û M[i, j] = 1;
ï
Òîãäà D[i, j] = í 0 Û M[i, j] = 0 è P [i, j] = 0 ;
ï 1 Û P [i, j] = 1.
î

Àíàëîãè÷íî, ìàòðèöà D¢ ðàçáèâàåòñÿ íà äâå ìàòðèöû


P¢ è M¢.  òàáë. 5.14–5.17 ïðèâåäåíû çíà÷åíèÿ ýëåìåíòîâ
ìàòðèö P, M, P¢ è M¢ äëÿ ðàññìàòðèâàåìîãî â äàííîì ðàçäå-
ëå ñêâîçíîãî ïðèìåðà.

Òàáëèöà 5.14

P a a b c a b
c 0 1 1 1 1 1
a 0 0 1 1 0 1
a 0 0 1 1 0 1
b 0 0 0 1 1 0
b 0 0 0 0 1 0

Òàáëèöà 5.15

P’ a a b c a b
c 0 0 0 0 0 0
a 0 0 0 0 0 0
a 1 0 0 0 0 0
b 0 1 0 0 0 0
b 1 1 1 0 0 0
5.4. Àëãîðèòì Þ. Ìàéåðñà 219

Òàáëèöà 5.16

M a a b c a b
c 0 0 0 0 0 0
a 1 0 0 0 0 0
a 1 1 0 0 0 0
b 1 1 1 0 0 0
b 1 1 1 0 0 0

Òàáëèöà 5.17

M¢ a a b c a b
c 0 0 0 1 1 1
a 0 1 1 0 1 1
a 0 0 0 0 0 0
b 0 0 1 1 0 1
b 0 0 0 0 0 0

Öåëü äîñòèãíóòà: ìàòðèöû D è D¢ ñâåäåíû ê áèíàðíûì


ìàòðèöàì P, M, P¢ è M¢. Îñòàëîñü ñäåëàòü ñëåäóþùèé
øàã — ëîãèêó âû÷èñëåíèÿ D è D¢ ïðåîáðàçîâàòü â ëîãèêó âû-
÷èñëåíèÿ P, M, P¢ è M¢.
Ââåäåì ôîðìóëû (K[j] — âñïîìîãàòåëüíàÿ âåëè÷èíà,
ñìûñëîâîé íàãðóçêè îíà íå íåñåò):
l K[j] = Not(V[i, j]) Or M[i – 1, j];
l P[i, j] = M¢[i, j – 1] Or Not(K[j] Or P¢[i, j – 1]);
l M[i, j] = P¢[i, j – 1] And K[j].

Âûñêàæåì óòâåðæäåíèå î òîì, ÷òî D[i, j] =


= P[i, j] – M[i, j]. Åñòåñòâåííî âîçíèêíîâåíèå âîïðîñà —
à êàê îíè (ýòè ôîðìóëû) ïîëó÷åíû? Ïîïûòàåìñÿ âîññòàíîâèòü
ýòîò ïðîöåññ. Çàâèñèìîñòü D[i, j] = min{D[i – 1, j]; D¢[i, j – 1];
V[i, j] – 1} + (1–D¢[i, j–1]) óæå âûâåäåíà.  ïðàâîé ÷àñòè ýòî-
ãî ðàâåíñòâà âåëè÷èíû D[i – 1, j] è D¢[i, j – 1] ïðèíèìàþò
çíà÷åíèÿ èç ìíîæåñòâà {–1, 0, 1}, à âåëè÷èíà V[i, j] — èç
ìíîæåñòâà {0, 1}. Âñåãî ìîæåò áûòü âîñåìíàäöàòü ðàçëè÷-
íûõ çíà÷åíèé (3 · 3 · 2 = 18). Âûïèøåì èõ (ëåâàÿ ÷àñòü
òàáë. 5.18) è ïîäñ÷èòàåì çíà÷åíèå D[i, j]. À òåïåðü —
220 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

âíèìàíèå, âîïðîñ: êàê èç ýëåìåíòîâ ìàòðèö P, M, P¢ è M¢


ïîëó÷èòü òî÷íî òàêîå æå çíà÷åíèå D[i, j]? Âåðîÿòíî, òîëüêî
íàñòîé÷èâàÿ ðàáîòà ñ ïðèìåðàìè ïîçâîëÿåò «óãëÿäåòü» ýòè
çàâèñèìîñòè. Ïðàâàÿ ÷àñòü òàáë. 5.18 äàåò ïðàâî ñ÷èòàòü èñ-
òèííûì óòâåðæäåíèå D[i, j] = P[i, j] – M[i, j].

Òàáëèöà 5.18

D[i – 1,j] D¢[i, j – 1] V[i, j] D[i, j] K[i, j] P[i, j] M[i, j] D[i, j]


–1 –1 0 1 1 1 0 1
–1 –1 1 1 1 1 0 1
–1 0 0 0 1 0 0 0
–1 0 1 0 1 0 0 0
–1 1 0 –1 1 0 1 –1
–1 1 1 –1 1 0 1 –1
0 –1 0 1 1 1 0 1
0 –1 1 1 0 1 0 1
0 0 0 0 1 0 0 0
0 0 1 1 0 1 0 1
0 1 0 –1 1 0 1 –1
0 1 1 0 0 0 0 0
1 –1 0 1 1 1 0 1
1 –1 1 1 0 1 0 1
1 0 0 0 1 0 0 0
1 0 1 1 0 1 0 1
1 1 0 –1 1 0 1 –1
1 1 1 0 0 0 0 0

Àíàëîãè÷íî óñòàíàâëèâàþòñÿ çàâèñèìîñòè è äëÿ D¢[i, j]:


l K¢[j] = Not (V[i, j]) Or M¢[i, j – 1];
l P¢[i, j] = M[i – 1, j] Or Not(K¢[j] Or P[i – 1, j]);
l M¢[i, j] = P[i – 1, j] And K¢[j],

è óòâåðæäåíèå D¢[i, j] = P¢[i, j] – M¢[i, j], ïðîâåðÿåìîå ïðè


âñåõ âîçìîæíûõ èñõîäíûõ äàííûõ (òàáë. 5.19).
5.4. Àëãîðèòì Þ. Ìàéåðñà 221

Òàáëèöà 5.19

D[i – 1, j] D¢[i, j – 1] t[i, j] D¢[i, j] K¢[i, j] P¢[i, j] M¢[i, j] D¢[i, j]


–1 –1 0 1 1 1 0 1
–1 –1 1 1 1 1 0 1
–1 0 0 1 1 1 0 1
–1 0 1 1 0 1 0 1
–1 1 0 1 1 1 0 1
–1 1 1 1 0 1 0 1
0 –1 0 0 1 0 0 0
0 –1 1 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 1 1 0 1 0 1
0 1 0 0 1 0 0 0
0 1 1 1 0 1 0 1
1 –1 0 –1 1 0 1 –1
1 –1 1 –1 1 0 1 –1
1 0 0 –1 1 0 1 –1
1 0 1 0 0 0 0 0
1 1 0 –1 1 0 1 –1
1 1 1 0 0 0 0 0

Âåñü ñìûñë àëãîðèòìà çàêëþ÷àåòñÿ â èñêëþ÷åíèè öèê-


ëà ïî j — â åãî çàìåíå íà íåêóþ ïîñëåäîâàòåëüíîñòü ëîãè÷åñ-
êèõ îïåðàöèé, âûïîëíÿåìûõ ñ ìàøèííûì ñëîâîì äëèíîé w
áèò. Îáû÷íî w ðàâíî 32 èëè 64. Åñëè m > w, òî èñïîëüçóåòñÿ
ém ù
ê w ú ñìåæíûõ ñëîâ.
ê ú
Ââåäåì ïåðåìåííóþ cost ñ íà÷àëüíûì çíà÷åíèåì m è âû-
ïèøåì ïîëó÷åííûå çàâèñèìîñòè:
l K¢:=Not(V[i]) Or ShR(M¢[i], 1);
l P¢[i]:=(M[i – 1]) Or Not(K¢ Or P[i – 1]);
l M¢[i]:=P[i – 1] And K¢;
l ñost:=ñost + P¢[i, m] – M¢[i, m];
l K:=Not(V[i]) Or M[i – 1];
l P[i]:=ShR(M¢[i], 1) Or Not(K Or ShR(P¢[i], 1));
l M[i]:=ShR(P¢[i]) And K.
222 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

Èñïîëüçîâàíèå îïåðàöèè ñäâèãà âïðàâî íà îäèí ðàçðÿä


ñòàíäàðòíî. Ýòîò ïðèåì èñïîëüçîâàëñÿ è â àëãîðèòìå
Shift-And äëÿ îáðàùåíèÿ ê j – 1 ýëåìåíòàì áèíàðíîãî âåê-
òîðà.
Îäíàêî ïðè âíèìàòåëüíîì àíàëèçå çàâèñèìîñòåé ìû âè-
äèì, ÷òî îíè íåðàáîòîñïîñîáíû: çíà÷åíèå K¢ âû÷èñëÿåòñÿ
÷åðåç M¢[i], à çíà÷åíèå M¢[i] — ñ èñïîëüçîâàíèåì K¢!
Á. Ñìèò1) ýòó íåòî÷íîñòü ðàçúÿñíÿåò ïðîñòîé ññûëêîé íà ðà-
áîòó Þ. Ìàéåðñà2), ãîâîðÿ, ÷òî âûêëàäêè, ïðèâîäÿùèå ê ýê-
âèâàëåíòíîé ôîðìóëå K¢ = Not(V[i]) Or (((Not(V[i]) And
P[i – 1]) + P[i – 1]) Xor (P[i – 1])), äîñòàòî÷íî ñëîæíû. Ïðî-
âåðêà æå ýòîãî ñîîòíîøåíèÿ ïóòåì ïðÿìîãî ïîäñ÷åòà çíà÷å-
íèé K¢ äëÿ ñêâîçíîãî ïðèìåðà ïðèâåäåíà â òàáë. 5.20.

Òàáëèöà 5.20

K¢ = Not(V[i]) K¢ = Not(V[i]) Or (((Not(V[i]) And P[i – 1])


i
Or ShR(M¢[i],1) + P[i – 1]) Xor (P[i – 1]))
1 000111 000100
2 111111 111111
3 110010 110010
4 001111 011011
5 001001 001001

 ïåðâîé è ÷åòâåðòîé ñòðîêàõ òàáëèöû çäåñü èìååò ìåñòî


íåñîâïàäåíèå, ÷òî ãîâîðèò î íåýêâèâàëåíòíîñòè ôîðìóë!

@ Óïðàæíåíèÿ
1. Ïðèâåäèòå ïðèìåð äâóõ ñòðîê. Âû÷èñëèòå äëÿ íèõ ìàò-
ðèöó ðàññòîÿíèé D è ìàòðèöû ðàçíîñòåé D è D¢.
2. Íàïèøèòå ïðîãðàììó äëÿ âîññòàíîâëåíèÿ ìàòðèöû D
ïî çàäàííûì ìàòðèöàì D è D¢.
3. Ïðèâåäèòå ïðèìåðû äâóõ ñòðîê. Âû÷èñëèòå äëÿ íèõ
ìàòðèöû D è D¢ è ïðîâåðüòå ïóòåì ïîäñòàíîâêè çíà÷åíèé
èñòèííîñòü çàâèñèìîñòåé:
1)
Ñìèò Á. Ìåòîäû è àëãîðèòìû âû÷èñëåíèé íà ñòðîêàõ. — Ì.: ÎÎÎ
«È. Ä. Âèëüÿìñ», 2006. Ñ. 332.
2)
Myers G. W. A fast bit–vector algorithm for approximate string matching based
on dynamic programming // JACM 46–3, 1999. P. 395–415.
5.4. Àëãîðèòì Þ. Ìàéåðñà 223

l D[i, j] = min{D[i – 1, j]; D¢[i, j – 1]; V[i, j] – 1} + (1 –


– D¢[i, j – 1]);
l D¢[i, j] = min{D[i – 1, j]; D¢[i, j – 1]; V[i, j] – 1} + (1 –
– D[i, j – 1]).
4. Íàïèøèòå ïðîãðàììó äëÿ âîññòàíîâëåíèÿ ìàòðèöû D
ïî çàäàííûì ìàòðèöàì P, M, P¢ è M¢.
5. Ïî àíàëîãèè ñ òàáë. 5.18 è 5.19 ñîñòàâüòå äëÿ êîíêðåòíî-
ãî ïðèìåðà òàáëèöû ïðîâåðêè èñòèííîñòè óòâåðæäåíèé
D[i, j] = P[i, j] – M[i, j] è D¢[i, j] = P¢[i, j] – M¢[i, j].
6. Ðàçðàáîòàéòå ïðîãðàììíóþ ðåàëèçàöèþ àëãîðèòìà ñ èñ-
ïîëüçîâàíèåì ôîðìóëû Þ. Ìàéåðñà äëÿ âû÷èñëåíèÿ
çíà÷åíèé K¢. Íàéäèòå (åñëè îíè åñòü) ïðèìåðû, äëÿ êî-
òîðûõ ðåçóëüòàò âû÷èñëåíèé áóäåò íåâåðíûì.
7. Íàéäèòå êîððåêòíûé ñïîñîá âû÷èñëåíèÿ K¢ èëè îáîñ-
íóéòå êîððåêòíîñòü ïðîâåäåííîé çàìåíû. (Ïðèìå÷àíèå.
Àâòîð íå ñìîã ýòîãî ñäåëàòü.)

Ìåòîäè÷åñêèé êîììåíòàðèé
Ïðîñòîé àëãîðèòì ðåøåíèÿ ðàññìîòðåííîé â ýòîé ãëàâå çà-
äà÷è îñíîâàí íà èäåÿõ äèíàìè÷åñêîãî ïðîãðàììèðîâàíèÿ, îí
äîñòàòî÷íî õîðîøî èçâåñòåí è ìîæåò áûòü èñïîëüçîâàí êàê çà-
äà÷à ñðåäíåé ñëîæíîñòè ïðè èçó÷åíèè ýòîé òåìû.
Ñ. Âó (Sun Wu) è Þ. Ìàíáåð (Udi Manber)1) â 1992 ã. ðàçðà-
áîòàëè ìåòîä, îáîáùàþùèé àëãîðèòì Shift–And íà íàõîæäå-
íèå íåòî÷íîãî âõîæäåíèÿ îáðàçöà â òåêñòå.
Ðåøåíèå çàäà÷è î k-íåñîâïàäåíèÿõ ïðåäñòàâëåíî ìîäèôè-
êàöèåé àëãîðèòìà Ñ. Âó è Þ. Ìàíáåð, à òàêæå àëãîðèòìîì
Ã. Ëàíäàó è Þ. Âèøêèíà.
Àëãîðèòì Ã. Ëàíäàó (Gad Landau) – Þ. Âèøêèíà (Uzi
Vishkin)2), êðîìå òîãî ÷òî îí îòíîñèòñÿ ê ÷èñëó ïåðâûõ, ïðåä-
íàçíà÷åííûõ äëÿ ðåøåíèÿ çàäà÷è î k-íåñîâïàäåíèÿõ, èìååò
ñâîé, îòëè÷àþùèéñÿ îò ðàíåå ðàññìîòðåííûõ, ìåòîä ïðåäâà-
ðèòåëüíîé îáðàáîòêè îáðàçöà P.
Àëãîðèòì Þ. Ìàéåðñà (Gene Myers)3) (òî÷íåå, åãî ìîäèôè-
êàöèÿ) ñ÷èòàåòñÿ îäíèì èç ñàìûõ ýôôåêòèâíûõ â ðåøåíèè çà-
äà÷è ïîèñêà íåòî÷íîãî âõîæäåíèÿ îáðàçöà â òåêñò. Èäåÿ ìîäè-
1)
Wu S., Manber U. Fast text searching allowing errors // CACM 35–10, 1992.
P. 83–91.
2)
Landau G. M., Vishkin U. Efficient string matching with k mismatches // TCS
43, 1986. P. 239–249.
3)
Myers G. W. A fast bit-vector algorithm for approximate string matching based
on dynamic programming // JACM 46–3, 1999. P. 395–415.
224 Ãëàâà 5. Àëãîðèòìû ïðèáëèæåííîãî ïîèñêà ïîäñòðîê

ôèêàöèè çàêëþ÷àåòñÿ â âû÷èñëåíèè íå ïîëíûõ áèíàðíûõ


âåêòîðîâ äëèíû m, à òîëüêî èõ ÷àñòåé, îïðåäåëÿåìûõ êîí-
ñòàíòîé k.  ýòîì ñëó÷àå âðåìåííàÿ îöåíêà ïðåîáðàçóåòñÿ èç
æ ém ù ö æékù ö
Oçç ê ú × n ÷÷ â Oçç ê ú × n ÷÷.
è êw ú ø è êw ú ø
Ïðîáëåìàòèêà ýòîé ãëàâû íå èñ÷åðïûâàåòñÿ îïèñàííûìè
àëãîðèòìàìè. Èçâåñòíû òàêæå àëãîðèòìû Ý. Óêêîíåíà1),
Â. ×àíãà (William Chang) – E. Ëîóëåðà (Eugene Lawler)2),
Ð. Êîóëà (Richard Cole)– Ð. Õàðèõàðàíà (Ramesh Hariharan)3)
è ò. ä. Èõ ñðàâíèòåëüíûé àíàëèç ìîæåò áûòü ïðåäìåòîì ñà-
ìîñòîÿòåëüíîãî èññëåäîâàíèÿ. Â ðàáîòàõ Ð. Áåçà-Éåòñ
(Ricardo Baeza-Yates) è Ã. Íàâàððî (Gonsaio Navarro)4) çàäà÷à
ïðèáëèæåííîãî ïîèñêà îáðàçöà èëè ìíîæåñòâà îáðàçöîâ ðå-
øàåòñÿ ñ èñïîëüçîâàíèåì àïïàðàòà òåîðèè àâòîìàòîâ è îïÿòü
æå èäåé áèòîâîãî ïðåäñòàâëåíèÿ äàííûõ, ò. å. ïóòåì ñâåäåíèÿ
îïðåäåëåííîé ÷àñòè äåéñòâèé àëãîðèòìà ê ëîãè÷åñêèì îïåðà-
öèÿì ñ ìàøèííûìè ñëîâàìè.

1)
Ukkonen E. Finding approximate patterns in strings // J. Algs. 6, 1985.
P. 132–137.
2)
Chang W. I., Lawler E. L. Approximate string matching in sublinear expected
time // Proc. 31st Annual IEEE Symp. Foundations of Computer Science. Vol. 1.
1990. P. 116–124.
3)
Cole R., Hariharan R. Faster approximate string matching // Proc. Ninth
Annual ACM-SIAM Symp. Discrete Algs., 1998. P. 463–472.
4)
Baeza-Yates R., Navarro G. Multiple approximate string matching // Proc.
Fifth Annual Workshop on Algorithms & Data Structures. F. Dehne et al. (eds.),
1997. P. 174–184.
Âìåñòî çàêëþ÷åíèÿ

— À íà òîé ïëàíåòå åñòü îõîòíèêè?


— Íåò.
— Êàê èíòåðåñíî! À êóðû òàì åñòü?
— Íåò.
— Íåò â ìèðå ñîâåðøåíñòâà! —
âçäîõíóë ëèñ.
Àíòóàí äå Ñåíò-Ýêçþïåðè,
«Ìàëåíüêèé ïðèíö»

Âçãëÿä íà èíôîðìàòèêó êàê íà ïðåäìåò â îáùåîáðàçîâà-


òåëüíîé øêîëå çà íåìíîãèì áîëåå ÷åì äâàäöàòèëåòíåå ðàç-
âèòèå îáëàäàë íåêîåé «àíîìàëüíîé» èçìåí÷èâîñòüþ. Ñ îä-
íîé ñòîðîíû, ýòà ñèòóàöèÿ îáóñëîâëåíà îáúåêòèâíûìè
ïðè÷èíàìè (äèíàìè÷íîñòü ðàçâèòèÿ äàííîé îáëàñòè äåé-
ñòâèòåëüíîñòè è ò. ä.), à ñ äðóãîé — âñå ëè ëàäíî â íàøåì
«Äàòñêîì êîðîëåâñòâå»? Ïîïðîáóåì êàê áû çàáûòü íà âðåìÿ
îáî âñåõ ñóùåñòâóþùèõ êîíöåïöèÿõ, ïîçèöèÿõ, ó÷åáíè-
êàõ1) è ò. ä. è, îïèðàÿñü òîëüêî íà áîëåå ÷åì òðèäöàòèëåò-
íèé îïûò ðàáîòû êàê â ðàçðàáîòêå ðåàëüíûõ ñèñòåì îáðàáîò-
êè èíôîðìàöèè, òàê è â îáðàçîâàòåëüíîé èíôîðìàòèêå,
ñôîðìóëèðîâàòü òî÷êó çðåíèÿ ïðàãìàòèêà.
Çàäàäèì ñåáå ïåðâûé íàèâíûé âîïðîñ — «÷òî òàêîå èí-
ôîðìàòèêà»? È îêàçûâàåòñÿ, ÷òî äàòü ïðîñòîé è ÿñíûé îòâåò
íà íåãî íå î÷åíü ïðîñòî! Òàêèå îáëàñòè, êàê, íàïðèìåð, ìàòå-
ìàòèêà èëè ôèçèêà, èìåþò äîñòàòî÷íî ÷åòêèå ãðàíèöû, à èí-
ôîðìàòèêà? Êîíå÷íî, äîïóñòèìî ñêàçàòü: ýòî — ÷òî-òî ñâÿ-
çàííîå ñ èíôîðìàöèîííûìè ïðîöåññàìè, ñ îáðàáîòêîé èí-
ôîðìàöèè è ò. ä., íî òîãäà îäíî ïîíÿòèå áóäåò îïðåäåëÿòüñÿ
÷åðåç äðóãèå, îáðàçóåòñÿ äëèííàÿ ïîíÿòèéíàÿ öåïî÷êà, ÷àñ-
òî — òàâòîëîãè÷åñêàÿ, è ïðàãìàòèêó íå î÷åíü ÿñíî, ãäå íà÷à-
ëî è ãäå êîíåö ýòîãî ïîíÿòèéíîãî ìíîãîîáðàçèÿ.
Óïðîñòèì (èëè óñëîæíèì?) ïåðâîíà÷àëüíûé âîïðîñ:
«Âîçìîæíà ëè èíôîðìàòèêà áåç êîìïüþòåðà»? Åñëè îòâå-
òèòü «äà», òî ãðàíèöû ýòîé îáëàñòè ñòàíîâÿòñÿ åùå áîëåå íå-

1)
Àâòîð íå èãðàåò çäåñü â èãðó «êòî ïðàâ, êòî âèíîâàò» èëè «÷òî òàêîå õîðîøî,
÷òî òàêîå ïëîõî», à ðàññìàòðèâàåò ñèòóàöèþ êàê äàííîñòü, ñëîæèâøóþñÿ â
õîäå èñòîðè÷åñêîãî ðàçâèòèÿ ÿâëåíèÿ, åñòåñòâåííî, â ðåçóëüòàòå îáúåêòèâ-
íûõ è ñóáúåêòèâíûõ ôàêòîðîâ.
226 Âìåñòî çàêëþ÷åíèÿ

îïðåäåëåííûìè, ïîíÿòèå «èíôîðìàòèêà» ïåðåõîäèò â ðàç-


ðÿä «ñâåðõîòêðûòûõ», è âïîðó çàäàòü âîïðîñ — «à ÷òî íå
åñòü èíôîðìàòèêà»? Íî ïðåäïîëîæèì, ÷òî ìû îòâåòèëè
«íåò».  ýòîì ñëó÷àå ó íàñ óæå ïîÿâëÿåòñÿ ãðàíèöà, ïóñòü
ïîêà òîëüêî «ïóíêòèðíàÿ». Íî ïîÿâëÿåòñÿ è íîâîå ïîíÿ-
òèå — «êîìïüþòåð», è òóò æå âîçíèêàþò âîïðîñû êàê ìèíè-
ìóì î âçàèìîñâÿçè ïîíÿòèé è î òîì, ÷òî åñòü êîìïüþòåð —
îáúåêò èçó÷åíèÿ â èíôîðìàòèêå èëè ñðåäñòâî (èíñòðóìåíò)
èçó÷åíèÿ èíôîðìàòèêè?
Îïðåäåëèìñÿ ñ óñëîâíûìè ãðàíèöàìè ïîíÿòèÿ «êîìïüþ-
òåð». Ñàìûé íèçøèé óðîâåíü — ýòî «æåëåçî» (hardware).
Áåçóñëîâíî, ïîíèìàíèå òîãî, êàê ôóíêöèîíèðóåò àïïàðàò-
íîå îáåñïå÷åíèå, íåîáõîäèìî. Õîðîøî, íàïðèìåð, çíàíèå
òîãî, ÷òî äëÿ ðåàëèçàöèè âñåõ âîçìîæíîñòåé ýòîãî óðîâíÿ
êîìïüþòåðó äîñòàòî÷íî óìåòü âûïîëíÿòü òîëüêî îïåðàöèè
èíâåðñèè, ñäâèãà íà îäèí ðàçðÿä è ïðèáàâëåíèÿ åäèíèöû, à
âñå îñòàëüíûå îïåðàöèè êîíñòðóèðóþòñÿ èç ýòèõ ïðèìèòè-
âîâ. Íî ïîëåçíîñòü êîìïüþòåðà ïðè òàêîì îãðàíè÷åíèè
ìåíüøå, ÷åì ó ìîëîòêà: ïîñëåäíèì õîòÿ áû ìîæíî ãâîçäè
çàáèâàòü J. Òàêèì îáðàçîì, â ïîíÿòèå «êîìïüþòåð» ñëåäó-
åò âëîæèòü êàê ìèíèìóì îïåðàöèîííóþ ñèñòåìó (åå îñíîâ-
íûå ôóíêöèîíàëüíûå âîçìîæíîñòè è ñòðóêòóðó) è ïðîñòåé-
øóþ ñèñòåìó ïðîãðàììèðîâàíèÿ. Ïîñëå ýòîãî êîìïüþòåð
óæå âûïîëíÿåò ñâîå îñíîâíîå ïðåäíàçíà÷åíèå — âû÷èñëÿåò
è ïåðåáèðàåò, ò. å. ïðîèñõîäèò òî ÷óäåñíîå «îæèâëåíèå»,
êîòîðîå äåëàåò êîìïüþòåð óíèâåðñàëüíûì óñòðîéñòâîì,
óíèâåðñàëüíûì âû÷èñëèòåëåì è ïåðåáîðùèêîì âàðèàíòîâ.
Èòàê, ãðàíèöà î÷åð÷åíà, è ïðîñìàòðèâàåòñÿ, â êàêîì
îáúåìå (õîòÿ áû ìèíèìàëüíîì) êîìïüþòåð ÿâëÿåòñÿ îáúåê-
òîì èçó÷åíèÿ. À ÷òî äàëüøå? Äàëüøå ó íàñ äâà ïóòè. Ïåð-
âûé — ðàñøèðÿÿ ïîíÿòèå «êîìïüþòåð», äîáàâëÿÿ ê íåìó
óæå íåêèé ãîòîâûé ôóíêöèîíàë (íàïðèìåð, ãðàôè÷åñêèé ðå-
äàêòîð), ìû ìîæåì èçó÷àòü åãî è óòâåðæäàòü, ÷òî èçó÷àåòñÿ
èíôîðìàòèêà — ðåäàêòîðû æå ñâÿçàíû ñ êîìïüþòåðîì! Âòî-
ðîé ïóòü — îòâåòèòü íà âîïðîñ, ÷òî ïðîèçîøëî â öåïî÷êå îò
ïîòðåáíîñòè ÷åëîâåêà ðèñîâàòü ê ïîÿâëåíèþ ó êîìïüþòåðà
òàêîãî ôóíêöèîíàëà, óäîâëåòâîðÿþùåãî ýòó ïîòðåáíîñòü.
Îñòàâèì íà âðåìÿ âòîðîé ïóòü è çàêîí÷èì ðàññóæäåíèÿ
î íàøåì ïîíèìàíèè êîìïüþòåðà. Ïîâòîðèì ìûñëü, ÷òî âîç-
ìîæíîñòè êîìïüþòåðà îãðàíè÷åíû. Ïðîñòåéøèé ïðèìåð
(÷óòü-÷óòü àáñóðäíûé): ëþáîé èç íàñ, åñëè ïîòðåáóåòñÿ, âû-
ïîëíèò îïåðàöèþ âû÷èñëåíèÿ 101000, ïðîñòî çàïèñûâàÿ ñî-
îòâåòñòâóþùåå êîëè÷åñòâî íóëåé, à âîò êîìïüþòåð (áåç ñïå-
Âìåñòî çàêëþ÷åíèÿ 227

öèàëüíûõ óõèùðåíèé) ýòîãî íå ñäåëàåò! Åñòåñòâåííî, ÷òî


âîçìîæíîñòè êîìïüþòåðà óâåëè÷èâàþòñÿ ñî âðåìåíåì —
ñðàâíèì õîòÿ áû êîìïüþòåðû äâàäöàòèëåòíåé äàâíîñòè è
íûíåøíèå. Ðàñøèðåíèå âîçìîæíîñòåé ïîçâîëÿåò ðåøàòü
âñå íîâûå ïðîáëåìû è ñîâåðøåíñòâîâàòü ðåøåíèÿ ñòàðûõ,
íî îãðàíè÷åííîñòü êîìïüþòåðà îñòàåòñÿ.
Îäíàêî âåðíåìñÿ ê íàøèì ðàññóæäåíèÿì îá èíôîðìàòè-
êå è ïðîäîëæèì èõ ñ ïîìîùüþ ïðèìåðà. ×åëîâåê è äî ïîÿâ-
ëåíèÿ êîìïüþòåðà ðàáîòàë ñ òåêñòîì. Â çàâèñèìîñòè îò âèäà
åãî äåÿòåëüíîñòè, ýòà ðàáîòà áûëà ðàçëè÷íîé (ïèñàòåëü, ðå-
äàêòîð è ò. ä.). Äðóãèìè ñëîâàìè, åñòü ïîòðåáíîñòü ðàáîòû
ñ òåêñòîì è åñòü ïðîáëåìà ðàáîòû ñ òåêñòîì. Ñ ïîÿâëåíèåì
êîìïüþòåðà ÷åëîâåê «óãëÿäåë», ÷òî ïîñëåäíèé ìîæåò áûòü
ïîëåçåí äëÿ óäîâëåòâîðåíèÿ ýòîé ïîòðåáíîñòè, è ðàçðàáîòàë
âíà÷àëå ïðîñòåéøèé òåêñòîâûé ðåäàêòîð, à çàòåì òåêñòî-
âûé ïðîöåññîð ñ îãðîìíûìè (åñëè ñðàâíèâàòü ñ ïåðâûìè
âåðñèÿìè) âîçìîæíîñòÿìè. Îòìåòèì, ÷òî â äàííîì ñëó÷àå
(êàê è â äðóãèõ) ñîâåðøåíñòâî èíñòðóìåíòà, à òåêñòîâûé
ïðîöåññîð ÿâëÿåòñÿ èìåííî èíñòðóìåíòîì, îêàçûâàåò îá-
ðàòíîå âëèÿíèå íà ïðîöåññ ðàáîòû ñ òåêñòîì (îáðàòíàÿ
ñâÿçü). Íî íå ýòî ãëàâíîå, à ïðîäîëæåíèå íàøåãî íàèâíîãî
âîïðîñà — «ãäå çäåñü èíôîðìàòèêà»?
Èòàê, â ñàìîì îáùåì âèäå (ñì. ðèñ. 1) åñòü äåéñòâèòåëü-
íîñòü, åñòü ïðîáëåìû ýòîé äåéñòâèòåëüíîñòè è åñòü îòîáðà-
æåíèå ýòèõ ïðîáëåì â íåêèå èõ ðåøåíèÿ, èñïîëüçóþùèå
êîìïüþòåð, â ðåçóëüòàòå ÷åãî ïîëó÷àþòñÿ íåêèå ïðîäóêòû
(ïðè÷åì òàê íàçûâàåìûå «íîâûå èíôîðìàöèîííûå òåõíîëî-
ãèè» — ýòî ëèøü íåáîëüøàÿ ÷àñòü ýòèõ ïðîäóêòîâ), óäîâ-
ëåòâîðÿþùèå ïîòðåáíîñòÿì ýòîé äåéñòâèòåëüíîñòè.
Ïðèìåðû ìîæíî ïðîäîëæèòü. Âîò åùå îäèí èç íèõ äëÿ íà-
ãëÿäíîñòè, ñâÿçàííûé, â ÷àñòíîñòè, è ñ îáðàáîòêîé òåêñòîâ.
 ìîëåêóëÿðíîé áèîëîãèè è â äðóãèõ îáëàñòÿõ çíàíèé ñó-
ùåñòâóåò ïðîáëåìà ïîèñêà â áîëüøèõ îáúåìàõ òåêñòîâûõ äàí-
íûõ âõîäÿùèõ â íèõ îáðàçöîâ. Ïðîîáðàçîì ýòîé ïðîáëåìû ÿâ-
ëÿåòñÿ ýëåìåíòàðíàÿ çàäà÷à ïîèñêà ñëîâà â òåêñòå. Ïîñòîÿí-
íîå íàðàùèâàíèå âîçìîæíîñòåé óðîâíÿ B (ñì. ðèñ. 1) íå
ðåøàëî çàïðîñû äåéñòâèòåëüíîñòè. È ïîýòîìó â ïîñëåäíèå
30 ëåò ñôîðìèðîâàëñÿ íîâûé ïîäðàçäåë èíôîðìàòèêè — «ìå-
òîäû îáðàáîòêè ñòðîê».
Âåðíåìñÿ ê ïåðâîíà÷àëüíîìó âîïðîñó. Èíôîðìàòèêà —
ýòî óðîâíè A, B, C èëè A è B? (Ìû îñòàâëÿåì òîëüêî ñàìûå
ëîãè÷åñêè ðàçóìíûå ñî÷åòàíèÿ.) Îòìåòèì, ÷òî ïðè ïîëîæè-
òåëüíîì îòâåòå íà âîïðîñ î âçàèìîñâÿçè èíôîðìàòèêè è
228 Âìåñòî çàêëþ÷åíèÿ

Ðèñ. 1

êîìïüþòåðà («âîçìîæíà ëè èíôîðìàòèêà áåç êîìïüþòåðà»)


â íàøåé ñõåìå, à îíà ïðèìåíèìà íå òîëüêî ê èíôîðìàòèêå,
ïîÿâëÿåòñÿ åùå îäèí òðóäíî îïðåäåëèìûé «ïðÿìîóãîëü-
íèê».
Äàëåå ìîæíî áûëî áû ðàññóæäàòü ñëåäóþùèì îáðàçîì.
Ìîæíî âçÿòü îáðàçîâàòåëüíûé ñòàíäàðò øêîëüíîãî êóðñà,
ñîîòíåñòè åãî ïîëîæåíèÿ ñ ïðèâåäåííîé ñõåìîé, à çàòåì íà
îñíîâå íåêîåãî àíàëèçà ñ ó÷åòîì ïðèâíåñåííûõ èçâíå ïîëî-
æåíèé ñäåëàòü îïðåäåëåííûå âûâîäû è îòâåòèòü íà ïîñòàâ-
ëåííûé âîïðîñ. Î÷åâèäíî, ÷òî â çàâèñèìîñòè îò ýòèõ «ïðè-
âíåñåííûõ èçâíå ïîëîæåíèé» ìîãóò ïîëó÷èòüñÿ ðàçëè÷íûå
ðåçóëüòàòû — âïëîòü äî òîãî, ÷òî ìû ðàññóæäàåì âîâñå íå î
òîì, èëè äî ïîÿâëåíèÿ íåêîåé «íîâîé èíôîðìàòèêè» (íà-
ïðèìåð, «àñîöèàëüíîé»). Íî ìû ïîïðîáóåì ïîéòè äðóãèì
ïóòåì — ñïðîåöèðóåì ñèòóàöèþ íà âûñøóþ øêîëó, ïîé-
ìåì, êàê îòâå÷àþò íà ïîñòàâëåííûé âîïðîñ â íåé, è ñäåëàåì
«îáðàòíóþ ïðîåêöèþ» íà îáùåîáðàçîâàòåëüíóþ øêîëó. (Òà-
êèå îïåðàöèè «ïðîåöèðîâàíèÿ», êàê ïðÿìîãî, òàê è îáðàò-
íîãî, íå ïðèâîäÿò ê èñêàæåíèþ ïðåäìåòà àíàëèçà, èáî ðå÷ü
èäåò îá îäíîì è òîì æå, ïðîñòî â ðàçíûõ îáúåìàõ.)
Âìåñòî çàêëþ÷åíèÿ 229

Îáëàñòü âûñøåé øêîëû òàêæå ïîðàæàåò ñâîèì ìíîãîîá-


ðàçèåì íàïðàâëåííîñòè ïîäãîòîâêè ñïåöèàëèñòîâ ïî èíôîð-
ìàòèêå, íî èìååò áîëåå îïðåäåëåííûå ãðàíèöû. Âû÷ëåíèì
òðè îñíîâîïîëàãàþùèõ ðîññèéñêèõ îáðàçîâàòåëüíûõ ñòàí-
äàðòà.
Ñïåöèàëüíîñòü 010200 — «Ïðèêëàäíàÿ ìàòåìàòèêà è
èíôîðìàòèêà», êâàëèôèêàöèÿ — ìàòåìàòèê, ñèñòåìíûé
ïðîãðàììèñò. Åñòåñòâåííî, ÷òî çäåñü îñóùåñòâëÿåòñÿ ôóí-
äàìåíòàëüíàÿ ïîäãîòîâêà ïî ìàòåìàòèêå. Â áëîêå îáùåîáðà-
çîâàòåëüíûõ äèñöèïëèí èíôîðìàòèêà ïðåäñòàâëåíà çäåñü
êóðñàìè «ßçûêè ïðîãðàììèðîâàíèÿ è ìåòîäû òðàíñëÿöèè»,
«Ñèñòåìíîå è ïðèêëàäíîå ïðîãðàììíîå îáåñïå÷åíèå» è
«Áàçû äàííûõ è ýêñïåðòíûå ñèñòåìû». Îñòàëüíûå ñîñòàâëÿ-
þùèå ïîäãîòîâêè çàâèñÿò îò âûáðàííîé â âóçå ñïåöèàëèçà-
öèè, íî â îñíîâíîì, åñëè ïîñëåäíÿÿ ñâÿçàíà ñ èíôîðìàòèêîé,
ðàññìàòðèâàþòñÿ âîïðîñû ïðîãðàììèðîâàíèÿ è ôóíêöèîíè-
ðîâàíèÿ îïåðàöèîííûõ ñèñòåì ðàçíîãî íàçíà÷åíèÿ. Òàêèì
îáðàçîì, ñîãëàñíî íàøåé ñõåìå (ñì. ðèñ. 1), ýòî óðîâíè A è B,
ïðè÷åì óðîâåíü A òðàêòóåòñÿ ÷èñòî ñ ìàòåìàòè÷åñêèõ ïîçè-
öèé. Ñîãëàñíî ëîãèêå ñòàíäàðòà, ïîäãîòîâêà ïî ìàòåìàòèêå
îáåñïå÷èâàåò ðåàëèçàöèþ îòîáðàæåíèÿ A, ñ ÷åì, êîíå÷íî,
òðóäíî ñîãëàñèòüñÿ. Ìàòåìàòè÷åñêàÿ ñîñòàâëÿþùàÿ â A,
áåçóñëîâíî, åñòü, â íåêîòîðûõ ïðîáëåìàõ îíà èìååò ïðèíöè-
ïèàëüíîå çíà÷åíèå, íî ñâåäåíèå ìåòîäîâ ðåøåíèÿ ïðîáëåì
òîëüêî ê íåé íå ñîîòâåòñòâóåò ðåàëüíîìó ñîñòîÿíèþ äåë. È
çäåñü â èíôîðìàòèêå èìååò ìåñòî ïàðàäîêñàëüíàÿ ñèòóàöèÿ,
îáðàçíî õàðàêòåðèçóåìàÿ ôðàçîé «ñàïîæíèê áåç ñàïîã». Ñïå-
öèàëèñòû ïî èíôîðìàòèêå ñîçäàþò ñèñòåìû îáðàáîòêè èí-
ôîðìàöèè ðàçëè÷íîãî íàçíà÷åíèÿ, â ÷àñòíîñòè àâòîìàòèçè-
ðóþùèå ðàçëè÷íûå âèäû äåÿòåëüíîñòè, íî ñîáñòâåííàÿ äåÿ-
òåëüíîñòü ïî îòîáðàæåíèþ ïðîáëåìû â íåêèé ïðîãðàììíûé
ïðîäóêò (óðîâåíü A) ñîîòâåòñòâóþùåé ïîääåðæêè ïðàêòè-
÷åñêè íå èìååò! Ñòðóêòóðíîå, îáúåêòíî-îðèåíòèðîâàííîå
ïðîåêòèðîâàíèå, à òàêæå ðàçëè÷íûå òåõíîëîãèè òèïà CASE
(Computer Aided Software Engineering) èëè RAD (Rapid
Application Development) ëèøü ÷àñòè÷íî ðåøàþò ýòó ïðîáëå-
ìó, ïðè÷åì ïîñëåäíèå îòíîñÿò ñêîðåå ê óðîâíþ C, à íå A.
Åñòåñòâåííî, ÷òî ýòà ÷àñòü ïðîáëåìàòèêè óðîâíÿ A ñëàáî
ïðåäñòàâëåíà â îáðàçîâàòåëüíûõ ñòàíäàðòàõ èëè âîîáùå íè-
êîèì îáðàçîì òàì íå çàòðàãèâàåòñÿ.
Ñïåöèàëüíîñòü 351400 — «Ïðèêëàäíàÿ èíôîðìàòèêà
(ïî îáëàñòÿì)», êâàëèôèêàöèÿ — èíôîðìàòèê (êâàëèôè-
êàöèÿ â îáëàñòè). Äëÿ îïðåäåëåííîñòè áóäåì ñ÷èòàòü òàêîé
230 Âìåñòî çàêëþ÷åíèÿ

îáëàñòüþ ýêîíîìèêó (ñàìûé ðàñïðîñòðàíåííûé âàðèàíò).


Îáùåîáðàçîâàòåëüíûé áëîê çäåñü ïðåäñòàâëåí ñòàíäàðòíûì
íàáîðîì êóðñîâ: âû÷èñëèòåëüíûå ñèñòåìû, ñåòè è òåëåêîì-
ìóíèêàöèè; èíôîðìàöèîííûå ñèñòåìû; áàçû äàííûõ; âûñî-
êîóðîâíåâûå ìåòîäû èíôîðìàòèêè è ïðîãðàììèðîâàíèÿ;
îïåðàöèîííûå ñèñòåìû, ñðåäû è îáîëî÷êè; èíôîðìàöèîííûå
òåõíîëîãèè. Ê ñïåöèàëüíûì äèñöèïëèíàì îòíîñÿòñÿ ïðîåê-
òèðîâàíèå èíôîðìàöèîííûõ ñèñòåì; èíòåëëåêòóàëüíûå èí-
ôîðìàöèîííûå ñèñòåìû; èíôîðìàöèîííàÿ áåçîïàñíîñòü, à
òàêæå èíôîðìàöèîííûå ñèñòåìû â áóõãàëòåðñêîì ó÷åòå è
àóäèòå, â áàíêîâñêîì äåëå è ò. ä. Èòîãî, â äàííîì ñòàíäàðòå
÷åòêî ïðåäñòàâëåí óðîâåíü B (åãî ïðîãðàììíàÿ ñîñòàâëÿþ-
ùàÿ) è òà ÷àñòü óðîâíÿ C, êîòîðàÿ îòíîñèòñÿ ê âûáðàííîé îò-
ðàñëè. Óðîâåíü A äàåòñÿ ñêîðåå â òåõíîëîãè÷åñêîì ïëàíå,
ñâÿçàííîì ñ îáùèìè âîïðîñàìè ïðîåêòèðîâàíèÿ èíôîðìà-
öèîííûõ ñèñòåì.
Ñïåöèàëüíîñòü 654600 — «Èíôîðìàòèêà è âû÷èñëè-
òåëüíàÿ òåõíèêà», êâàëèôèêàöèÿ — èíæåíåð. Îáùåîáðà-
çîâàòåëüíûé áëîê çäåñü ñ òî÷íîñòüþ äî äåòàëåé ñîâïàäàåò ñ
àíàëîãè÷íûì áëîêîì ïðåäûäóùåé ñïåöèàëüíîñòè, à â ñïå-
öèàëüíûõ äèñöèïëèíàõ (â çàâèñèìîñòè îò ñïåöèàëèçàöèè)
áîëåå äåòàëüíî ïðåäñòàâëåí óðîâåíü B, íàïðèìåð êóðñàìè
«Òåîðèÿ âû÷èñëèòåëüíûõ ïðîöåññîâ», «Àðõèòåêòóðà âû-
÷èñëèòåëüíûõ ñèñòåì» è ò. ä. Óðîâåíü A îòîæäåñòâëÿåòñÿ
ñ ïðîãðàììèðîâàíèåì.
Ñ íåêîòîðûìè îãîâîðêàìè ìîæíî ñ÷èòàòü, ÷òî ïîäãîòîâ-
êà ñïåöèàëèñòîâ ïî óðîâíþ A îñóùåñòâëÿåòñÿ â ðàìêàõ ñïå-
öèàëüíîñòè «Ïðèêëàäíàÿ ìàòåìàòèêà è èíôîðìàòèêà»
(êâàëèôèêàöèÿ âûïóñêíèêà — ìàòåìàòèê, ñèñòåìíûé ïðî-
ãðàììèñò), ïî óðîâíþ B — «Èíôîðìàòèêà è âû÷èñëèòåëü-
íàÿ òåõíèêà» (êâàëèôèêàöèÿ âûïóñêíèêà — èíæåíåð), ïî
óðîâíþ C — «Ïðèêëàäíàÿ èíôîðìàòèêà (ïî îòðàñëÿì)»
(êâàëèôèêàöèÿ âûïóñêíèêà — íàïðèìåð, èíôîðìàòèê-
ýêîíîìèñò).
Èòàê, åñëè óðîâíè B è C äîñòàòî÷íî ÷åòêî î÷åð÷èâàþò-
ñÿ, òî ñ óðîâíåì A âñå îáñòîèò íåñêîëüêî ñëîæíåå. Òàê èëè
èíà÷å, â íåì ïðèñóòñòâóåò òî, ÷òî îáîçíà÷àþò ïîíÿòèåì
«ïðîãðàììèðîâàíèå». Íî ñàìî ïî ñåáå ïðîãðàììèðîâàíèå
êàê çíàíèå ñèñòåì ïðîãðàììèðîâàíèÿ è óìåíèå ÷òî-òî íà
íèõ çàïèñûâàòü, ïóñòü äàæå â ôîðìàëèçîâàííîì âèäå, íå ðå-
øàåò ïðîáëåìû îòîáðàæåíèÿ A (ñì. ðèñ. 1), êàê íå ðåøàåò åå
è ÷èñòî ìàòåìàòè÷åñêàÿ ñîñòàâëÿþùàÿ ïîäãîòîâêè!
Âìåñòî çàêëþ÷åíèÿ 231

Ïðèâåäåì ïðèìåðû â ïîäêðåïëåíèå òî÷êè çðåíèÿ «çà» è


«ïðîòèâ». Íîâûé ðàçäåë èíôîðìàòèêè — ìåòîäû îáðàáîòêè
ñòðîê, èìåþùèé îãðîìíîå çíà÷åíèå äëÿ ìíîãî÷èñëåííûõ
ïðèëîæåíèé. Åãî ìàòåìàòè÷åñêàÿ ñîñòàâëÿþùàÿ ìèíè-
ìàëüíà. Äðóãîé ðàçäåë — ìåòîäû çàùèòû èíôîðìàöèè, ãäå
áåç çíàíèÿ ìàòåìàòèêè íå äîñòèãàåòñÿ äàæå ïåðâè÷íîå ïî-
íèìàíèå ñóòè ïèîíåðñêîé ðàáîòû Ó. Äèôôè è Ì. Ý. Õåëëìà-
íà. Íî è â òîì, è â äðóãîì ñëó÷àå êëþ÷îì ÿâëÿåòñÿ ïîíÿòèå
«àëãîðèòì» è íå÷òî (âñïîìíèì ñèòóàöèþ «ñàïîæíèê áåç ñà-
ïîã»), ÷òî ìû óñëîâíî îáîçíà÷èì êàê èñêóññòâî ïåðåâîäà
ðåøåíèÿ ïðîáëåìû (çàìåòèì — îíî íå ñâîäèòñÿ ê àëãîðèò-
ìó!) íà ÿçûê, ïîíÿòíûé íà óðîâíå B.
Ïîäâåäåì îïðåäåëåííóþ ÷åðòó ïîä âûøåèçëîæåííûì.
Óðîâíè B è C ÷åòêî ïðîïèñûâàþòñÿ â ñòàíäàðòàõ, ÷åãî íå
ñêàæåøü îá óðîâíå A: îáùåïðèíÿòîãî ïîíèìàíèÿ óðîâíÿ A
íåò, à ðàçëè÷íûå åãî òðàêòîâêè îïèðàþòñÿ íà íå î÷åíü ïî-
íÿòíóþ àêñèîìàòèêó. Èñïîëüçîâàíèå æå íàìè ïîíÿòèÿ «èñ-
êóññòâî» — âûíóæäåííîå. ×åëîâåê, êîãäà åãî íå óäîâëåòâî-
ðÿåò îïðåäåëåííûé ÿçûê êàê èíñòðóìåíò ôîðìàëèçàöèè,
ñîçäàåò íåêèé «ìåòàÿçûê». Íî â äàííîì ñëó÷àå âñå ïîïûòêè
ñîçäàíèÿ åãî â èíôîðìàòèêå òðóäíî ñ÷èòàòü óñïåøíûìè, è
ïîïóëÿðíîå â íàñòîÿùåå âðåìÿ îáúåêòíî-îðèåíòèðîâàííîå
ïðîåêòèðîâàíèå âðÿä ëè â ïîëíîì îáúåìå ðåøàåò ïðîáëåìó.
À â øêîëå, â øêîëüíîì îáðàçîâàíèè, äåëàåòñÿ ïîïûòêà
èíòåãðàöèè óðîâíåé â åäèíîå öåëîå â ðàìêàõ îãðàíè÷åííîãî
âðåìåíè íà èçó÷åíèå. È åñòåñòâåííî, âîçíèêàåò âîïðîñ —
âîçìîæíî ëè ðåøåíèå äàííîé ïðîáëåìû? Êàê ñîáðàòü â ìà-
ëîì (ïî âðåìåíè) áîëüøîå, è íå ïðîñòî áîëüøîå, à ïîñòîÿííî
ðàñòóùåå, îñîáåííî íà óðîâíå Ñ, öåëîå?
Ïîìèìî òåîðåòè÷åñêîé âîçìîæíîñòè òàêîé èíòåãðàöèè,
åñòü åùå îäèí âîïðîñ — à íàäî ëè ýòî äåëàòü? Åñëè ñëåäîâàòü
ëîãèêå îäíîãî èç ãîñóäàðñòâåííûõ ìóæåé, óòâåðæäàþùåãî,
÷òî îñíîâíîé çàäà÷åé øêîëû ÿâëÿåòñÿ «ïîäãîòîâêà ãðàìîò-
íîãî ïîëüçîâàòåëÿ òåõíîëîãèé» (åñòåñòâåííî, ñ ïðèñòàâ-
êîé — «íîâûõ èíôîðìàöèîííûõ»), òî, êîíå÷íî, «äà», — è
îñíîâíîé àêöåíò äîëæåí áûòü ñäåëàí íà óðîâíå Ñ. Êñòàòè,
èçó÷åíèå óðîâíÿ Ñ èìååò åùå îäíó îñîáåííîñòü, êîòîðóþ
ïðîñòî íåîáõîäèìî îòìåòèòü. Íàó÷íî äîêàçàíî1), ÷òî ñó-
ùåñòâóþùèå ìåòîäèêè èçó÷åíèÿ óðîâíÿ Ñ (âî âñÿêîì ñëó-
1)
Îêóëîâ Ñ. Ì., Ñóâîðîâà Ò. Í. Î òðàäèöèîííîé ìåòîäèêå èçó÷åíèÿ èíôîðìà-
öèîííûõ òåõíîëîãèé // Èíôîðìàòèêà è îáðàçîâàíèå. 2006. ¹ 11. Ñ. 93–96;
Ñóâîðîâà Ò. Í. Ñîâåðøåíñòâîâàíèå ìåòîäèêè èçó÷åíèÿ èíôîðìàöèîííûõ
òåõíîëîãèé â øêîëüíîì êóðñå èíôîðìàòèêè: Àâòîðåô. äèñ. ... êàíä. ïåä.
íàóê. — Ì., 2007.
232 Âìåñòî çàêëþ÷åíèÿ

÷àå òå, êîòîðûå ïðåäñòàâëåíû â ñîâðåìåííûõ øêîëüíûõ


ó÷åáíèêàõ) íå ðàçâèâàþò èëè î÷åíü ñëàáî ðàçâèâàþò èíòåë-
ëåêòóàëüíûé ïîòåíöèàë øêîëüíèêà. (Ìû íå ãîâîðèì, ÷òî
íå ó÷àò, íî ýòî íåñêîëüêî ðàçíûå ñðåçû ÿâëåíèÿ.) Ñóììà çà-
ïîìèíàåìîãî ôàêòîãðàôè÷åñêîãî ìàòåðèàëà îãðîìíà, òàê
æå êàê è íàâûêè ìàíèïóëèðîâàíèÿ ìûøüþ. Íî âåäü ñâÿòàÿ
ñâÿòûõ îáðàçîâàíèÿ — ýòî ðàçâèòèå øêîëüíèêà, ðàçâèòèå
åãî óìñòâåííûõ ñïîñîáíîñòåé è âîçìîæíîñòåé, ïîçâîëÿþ-
ùèõ ðåøàòü ëþáóþ âñòðå÷àþùóþñÿ ïðîáëåìó, îïèðàÿñü íå
òîëüêî íà ÷óâñòâåííûé àïïàðàò, äàííûé ÷åëîâåêó, íî è èñ-
ïîëüçóÿ ìîùü âñåãî àíàëèòè÷åñêîãî àïïàðàòà óìà, êîòîðûé
ôîðìèðóåòñÿ ó ÷åëîâåêà, â ÷àñòíîñòè, â ïðîöåññå åãî îáó÷å-
íèÿ. Äîêàçàòåëüíàÿ áàçà «ãðåõîâíîñòè» òðàäèöèîííûõ ìå-
òîäèê èçó÷åíèÿ èíôîðìàöèîííûõ òåõíîëîãèé ïðåäåëüíî
ïðîñòà. Âîò îäíà èç âîçìîæíûõ ñõåì òàêîãî äîêàçàòåëüñòâà.
Åñòü, íàïðèìåð, òåîðèÿ ïîýòàïíîãî ðàçâèòèÿ óìñòâåí-
íûõ ñïîñîáíîñòåé øêîëüíèêà îäíîãî èç âåäóùèõ ïñèõîëî-
ãîâ è ïåäàãîãîâ XX ñòîëåòèÿ, Ïåòðà ßêîâëåâè÷à Ãàëüïåðè-
íà. Îïóñêàÿ ìíîãîå (÷òî åñòåñòâåííî äëÿ äàííîãî ìàòåðèà-
ëà), çàôèêñèðóåì «èòîãî», ò. å. ãëàâíîå. Íåïðåìåííûì
óñëîâèåì óìñòâåííîãî ðàçâèòèÿ øêîëüíèêà ÿâëÿåòñÿ îïðå-
äåëåííàÿ ïîçíàâàòåëüíàÿ äåÿòåëüíîñòü (âîîáùå ãîâîðÿ, ñëî-
âî «ïîçíàâàòåëüíàÿ» ìîæíî îïóñòèòü), âêëþ÷àþùàÿ â ñåáÿ
äåéñòâèÿ, êëàññèôèöèðóåìûå êàê èñïîëíèòåëüñêèå, îðèåí-
òèðîâî÷íûå è êîíòðîëüíûå. Íå áóäåì ðàñêðûâàòü èõ, èáî
ýòî òîëüêî îòÿãîòèò òåêñò, íî íå ïîÿñíèò ñóòü äîêàçàòåëü-
ñòâà. Óïðîùàÿ, ñêàæåì, ÷òî â ðàçâèòèè óìñòâåííûõ ñïîñîá-
íîñòåé êëþ÷åâóþ ðîëü èãðàåò ïðåîáëàäàíèå è ñèíòåç èìåí-
íî äåéñòâèé âòîðîãî è òðåòüåãî òèïîâ, è çàôèêñèðóåì ýòîò
ìîìåíò êàê íåêèé «îñåëîê» íàøåãî ïîíèìàíèÿ ïðîáëåìû.
Òàêèì îáðàçîì, âûñòðàèâàþòñÿ íåîáõîäèìûå óñëîâèÿ ðàç-
âèòèÿ. À çàòåì ìû «ðàñ÷ëåíÿåì» ìåòîäèêó èçó÷åíèÿ èí-
ôîðìàöèîííûõ òåõíîëîãèé øêîëüíûõ ó÷åáíèêîâ äî óðîâíÿ
êîíêðåòíûõ äåéñòâèé — òåõ, êîòîðûå äîëæåí âûïîëíèòü
øêîëüíèê, — è ñîïîñòàâëÿåì (óñòàíàâëèâàåì ñîîòâåòñòâèå)
èõ ñ äåéñòâèÿìè ïî Ï. ß. Ãàëüïåðèíó. Åñëè îêàçûâàåòñÿ,
÷òî áîëüøèíñòâî äåéñòâèé îòíîñèòñÿ ê ïåðâîìó òèïó, à íå
âòîðîìó è òðåòüåìó, êàê íåîáõîäèìî, òî äîêàçàòåëüñòâî çà-
âåðøåíî (íåîáõîäèìûå óñëîâèÿ íå âûïîëíåíû), à ìû ïîëó-
÷àåì îáó÷åíèå â ñîîòâåòñòâèè ñ «ïðèíöèïîì áàíàíà» (èç-
âåñòíûé îáðàç ïî âûðàáîòêå óñëîâíîãî ðåôëåêñà ó îáåçüÿíû
ïî äîñòàâàíèþ áàíàíà)...
 çàêëþ÷åíèå íåîáõîäèìî âñïîìíèòü îá îãðîìíîé îòâåò-
ñòâåííîñòè ñîâðåìåííîãî îáùåñòâà ïåðåä äåòüìè çà èõ áóäó-
Âìåñòî çàêëþ÷åíèÿ 233

ùåå. Ëþáîå äîñòèæåíèå öèâèëèçàöèè êðîìå ïîçèòèâíîé íå-


ñåò â ñåáå è íåãàòèâíóþ ñîñòàâëÿþùóþ. Êîìïüþòåð — ýòî õî-
ðîøî èëè ïëîõî äëÿ îáðàçîâàíèÿ, äëÿ ðàçâèòèÿ øêîëüíèêà?
Ñîâðåìåííûé øêîëüíèê íå çíàåò òàáëèöó óìíîæåíèÿ — çà-
÷åì, åñëè åñòü êàëüêóëÿòîð? Òàê â ÷åì æå çàêëþ÷àåòñÿ íåãà-
òèâíàÿ ñîñòàâëÿþùàÿ êîìïüþòåðà (à îíà îáÿçàòåëüíî åñòü)?
Ëþáîìó ïåäàãîãó, ñâÿçàííîìó ñ èíôîðìàòèêîé, ïðèõîäèëîñü
(è, âåðîÿòíî, íå îäèí ðàç) îòâå÷àòü íà âîïðîñ ðîäèòåëåé: «Ìû
êóïèëè ðåáåíêó êîìïüþòåð â íàäåæäå íà òî, ÷òî îí ïîâëèÿåò
íà åãî ðàçâèòèå, à ðåáåíîê äåíü è íî÷ü èãðàåò — ÷òî äåëàòü»?
Ïðèâåäåì ïî÷òè àáñóðäíûé ïðèìåð èç äðóãîé îáëàñòè, ÷òîáû
ïîÿñíèòü ýòó ìûñëü. Ïîòðåáíîñòü ÷åëîâåêà óáèâàòü ñåáå ïî-
äîáíûõ õîðîøî èçâåñòíà. ×åëîâåê ïðèäóìàë àòîìíóþ áîìáó,
÷òîáû ýôôåêòèâíî óáèâàòü. Ïðåäïîëîæèì, ÷òî îíà ñòàëà
ïðåäìåòîì îáùåãî ïîëüçîâàíèÿ. ×òî òîãäà ïðîèçîéäåò —
ïðåäñêàçàòü íåòðóäíî. À ÷òî óáüåò êîìïüþòåð? Êîìïüþ-
òåð — ïðè åãî áåçäóìíîì èñïîëüçîâàíèè — óáüåò â ÷åëîâåêå
òâîð÷åñêîå íà÷àëî è ñäåëàåò èç íåãî íå÷òî êàê íà÷èíàþùåå-
ñÿ, òàê è çàêàí÷èâàþùååñÿ ïðèìèòèâíûì ïîòðåáëåíèåì
êåì-òî ñîçäàííûõ óñëóã! È ïóñòü ýòî íåñêîëüêî ãèïåðòðîôè-
ðîâàííîå óòâåðæäåíèå, íî ýòî ëó÷øå, ÷åì î÷åðåäíàÿ ýéôî-
ðèÿ, ñâÿçàííàÿ ñ âñåîáùåé êîìïüþòåðèçàöèåé...
Ïðèëîæåíèÿ

Ïðèëîæåíèå 1
Íå õâàòàéòå ìåíÿ çà ïàëåö, à ñìîòðèòå,
êóäà ÿ óêàçûâàþ.
Ó. Ìàêêàëîê

Îá îðãàíèçàöèè
ýêñïåðèìåíòàëüíîãî èññëåäîâàíèÿ àëãîðèòìîâ
Ñòîèëî òîëüêî ïîïðîñèòü ìóæ÷èíó ïî-
ìî÷ü âûìûòü ïîñóäó — è òóò æå ïîÿâè-
ëàñü àâòîìàòè÷åñêàÿ ïîñóäîìîéêà.
Ñèðèë Íîðòêîò Ïàðêèíñîí

Îðãàíèçàöèÿ ðàáîòû ïî ýêñïåðèìåíòàëüíîìó èññëåäî-


âàíèþ àëãîðèòìîâ (ÝÈÀ) òðåáóåò â ìåòîäè÷åñêîì ïëàíå
(êðîìå ÷åòêî ôîðìóëèðóåìûõ ïðîáëåì) ðàçðàáîòêè íåêîåãî
èíñòðóìåíòàëüíîãî îáîðóäîâàíèÿ, íåêîé ïðîãðàììíîé ñðå-
äû (îáîçíà÷èì åå êàê ÑÝÈÀ). Îíà (ýòà ñðåäà) íå îòíîñèòñÿ ê
ðàçðÿäó ñëîæíîãî ïðîãðàììíîãî ïðîäóêòà, íî ñîçäàåò áàçó
äëÿ ñëåäóþùåãî ýòàïà òâîð÷åñêîé äåÿòåëüíîñòè (ãäå ïåðâûé
ýòàï — ýòî îñîçíàíèå è ïîíèìàíèå òîãî, êàê àâòîðû àëãî-
ðèòìà øëè ê ñâîåìó ðåçóëüòàòó).
×òîáû ïîíÿòü åå ôóíêöèîíàëüíûå âîçìîæíîñòè, ïðåä-
ñòàâèì ñåáå îáû÷íóþ (òðàäèöèîííóþ) ðàáîòó øêîëüíèêà
(ñòóäåíòà) ñ àëãîðèòìîì. Îíà ïðîñòà è âûðàæàåòñÿ îäíèì
ïðåäëîæåíèåì: ïîñëå îñîçíàíèÿ ñóòè àëãîðèòìà ïèøåòñÿ
ïðîãðàììíûé êîä è ïðîâåðÿåòñÿ íà íåñêîëüêèõ ñëó÷àéíî
ïîäîáðàííûõ òåñòàõ. Çàòåì, êîíå÷íî, ìîãóò ïðîâîäèòüñÿ íå-
Ïðèëîæåíèå 1 235

êèå ìîäèôèêàöèè èëè äîïîëíåíèÿ, íî ñõåìà ðàáîòû ïðè


ýòîì íå èçìåíÿåòñÿ.
Âçãëÿíåì íà ïîñòàâëåííóþ çàäà÷ó (ðàçðàáîòêó ÑÝÈÀ
êàê èíñòðóìåíòà òâîð÷åñêîé äåÿòåëüíîñòè) íåñêîëüêî ñ äðó-
ãîé ïîçèöèè. Åñëè îáðàòèòüñÿ ê àíãëîÿçû÷íîé ïåðèîäèêå
ïî ðàññìàòðèâàåìîé íàìè â ýòîé êíèãå ïðîáëåìå (ìåòîäàì
îáðàáîòêè ñòðîê), òî îêàæåòñÿ, ÷òî çíà÷èòåëüíàÿ ÷àñòü ñòà-
òåé (íå «ïèîíåðñêèõ») ïèøåòñÿ ïî ñëåäóþùåé ñõåìå. Áåðåò-
ñÿ àëãîðèì èëè íåñêîëüêî àëãîðèòìîâ îäíîãî òèïà. Â ëó÷-
øåì ñëó÷àå (íî íå âñåãäà) ïðîâîäèòñÿ åãî ìîäèôèêàöèÿ, à
çàòåì äàþòñÿ ðåçóëüòàòû ýêñïåðèìåíòàëüíîé îöåíêè.
Ýêñïåðèìåíò æå ñòðîèòñÿ îïÿòü òðàäèöèîííûì îáðàçîì: ñå-
ðèÿ òåñòîâ, íà êîòîðûõ îöåíèâàþòñÿ, íàïðèìåð, âðåìÿ ðà-
áîòû è èñïîëüçóåìàÿ ïàìÿòü àëãîðèòìà (èëè àëãîðèòìîâ).
Ïðè ïîääåðæêå òàêîãî âèäà äåÿòåëüíîñòè òðåáîâàíèÿ ê
ÑÝÈÀ ìèíèìàëüíû:
l íàëè÷èå áèáëèîòåêè òåñòîâ;
l íàëè÷èå áèáëèòåêè ìîäóëåé âûâîäà ðåçóëüòàòîâ â ðàç-
ëè÷íûõ ôîðìàòàõ;
l íàëè÷èå óïðàâëÿþùåé ïðîãðàììû ïî îáåñïå÷åíèþ
ïðîöåññà òåñòèðîâàíèÿ1).
Òàêàÿ ÑÝÈÀ äîæíà ñîçäàâàòüñÿ äëÿ êàæäîãî àëãîðèòìà,
à ñõåìà åå ðàáîòû íåçíà÷èòåëüíî îòëè÷àåòñÿ îò ïðîôåññèî-
íàëüíîé ïðîâåðêè (òåñòèðîâàíèÿ) îáû÷íîé çàäà÷è.
Îïèøåì êîðîòêî ôóíêöèîíàëüíûå âîçìîæíîñòè ÑÝÈÀ,
êîòîðóþ æåëàòåëüíî èìåòü ó÷èòåëþ äëÿ áîëåå ïðîäóêòèâ-
íîé ðàáîòû ñî øêîëüíèêàìè. Ýòî, êîíå÷íî æå, îäèí èç âàðè-
àíòîâ, — ó÷èòåëü â ïðîöåññå åå ñîçäàíèÿ (ñîâìåñòíî ñ ïðî-
ãðàììèñòîì) è â õîäå åå ýêñïëóàòàöèè, åñòåñòâåííî, âíåñåò
ñâîè êîððåêòèâû, îòðàæàþùèå åãî ñïåöèôèêó ðàáîòû.

1. Îáùèå òðåáîâàíèÿ:
l íàëè÷èå äâóõ âåðñèé: ñåòåâîé è ëîêàëüíîé;
l âîçìîæíîñòü óïðàâëåíèÿ äåÿòåëüíîñòüþ øêîëüíèêîâ
(ïîñòàíîâêà çàäà÷, îðãàíèçàöèÿ èíäèâèäóàëüíîé è
ãðóïïîâîé ðàáîòû, âåäåíèå ñòàòèñòè÷åñêèõ äàííûõ î
ðàáîòå øêîëüíèêà è ò. ä.);

1)
Îðãàíèçàöèÿ òàêîé ðàáîòû (ñ ïðèìåðîì óïðàâëÿþùåé ïðîãðàììû) ðàññìîò-
ðåíà â êíèãå: Îêóëîâ Ñ. Ì. Ïðîãðàììèðîâàíèå â àëãîðèòìàõ. — Ì.: ÁÈÍÎÌ.
Ëàáîðàòîðèÿ çíàíèé, 2002. Ñ. 325–328.
236 Ïðèëîæåíèÿ

l âîçìîæíîñòü ëîãè÷åñêîé îðãàíèçàöèè ïðîáëåì (çà-


äà÷) â ãðóïïû (äëÿ êîíêðåòíîãî øêîëüíèêà); ïðè ýòîì
îäíà çàäà÷à ìîæåò íàõîäèòüñÿ ñðàçó â íåñêîëüêèõ
ãðóïïàõ;
l âîçìîæíîñòü äîáàâëåíèÿ, óäàëåíèÿ è ðåäàêòèðîâàíèÿ
ãðóïï, çàäà÷, òåñòîâ, ìîäóëåé îöåíêè ðåçóëüòàòîâ;
öåíòðàëèçîâàííîå õðàíåíèå òåñòîâ è ðåçóëüòàòîâ òåñ-
òèðîâàíèÿ;
l âîçìîæíîñòü ôèêñèðîâàòü è ðåãóëèðîâàòü âðåìÿ ðàáî-
òû ïðîãðàììû, à òàêæå âûñòàâëÿòü ìàêñèìàëüíî äî-
ïóñòèìûé îáúåì ïàìÿòè, êîòîðûé ìîæåò èñïîëüçî-
âàòü çàäà÷à.
2. Òðåáîâàíèÿ ê èíòåðôåéñó:
l ïðîñòîé è ïîíÿòíûé èíòåðôåéñ;
l îäèíàêîâûé èíòåðôåéñ äëÿ îáåèõ âåðñèé ñèñòåìû —
ëîêàëüíîé è ñåòåâîé.
3. Òðåáîâàíèÿ ê ñåòåâîé âåðñèè:
l íàëè÷èå ñèñòåìû àóòåíòèôèêàöèè — çàïðîñà èìåíè
ïîëüçîâàòåëÿ è ïàðîëÿ;
l ïîääåðæêà äâóõ ðåæèìîâ:
– øêîëüíèê ìîæåò îòïðàâèòü ó÷èòåëþ íà ïðîâåðêó
ëþáóþ èç çàäà÷ è ïîëó÷èòü ðåçóëüòàò ïðîâåðêè â öå-
ëîì;
– øêîëüíèê ìîæåò èññëåäîâàòü ëþáóþ èç çàäà÷, ïîëó-
÷àòü äîñòóï ê áèáëèîòåêå òåñòîâ è ìîäóëÿì îáðàáîò-
êè ðåçóëüòàòîâ, ñîçäàâàòü ñîáñòâåííûå òåñòû è âñïî-
ìîãàòåëüíûå ïðîãðàììû.
4. Òðåáîâàíèÿ ê ëîêàëüíîé âåðñèè — îáåñïå÷èâàåòñÿ
âòîðîé ðåæèì ðàáîòû øêîëüíèêà (èç óêàçàííûõ âûøå äëÿ
ñåòåâîé âåðñèè).
5. Âîçìîæíîñòè ÑÝÈÀ, ïðåäîñòàâëÿåìûå ó÷èòåëþ
(êàê ìèíèìóì):
l óïðàâëåíèå ãðóïïàìè çàäà÷ è îòäåëüíûìè çàäà÷àìè
(äîáàâëåíèå, ðåäàêòèðîâàíèå, óäàëåíèå);
l óïðàâëåíèå áèáëèîòåêîé òåñòîâ è ìîäóëåé îöåíêè ðå-
çóëüòàòîâ (ñîçäàíèå, äîáàâëåíèå, ðåäàêòèðîâàíèå,
óäàëåíèå);
l óïðàâëåíèå ðàáîòîé øêîëüíèêîâ (ñòàòèñòè÷åñêèå
äàííûå, ñîçäàíèå ãðóïï çàäà÷ è ò. ä.).
Ïðèëîæåíèå 1 237

6. Îñíîâíûå êîìïîíåíòû ÑÝÈÀ (ñåòåâàÿ âåðñèÿ):


l ñåðâåðíàÿ ÷àñòü, îáåñïå÷èâàþùàÿ âñþ ôóíêöèîíàëü-
íîñòü ïî ðàáîòå ñî øêîëüíèêàìè;
l êëèåíòñêàÿ ÷àñòü, îáåñïå÷èâàþùàÿ ïåðåñûëêó ðåøå-
íèé øêîëüíèêîâ íà ñåðâåð è îòîáðàæåíèå (ôèêñàöèþ)
ðåçóëüòàòîâ ðàáîòû;
l óïðàâëÿþùàÿ ÷àñòü, îáåñïå÷èâàþùàÿ íàñòðîéêó ñèñ-
òåìû.
Ëîêàëüíàÿ âåðñèÿ — ýòî (â îñíîâíîì) òðåòèé êîìïîíåíò
ñåòåâîé âåðñèè.
7. Òðåáîâàíèÿ ê çàäà÷àì, äîáàâëÿåìûì â ÑÝÈÀ.
Ïðè äîáàâëåíèè íîâîé çàäà÷è â ñèñòåìó íåîáõîäèìî
ó÷èòûâàòü, ÷òî îíà ìîæåò êàê áûòü èññëåäîâàòåëüñêîé, òàê
è èñïîëüçîâàòüñÿ çàòåì äëÿ ïðîâåðêè çíàíèé øêîëüíèêà
ïóòåì åãî èíäèâèäóàëüíîãî òåñòèðîâàíèÿ èëè îðãàíèçàöèè,
íàïðèìåð, òóðíèðîâ òèïà îëèìïèàä. Â çàâèñèìîñòè îò ýòîãî
øêîëüíèêó ïðåäîñòàâëÿþòñÿ ðàçëè÷íûå ïðàâà ðàáîòû ñ ðå-
ñóðñàìè ñèñòåìû.  ëþáîì ñëó÷àå ðåçóëüòàòû ðåøåíèÿ çà-
äà÷è äîëæíû îôîðìëÿòüñÿ â âèäå âûõîäíîãî ôàéëà, ôîðìàò
êîòîðîãî çàðàíåå îãîâàðèâàåòñÿ. Ýòî ïîçâîëèò, â ÷àñòíîñòè,
ïðè íàëè÷èè ýòàëîííîãî ðåøåíèÿ ó÷èòåëÿ (èëè äðóãîãî
øêîëüíèêà) îñóùåñòâëÿòü ïðîñòîå ñðàâíåíèå ôàéëîâ. Ýòîò
ìîìåíò îñîáåííî âàæåí ïðè ðàáîòå ñ èñõîäíûìè äàííûìè
áîëüøîãî îáúåìà.
Âûøå «î÷åð÷åíû» ëèøü «êîíòóðû» ÑÝÈÀ ñ öåëüþ îáîñ-
íîâàíèÿ óòâåðæäåíèÿ î íåîáõîäèìîñòè èñïîëüçîâàíèÿ
îïðåäåëåííîãî ôîðìàëèçìà â äåÿòåëüíîñòè êàê ó÷èòåëÿ,
òàê è øêîëüíèêà. Òàê èëè èíà÷å, íî ïðè ïðîâåäåíèè ñåðüåç-
íîé èíäèâèäóàëüíîé ðàáîòû äàæå øêîëüíèê ñîçäàåò â ïðî-
öåññå íåå ðàçëè÷íîãî ðîäà âñïîìîãàòåëüíûå ïðîãðàììû, íà-
áîðû ôàéëîâ äëÿ àíàëèçà ðåøåíèÿ è ò. ï. Îïðåäåëåííàÿ
óíèôèêàöèÿ (ñèñòåìàòèçàöèÿ) ýòîãî àñïåêòà ðàáîòû ïîâû-
øàåò îáùóþ ïðîäóêòèâíîñòü, èáî îñâîáîæäàåò îò ìíîãèõ
òåõíè÷åñêèõ äåòàëåé êàê øêîëüíèêà, òàê è ó÷èòåëÿ. Íî
ýòî — äåéñòâèòåëüíî òîëüêî «êîíòóðû», ïîñêîëüêó â íèõ íå
îáîçíà÷åíû ìíîãèå äåòàëè (íàïðèìåð, íåîáõîäèìîñòü áèá-
ëèîòåêè äëÿ ðàáîòû ñî ñòðîêàìè áîëüøîé äëèíû è ïð.).
Ãëàâíîå — çàõîòåòü, ðåçóëüòàò ïðèäåò.
238 Ïðèëîæåíèÿ

Ïðèëîæåíèå 2
×åëîâåê íà÷èíàåò æèòü ëèøü òîãäà,
êîãäà åìó óäàåòñÿ ïðåâçîéòè ñàìîãî
ñåáÿ.
Àëüáåðò Ýéíøòåéí

Ïðîáëåìû è çàäà÷è
Ïîðîé çàäà÷à ñòîëü ñëîæíà, ÷òî âîçíè-
êàåò æåëàíèå ïîñìîòðåòü â ãëàçà åå àâ-
òîðó.
Ãåîðãèé Àëåêñàíäðîâ

Ñîçäàíèå ÑÝÈÀ (ñì. ïðèëîæåíèå 1) — ýòî êàê áû òåõíè-


÷åñêèé àñïåêò äåÿòåëüíîñòè. Íî ãëàâíîå âñå æå — ýòî ïðîá-
ëåìû è çàäà÷è (ñîäåðæàíèå), êîòîðûå íåîáõîäèìî ñòàâèòü
ïåðåä øêîëüíèêîì (ñòóäåíòîì), èáî èõ ðåøåíèå è èññëåäî-
âàíèå íå òîëüêî äàþò òî ñîñòîÿíèå èíòåëëåêòóàëüíîé ðàäîñ-
òè, êîòîðîå äåëàåò ÷åëîâåêà ÷åëîâåêîì, íî è ìîæåò ñòàòü
«îñüþ», «ñòåðæíåì» âûçðåâàíèÿ ïðîôåññèîíàëà â èíôîðìà-
òèêå. Ïðåòåíçèé íà íåêóþ ïîëíîòó ïðîáëåì è çàäà÷, ïðèâå-
äåííûõ â äàííîì ïðèëîæåíèè è îõâàòûâàþùèõ ðàññìàòðè-
âàåìóþ ïðîáëåìàòèêó, êîíå÷íî æå, íåò, — ðå÷ü èäåò òîëüêî
î ïðèìåðàõ1).
Ïðîáëåìà. Íèæå ïðèâåäåí ïðîãðàììíûé êîä Ð. Êîóëà,
ðåàëèçóþùèé ïðåäâàðèòåëüíóþ îáðàáîòêó îáðàçöà P äëÿ
ñèëüíîãî ïðàâèëà õîðîøåãî ñóôôèêñà2) (àëãîðèòì Ð. Áîéå-
ðà – Äæ. Ìóðà). Òðåáóåòñÿ èç ýòîãî êîäà èçâëå÷ü èäåþ è àë-
ãîðèòì îáðàáîòêè è îöåíèòü âðåìÿ åãî ðàáîòû, — íî íå òîëü-
êî! Íåîáõîäèìî èññëåäîâàòü âîçìîæíîñòü ïðèìåíåíèÿ âû-
ÿâëåííîãî ìåòîäà ïðåäâàðèòåëüíîé îáðàáîòêè äëÿ ñîçäàíèÿ
àëãîðèòìîâ ïîèñêà îáðàçöà â òåêñòå. Äðóãèìè ñëîâàìè, ñëå-
äóåò ïîïûòàòüñÿ ðàçðàáîòàòü ñâîé àëãîðèòì è îöåíèòü åãî
ýôôåêòèâíîñòü.

1)
Îáðàáîòêà çàäà÷íîãî ìàòåðèàëà ïî äàííîé (ðàâíî êàê è ðîäñòâåííîé) ïðîáëå-
ìàòèêå è åãî êëàññèôèêàöèÿ — ýòî ñîäåðæàíèå îòäåëüíîé ðàáîòû, êîòîðîé
åùå íåò â ó÷åáíîé ëèòåðàòóðå ïî èíôîðìàòèêå.
2)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ / Ïåð. ñ àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.:
Íåâñêèé Äèàëåêò; ÁÕ–Ïåòåðáóðã, 2003. Ñ. 56–57.
Ïðèëîæåíèå 2 239

Procedure GSshift(P:String; Var gs_shift:IndexArray;


m:Integer);
Var i,j,j_old,k:Integer;
kmp_shift:IndexArray;
{Òèï èñïîëüçóåìûõ ìàññèâîâ èìååò âèä:
IndexArray=Array[1..NMax] Of Integer;}
go_on:Boolean;
Begin
For j:=1 To m Do gs_shift[j]:=m;
kmp_shift[m]:=1;
j:=m;
For k:=m-1 DownTo 1 Do Begin
go_on:=True;
While (P[j]<>P[k]) And go_on Do Begin
If (gs_shift[j]>j-k) Then gs_shift[j]:=j-k;
If (j<m) Then j:=j+kmp_shift[j+1]
Else go_on:=False;
End;
If (p[k]=p[j]) Then Begin
kmp_shift[k]:=j-k;
j:=j-1;
End
Else kmp_shift[k]:=j-k+1;
End;
j:=j+1;
j_old:=1;
While (j<=m) Do Begin
For i:=j_old To j-1 Do
If (gs_shift[i]>j-1) Then gs_shift[i]:=j-1;
j_old:=j;
j:=j+kmp_shift[j];
End;
End;

Çàäà÷à. Äàíî k ñòðîê S1, S2, ..., Sk. Òðåáóåòñÿ ïîñòðîèòü


äëÿ íèõ îáîáùåííîå äåðåâî ñóôôèêñîâ1), ò. å. äåðåâî, â êîòî-
ðîì ïðåäñòàâëåíû ñóôôèêñû âñåõ ñòðîê.

1)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ : Ïåð. ñ àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.:
Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåðáóðã, 2003. Ñ. 151–152.
240 Ïðèëîæåíèÿ

Êîììåíòàðèé. Ïóñòü S1 = ababa$, S2 = baaba$ (ê ñòðîêàì äî-


áàâëåí êîíå÷íûé ñèìâîë «$»). Òîãäà ïîëó÷àåìîå îáîáùåííîå äåðå-
âî ñóôôèêñîâ ïðåäñòàâëåíî íà ðèñ. Ï2.1. Äëÿ ëèñòüåâ â êâàäðàò-
íûõ ñêîáêàõ ïðèâåäåíû ìåòêè, ñîñòîÿùèå èç äâóõ ÷èñåë: [íîìåð
ñëîâà, íîìåð ñóôôèêñà].

Ðèñ. Ï2.1. Îáîáùåííîå äåðåâî ñóôôèêñîâ (áåç ñóôôèêñíûõ ñâÿçåé)


äëÿ ñòðîê S1 = ababa è S2 = baaba
Ëîãèêà ïîñòðîåíèÿ. Ñòðîèòñÿ äåðåâî äëÿ S1 (íàïðèìåð, ñ ïî-
ìîùüþ àëãîðèòìà Ý. Óêêîíåíà), à çàòåì äåðåâî äîñòðàèâàåòñÿ äëÿ
S2 îáû÷íûìè äåéñòâèÿìè àëãîðèòìà Ý. Óêêîíåíà (ñ èñïîëüçîâàíè-
åì ñóôôèêñíûõ ñâÿçåé è ñêà÷êîâ ïî ñ÷åò÷èêó).  îáùåì ñëó÷àå
ïðîöåññ ïðîäîëæàåòñÿ äî òåõ ïîð, ïîêà íå áóäóò îáðàáîòàíû âñå
ñòðîêè. Çäåñü òðåáóþò óòî÷íåíèÿ ëèøü äâà ìîìåíòà. Âî-ïåðâûõ,
ëèñò äåðåâà ìîæåò îòíîñèòüñÿ ê ñóôôèêñàì ðàçëè÷íûõ ñòðîê, ïîý-
òîìó äëÿ êàæäîãî ëèñòà ñëåäóåò õðàíèòü ñïèñîê ñòðîê è íîìåðîâ
ñóôôèêñîâ. Âî-âòîðûõ, ìåòêè äóã, â âèäå èíäåêñîâ íà÷àëüíîãî è
êîíå÷íîãî ñèìâîëîâ â ñòðîêå, ïðåòåðïåâàþò èçìåíåíèå. Íåîáõîäè-
ìî ñâÿçûâàòü ýòè äàííûå ñ íîìåðîì ñòðîêè.

Îáîáùåííîå äåðåâî ñóôôèêñîâ äëÿ çàäàííîãî ìíîæåñòâà ñòðîê


ñ ñóììàðíîé äëèíîé n ìîæåò áûòü èíñòðóìåíòîì äëÿ ðåøåíèÿ çà-
äà÷ ïîèñêà. Ïðåäïîëîæèì, ÷òî äåðåâî ïîñòðîåíî, è íåîáõîäèìî îò-
âåòèòü íà âîïðîñ, åñòü ëè ñòðîêà S â çàäàííîì ìíîæåñòâå ñòðîê.
Òîãäà ìû îáû÷íûì îáðàçîì «èäåì» ïî äåðåâó ñî ñòðîêîé S. Åñëè
ïðîñìîòð çàêîí÷åí â ëèñòå äåðåâà è ñòðîêà S èñ÷åðïàíà, òî îòâåò
ïîëîæèòåëüíûé. À åñëè íåò? Åñëè ïîèñê çàâåðøåí âî âíóòðåííåé
âåðøèíå äåðåâà èëè íà äóãå?  ýòîì ñëó÷àå ïðîñìîòð «íèæíåé»,
îñòàâøåéñÿ ÷àñòè äåðåâà äàåò ñòðîêè, â êîòîðûå S âõîäèò â êà÷åñ-
òâå ïîäñòðîêè. Îñòàëñÿ ëîãè÷åñêè ïîñëåäíèé âîçìîæíûé ñëó-
÷àé — íàéäåíî íåñîâïàäåíèå. Íî è èç ýòîé ñèòóàöèè èçâëåêàåòñÿ
èíôîðìàöèÿ, èáî ìîæíî óêàçàòü ñàìûé äëèííûé ïðåôèêñ S, êîòî-
ðûé åñòü ñðåäè çàäàííîãî ìíîæåñòâà ñòðîê â êà÷åñòâå ïîäñòðîêè.
Ïðèëîæåíèå 2 241

Çàäà÷à. Òðåáóåòñÿ íàéòè íàèáîëüøóþ îáùóþ ïîäñòðîêó


äâóõ ñòðîê íà îñíîâå äàííûõ, ïðåäñòàâëåííûõ â èõ îáîá-
ùåííîì äåðåâå ñóôôèêñîâ.
Êîììåíòàðèé. Âíóòðåííèå âåðøèíû v îáîáùåííîãî äåðåâà
äîëæíû èìåòü ìåòêè. Åñëè â ïîääåðåâå ñ êîðíåì â âåðøèíå v åñòü
ëèñò, îòíîñÿùèéñÿ ê ïåðâîé ñòðîêå, òî çíà÷åíèå ìåòêè ðàâíî 1,
åñëè êî âòîðîé — 2, è íàêîíåö, åñëè îí îòíîñèòñÿ è ê ïåðâîé, è êî
âòîðîé ñòðîêàì, òî ìåòêè 1 è 2. Ïîñëå ýòîãî îñòàåòñÿ íàéòè íàèáî-
ëåå óäàëåííóþ îò êîðíÿ äåðåâà âåðøèíó ñî çíà÷åíèåì ìåòêè ïî-
ñëåäíåãî òèïà.

Çàäà÷à. Äàíî k ñòðîê. Äëÿ êàæäîãî i îò 2 äî k òðåáóåòñÿ


íàéòè äëèíó ñàìîé äëèííîé ïîäñòðîêè, îáùåé íå ìåíåå ÷åì
äëÿ i ñòðîê. Ñëîæíîñòü àëãîðèòìà äîëæíà èìåòü ïîðÿäîê
O(k · n)1).
Êîììåíòàðèé. Íà ðèñ. Ï2.2 ïîêàçàíî îáîáùåííîå äåðåâî ñóô-
ôèêñîâ äëÿ ñòðîê S1 = cabca$, S2 = bcabca@ è S3 = aabc*, ãäå ê
êàæäîé ñòðîêå ïðèïèñàí íåêîòîðûé êîíå÷íûé ñèìâîë (îòñóòñòâó-
þùèé â àëôàâèòå). Ëèñòüÿ (îíè èçîáðàæåíû êâàäðàòèêàìè) èìå-
þò ìåòêè â âèäå íîìåðà ñòðîêè.

Ðèñ. Ï2.2. Îáîáùåííîå äåðåâî ñóôôèêñîâ äëÿ ñòðîê S1 = cabca$,


S2 = bcabca@, S3 = aabc*. Êâàäðàòàìè îáîçíà÷åíû ëèñòüÿ ñ ìåò-
êàìè, ðàâíûìè íîìåðó ñòðîêè. Êðóæêàìè — âíóòðåííèå âåðøè-
íû ñ íîìåðàìè, ñîîòâåòñòâóþùèìè î÷åðåäíîñòè èõ ñîçäàíèÿ ïðè
ïîñòðîåíèè äåðåâà
1)
Ïî èíôîðìàöèè èç êíèãè Ä. Ãàñôèëä (ñ. 165), ýòà çàäà÷à ìîæåò áûòü ðåøåíà
çà âðåìÿ O(n). Ïðè ýòîì äàåòñÿ ññûëêà íà ñëåäóþùèé èñòî÷íèê: Hui L. Color
set size problem with applications to string matching // Proc. 3rd Symp. on
Combinatorial Pattern Matching Lecture Notes in Computer Science. Springer.
1992. Vol. 664. P. 227–240.
242 Ïðèëîæåíèÿ

Äëÿ êàæäîé âíóòðåííåé âåðøèíû v (èõ íîìåðà çàäàíû â òîé


î÷åðåäíîñòè, â êîòîðîé îíè îáðàçóþòñÿ ïðè ñîçäàíèè äåðåâà) ïîä-
ñ÷èòûâàåòñÿ çíà÷åíèå cnt[v] — êîëè÷åñòâî ðàçëè÷íûõ ìåòîê íà
ëèñòüÿõ ïîääåðåâà ñ êîðíåì v. Äëÿ ðàññìàòðèâàåìîãî ïðèìåðà
cnt = (3, 2, 3, 2, 2, 2, 3, 3, 3). Ïðåäïîëîæèì, ÷òî äëÿ êàæäîé âíóò-
ðåííåé âåðøèíû îïðåäåëåíà ñòðîêîâàÿ ãëóáèíà (êîëè÷åñòâî ñèì-
âîëîâ â ïîäñòðîêå, ïîëó÷àþùåéñÿ ñêëåéêîé ìåòîê äóã íà ïóòè îò
êîðíÿ äî âåðøèíû). Âûïèøåì äëÿ íàãëÿäíîñòè ñòðîêîâûå ãëóáè-
íû âåðøèí â íàøåì ïðèìåðå: vg = (0, 2, 1, 3, 5, 4, 3, 2, 1). Îñòàëîñü
äëÿ êàæäîãî i îò 2 äî k íàéòè òàêîé ìàêñèìàëüíûé ýëåìåíò â vg,
÷òî cnt[v] = i. Íàïðèìåð, ïðè i = 2 ìàêñèìàëüíûé ýëåìåíò ðàâåí 5
è ñîîòâåòñòâóåò âåðøèíå 5. Îáùàÿ ïîäñòðîêà äëÿ äâóõ ñòðîê (ýëå-
ìåíòû cnt è vg âûäåëåíû ïîëóæèðíûì øðèôòîì) ñ ìàêñèìàëüíîé
äëèíîé åñòü cabca, à äëÿ òðåõ ñòðîê — abc. Îñòàëîñü îòìåòèòü, ÷òî
ðåàëüíî äëÿ ðåøåíèÿ ýòîé çàäà÷è ìàññèâ vg íå òðåáóåòñÿ, à íåîáõî-
äèì ìàññèâ äëÿ õðàíåíèÿ ìàêñèìàëüíûõ ýëåìåíòîâ, ýëåìåíòû êî-
òîðîãî ôîðìèðóþòñÿ ïðè îáû÷íîì îáõîäå äåðåâà.

Ïðîáëåìà. Èññëåäîâàíèå òåêñòà íà íàëè÷èå êðàòíûõ


ïîäñòðîê. Èñïîëüçóþòñÿ àëãîðèòìû Ì. Êðî÷åìîðà, Ì. Ìåé-
íà – Ð. Ëîðåíöà è, âîçìîæíî, ðÿä äðóãèõ. Ýêñïåðèìåíòàëü-
íî îöåíèâàåòñÿ âðåìÿ èõ ðàáîòû.
Êîììåíòàðèé. Ñðåäè èñïîëüçóåìûõ òåñòîâ äîëæíû èìåòüñÿ
ñòðîêè Ôèáîíà÷÷è ðàçíîé äëèíû, èáî èçâåñòíî, ÷òî ïîñëåäíèå
èìåþò çíà÷èòåëüíîå êîëè÷åñòâî êðàòíûõ ïîäñòðîê.  ýòîì ñëó÷àå
íåîáõîäèìà ðàçðàáîòêà ãåíåðàòîðà ñòðîê Ôèáîíà÷÷è, êîòîðûé
ïî çàäàííîìó çíà÷åíèþ n ôîðìèðóåò ñòðîêó fn è çàïèñûâàåò åå â
áèáëèîòåêó òåñòîâ.
Ñòðîêè Ôèáîíà÷÷è ñòðîÿòñÿ íà áèíàðíîì àëôàâèòå A = {a, b} è
óäîâëåòâîðÿþò ðåêóððåíòíîìó ñîîòíîøåíèþ:

f0 = b, f1 = a, fn = fn–1fn–2 (n … 2).
Ïåðâûå ñòðîêè Ôèáîíà÷÷è è èõ äëèíû (l):
f0 = b, l = 1;
f1 = a, l = 1;
f2 = ab, l = 2;
f3 = aba, l = 3;
f4 = abaab, l = 5;
f5 = abaababa, l = 8;
f6 = abaababaabaab, l = 13;
f7 = abaababaabaababaababa, l = 21;
f8 = abaababaabaababaababaabaababaabaab, l = 34;

Íåòðóäíî çàìåòèòü, ÷òî äëèíû ñòðîê fn óäîâëåòâîðÿþò êëàññè-
÷åñêîìó ñîîòíîøåíèþ: fn = fn–1 + fn–2 (n … 2).
Ïðèëîæåíèå 2 243

Çàäà÷à. Ïî çàäàííîìó îáðàçöó P òðåáóåòñÿ íàéòè âñå åãî


âõîæäåíèÿ â òåêñò T. Îáðàçåö P íà îïðåäåëåííûõ ìåñòàõ ñî-
äåðæèò ñïåöèàëüíûé ñèìâîë (íàïðèìåð, @), êîòîðûé ìîæåò
îçíà÷àòü ëþáîé ñèìâîë òåêñòà T. Âðåìåííàÿ ñëîæíîñòü àë-
ãîðèòìà — O(k · m), ãäå m = |P|, à k — êîëè÷åñòâî ïîäñòðîê
P áåç ñèìâîëà @.
Êîììåíòàðèé. Îáðàçåö P = bc@a@@abc@ âõîäèò â
T = abcdadaabcbcaaadabcd äâà ðàçà — ñî âòîðîé è îäèííàäöàòîé
ïîçèöèé. Ðàçîáúåì P íà P1 = ab, P2 = a, P3 = abc, k = 3. Ïåðâûé
îáðàçåö P1 âõîäèò â P ñ ïîçèöèè l1=1; âòîðîé — l2 = 4; òðåòèé —
l3 = 7. Èñïîëüçóÿ, íàïðèìåð, àëãîðèòì À. Àõî – Ì. Êîðàñèê (ñì.
ï. 3.5), èùåì âõîæäåíèÿ P1, P2, P3 â òåêñò. Ðåçóëüòàò ïîèñêà ôèê-
ñèðóåòñÿ â íåêîòîðîì ìàññèâå cnt[1..n] ñëåäóþùèì îáðàçîì. Åñëè
íàéäåíî âõîæäåíèå îáðàçöà Pi â T ñ ïîçèöèè j, òî ê ýëåìåíòó ìàñ-
ñèâà cnt[j – li + 1] ïðèáàâëÿåòñÿ åäèíèöà. Òàê, äëÿ ðàññìàòðèâàå-
ìîãî òåêñòà T ìàññèâ cnt = (0, 3, 0, 1, 1, 0, 0, 0, 1, 1, 3, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0). Îñòàåòñÿ íàéòè ýëåìåíòû cnt, ðàâíûå 3.

Çàäà÷à. Ïóñòü íåêîå èçîáðàæåíèå îïèñûâàåòñÿ â âèäå


ìàòðèöû T, ýëåìåíòàìè êîòîðîé ÿâëÿþòñÿ ïîëîæèòåëüíûå
öåëûå ÷èñëà, îïðåäåëÿþùèå, íàïðèìåð, öâåò è ÿðêîñòü
òî÷åê. ×àñòü èçîáðàæåíèÿ îïèñûâàåòñÿ ìàòðèöåé P ìåíü-
øåé ðàçìåðíîñòè. Òðåáóåòñÿ íàéòè âñå âõîæäåíèÿ P â T.
æ2 5 1 1 4ö
ç ÷
ç3 1 4 2 1÷
æ 1 4ö
Êîììåíòàðèé. Ïóñòü T = ç 4 5 1 9 6 ÷, à P = çç ÷÷.
ç ÷ è5 1ø
ç5 4 1 4 7÷
ç5 1 5 1 2 ÷ø
è
Ïðåîáðàçóåì T â T¢ = 25114$31421$45196$54147$51512$, à P
â P1 = 14 è P2 = 51 (â îáùåì ñëó÷àå — k îáðàçöîâ). Ðåçóëüòàòû ïî-
èñêà P1 è P2 â T¢ ôèêñèðóþòñÿ â ìàòðèöå cnt. Åñëè Pi âõîäèò â T¢ ñ
ïîçèöèè j, òî ïðåîáðàçîâàíèå j â ïàðó (p, q), îïðåäåëÿþùóþ íîìåð
ñòðîêè è íîìåð ñòîëáöà cnt, î÷åâèäíî: ýëåìåíòó cnt[p,q] ïðèñâàè-
âàåòñÿ çíà÷åíèå i. Òàê, â íàøåì ñëó÷àå
æ0 2 0 1 0ö
ç ÷
ç0 1 0 0 0÷
cnt = ç 0 2 0 0 0 ÷ .
ç ÷
ç0 0 1 0 0÷
ç2 0 2 0 0÷
è ø
Îñòàåòñÿ â ñòîëáöàõ cnt íàéòè ÷èñëà 1, 2, ..., k (èìåííî â òàêîé
î÷åðåäíîñòè!), çàïèñàííûå â ïîñëåäîâàòåëüíûõ ÿ÷åéêàõ îäíîãî
ñòîëáöà.
244 Ïðèëîæåíèÿ

Ïðîáëåìà. Òåêñò T íàçîâåì èñêëþ÷àåìûì îáðàçöîì P,


åñëè îòñóòñòâóåò âõîæäåíèå P â T. Íàïðèìåð, â ñòðîêàõ Ôè-
áîíà÷÷è îòñóòñòâóþò ïîäñòðîêè P = bb, ò. å. êðàòíàÿ ïîä-
ñòðîêà bb ïîðÿäêà 2.
Ïóñòü àëôàâèò A ñîñòîèò èç n ñèìâîëîâ. Òðåáóåòñÿ èñ-
ñëåäîâàòü âîçìîæíîñòü «ïîñòðîåíèÿ ñòðîê (âîçìîæíî — è
áåñêîíå÷íûõ) íà àëôàâèòå èç n ñèìâîëîâ, ñâîáîäíûõ îò
êðàòíûõ ïîäñòðîê ïîðÿäêà r, íî ñîäåðæàùèõ ïîäñòðîêè ïî-
ðÿäêîâ 2, 3, …, r – 1»1). Îáîçíà÷åíèå ïðîáëåìû — (n, r)-èñ-
êëþ÷åíèå.
Êîììåíòàðèé. Ðåøåíèå ýòîé ïðîáëåìû êàê ìèíèìóì ñëåäóåò
íà÷àòü ñ àíàëèçà ñòðîê À. Òóå (Axel Thue)2). Ñëåäóåò íàïèñàòü ãåíå-
ðàòîðû ñòðîê, ÿâëÿþùèõñÿ (2, 3)–èñêëþ÷åíèÿìè è (3, 2)–èñêëþ-
÷åíèÿìè. Ñòðîêè À. Òóå, ÿâëÿþùèåñÿ (2, 3)-èñêëþ÷åíèÿìè, íà àë-
ôàâèòå A = {a, b} çàäàþòñÿ îòîáðàæåíèåì:
a ® ab;
b ® ba.
Ïåðâûå ñòðîêè À. Òóå è èõ äëèíû (l):
t0 = a, l = 1;
t1 = ab, l = 2;
t2 = abba, l = 4;
t3 = abbabaab, l = 8;
t4 = abbabaabbaababba, l = 16;
t5 = abbabaabbaababbabaababbaabbabaab, l = 32;
...
Åñëè îáîçíà÷èòü a = b, b = a, òî äëÿ ëþáîãî n … 1: tn = tn -1tn -1.
Ñòðîêè À. Òóå, ÿâëÿþùèåñÿ (3, 2)-èñêëþ÷åíèÿìè, íà àëôàâèòå
A = {a, b, c} çàäàþòñÿ îòîáðàæåíèåì:
a ® abcab;
b ® acabcb;
c ® acbcacb.
Ïåðâûå ñòðîêè À. Òóå3):
h0 = a;
h1 = abcab;
h2 = abcab acabcb acbcacb abcab acabcb;
h3 = abcab acabcb acbcacb abcab acabcb abcab
acbcacb abcab acabcb acbcacb acabcb abcab acbcacb
acabcb acbcacb abcab acbcacb acabcb abcab acabcb
1)
Ñìèò Á. Ìåòîäû è àëãîðèòìû âû÷èñëåíèÿ íà ñòðîêàõ. — Ì.: ÎÎÎ
«È. Ä. Âèëüÿìñ», 2006. Ñ. 86.
2)
Òàì æå.
3)
Çíàê ïðîáåëà â çàïèñè h2 è h3 èñïîëüçóåòñÿ òîëüêî äëÿ óäîáñòâà ÷òåíèÿ.
Ïðèëîæåíèå 2 245

acbcacb abcab acabcb abcab acbcacb abcab acabcb


acbcacb acabcb;
...

Çàäà÷à. Èçâåñòíî, ÷òî äåðåâüÿ ñóôôèêñîâ ÿâëÿþòñÿ äî-


ñòàòî÷íî çàòðàòíîé ïî èñïîëüçóåìîé ïàìÿòè ñòðóêòóðîé
äàííûõ. Òðåáóåòñÿ ïðåîáðàçîâàòü äåðåâî ñóôôèêñîâ â îðè-
åíòèðîâàííûé àöèêëè÷åñêèé ãðàô.
Êîììåíòàðèé. Íà ðèñ. Ï2.3 ïðåäñòàâëåíî äåðåâî ñóôôèêñîâ
äëÿ ñòðîêè S = abacabbac$. Ñóôôèêñíûå ñâÿçè èçîáðàæåíû
ïóíêòèðíûìè ëèíèÿìè.

Ðèñ. Ï2.3. Äåðåâî ñóôôèêñîâ äëÿ ñòðîêè S = abacabbac$


Íà ðèñ. Ï2.4 ïîêàçàí îðèåíòèðîâàííûé àöèêëè÷åñêèé
ãðàô, ïîñòðîåííûé ïî ýòîìó äåðåâó ñóôôèêñîâ. Íîìåðà ìåòîê
ó âåðøèí-ëèñòüåâ ñîõðàíåíû, à â êâàäðàòíûõ ñêîáêàõ óêàçà-
íû ìåòêè ëèñòüåâ äåðåâà ñóôôèêñîâ, «ñòÿíóòûõ» â ýòó âåðøè-
íó. ×àñòü äóã, ïî÷òè ñîîòâåòñòâóþùèõ ñóôôèêñíûì ñâÿçÿì,
èìåþò ïóñòûå ìåòêè.

Ðèñ. Ï2.4. Îðèåíòèðîâàííûé àöèêëè÷åñêèé ãðàô äëÿ ðàñïîçíàâà-


íèÿ ïîäñòðîê S = abacabbac
246 Ïðèëîæåíèÿ

Êàæäîìó ñóôôèêñó S ñîîòâåòñòâóåò ïóòü èç êîðíÿ â ëèñò â îðè-


åíòèðîâàííîì àöèêëè÷åñêîì ãðàôå, è íàîáîðîò, ëþáîé ñóôôèêñ S
ïðåäñòàâëåí êàêèì-ëèáî èç òàêèõ ïóòåé.
Àëãîðèòì ïîäîáíîãî ïðåîáðàçîâàíèÿ ìîæåò áûòü îïèñàí òàê:
l Øàã 1. Ïîñòðîèòü äåðåâî ñóôôèêñîâ è âûïèñàòü âñå ïàðû âåð-
øèí (p, q), ìåæäó êîòîðîìè ñóùåñòâóåò ñóôôèêñíàÿ ñâÿçü,
åñëè êîëè÷åñòâî âåðøèí-ëèñòüåâ â ïîääåðåâüÿõ, îïðåäåëÿ-
ìûõ âåðøèíàìè p è q, ñîâïàäàåò.
l Øàã 2. Ïîêà ñóùåñòâóþò ïàðû (p, q) è îáå âåðøèíû ïðèíàä-
ëåæàò òåêóùåìó àöèêëè÷åñêîìó ãðàôó, îáúåäèíèòü âåðøè-
íû p è q.
Ìåæäó ðåçóëüòàòîì ðàáîòû òàêîãî àëãîðèòìà è ïðèìåðîì íà
ðèñ. Ï2.4 åñòü íåáîëüøîå íåñîîòâåòñòâèå, íî îíî óñòðàíèìî ïðè
ðàáîòå íàä çàäà÷åé.

Çàäà÷à. Ñðåäè âñåõ ñòðîê, ïîëó÷àþùèõñÿ öèêëè÷åñêèì


ñäâèãîì ñòðîêè S (n = |S|), òðåáóåòñÿ íàéòè ëåêñèêîãðàôè-
÷åñêè íàèìåíüøóþ.
Êîììåíòàðèé. Åñòåñòâåííî, ÷òî ñòðîêà S ïîñòðîåíà íà êîíå÷-
íîì è óïîðÿäî÷åííîì àëôàâèòå A. Ïóñòü S = bacda (n = 5). Åå
öèêëè÷åñêèå ñäâèãè: bacda, acdab, cdaba, dabac, abacd. Íàè-
ìåíüøåé â ëåêñèêîãðàôè÷åñêîì ïîðÿäêå ÿâëÿåòñÿ ñòðîêà abacd.
Âîçüìåì ñòðîêó SS$ = bacdabacda$ (ñèìâîë $ ñ÷èòàåòñÿ ëåê-
ñèêîãðàôè÷åñêè íàèáîëüøèì) è ïîñòðîèì ïî íåé äåðåâî ñóôôèê-
ñîâ (ðèñ. Ï2.5). Äàëåå èäåì ïî äåðåâó, âûáèðàÿ â êàæäîé âåðøèíå
ëåêñèêîãðàôè÷åñêè íàèìåíüøóþ ìåòêó äóãè. Îáõîä çàêàí÷èâàåò-
ñÿ, åñëè áóäåò äîñòèãíóòà ñòðîêîâàÿ ãëóáèíà n (íà ðèñ. Ï2.5 ýòî
ìåñòî âûäåëåíî ïîä÷åðêèâàíèåì). Ñêëåéêà ìåòîê äóã ïðîéäåííîãî
ïóòè äàåò èñêîìóþ ñòðîêó.

Ðèñ. Ï2.5. Äåðåâî ñóôôèêñîâ äëÿ ñòðîêè bacdabacda$


Ïðèëîæåíèå 2 247

Çàäà÷à. Äëÿ ëþáîé ïîçèöèè i ñòðîêè S òðåáóåòñÿ íàéòè â


ïîäñòðîêå ñòðîêè S[1..i – 1] íà÷àëî êðàéíåãî ëåâîãî âõîæ-
äåíèÿ (ri) è äëèíó (li) ñàìîãî äëèííîãî ïðåôèêñà S[i..n].
Êîììåíòàðèé 1. Äëÿ ñòðîêè S = abcabdabcabdabc$ íà
ðèñ. Ï2.6 ïðåäñòàâëåíî äåðåâî ñóôôèêñîâ. Â ðåçóëüòàòå îáõîäà äå-
ðåâà, — à îí îñóùåñòâëÿåòñÿ çà âðåìÿ O(n), — êàæäîé âíóòðåííåé
âåðøèíå v ïðèñâàèâàåòñÿ ìåòêà, ðàâíàÿ íàèìåíüøåìó íîìåðó
ëèñòà â ïîääåðåâå ñ êîðíåì â v. Ýòè ìåòêè íà ðèñ. Ï2.6 ïðèâåäåíû â
êâàäðàòíûõ ñêîáêàõ.

Ðèñ. Ï2.6. Äåðåâî ñóôôèêñîâ äëÿ ñòðîêè S = abcabdabcabdabc$


(áåç ñóôôèêñíûõ ñâÿçåé)
Ïóñòü i ðàâíî 8, ò. å. òðåáóåòñÿ íàéòè ïðåôèêñ ñòðîêè
bcabdabc, âñòðå÷àþùèéñÿ â abcabda. Èäåì ïî äåðåâó ñóôôèêñîâ.
Èç êîðíÿ âûáðàíà äóãà ñ ìåòêîé b, çàòåì — c, à ïîòîì — äóãà ñ ìåò-
êîé abdabc (ðèñ. Ï2.6). Íî ìû äîëæíû äîñòè÷ü òîëüêî ñòðîêîâîé
ãëóáèíû 6 (8–2, ãäå 2 — ìåòêà ïåðâîé âíóòðåííåé âåðøèíû ïóòè)
èëè ìåíüøåé. Ïðîñìîòð çàêàí÷èâàåòñÿ íå âî âíóòðåííåé âåðøè-
íå, à íà äóãå. Áåðåì ìåòêó ñëåäóþùåé âíóòðåííåé âåðøèíû — îíà
ðàâíà 2, è ýòî åñòü íà÷àëî ïðåôèêñà (ri), à äëèíà — äîñòèãíóòàÿ
ñòðîêîâàÿ ãëóáèíà (li). Äëÿ ðàññìàòðèâàåìîãî ïðèìåðà çíà÷åíèÿ ri
è li ïðåäñòàâëåíû â òàáë. Ï2.1.

Òàáëèöà Ï2.1

i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
S a b c a b d a b c a b d a b c
li 0 0 0 2 1 0 6 6 6 6 5 4 3 2 1
ri 0 0 0 1 2 0 1 2 3 4 5 6 1 2 3
248 Ïðèëîæåíèÿ

Êîììåíòàðèé 2. Äàííûé àëãîðèòì ÿâëÿåòñÿ îñíîâîé ìåòîäà


ñæàòèÿ äàííûõ Ä. Çèâà – À. Ëåìïåëÿ1). Íàïðèìåð, ðàññìîòðåííóþ
ñòðîêó â ñæàòîì âèäå ìîæíî ïðåäñòàâèòü êàê abc(1, 2)d(1, 6)(1, 3).
Ïåðâîå ÷èñëî â êðóãëûõ ñêîáêàõ åñòü ri, à âòîðîå — li.

Ïðîáëåìà. Â ï. 3.5. ïðèâîäèòñÿ àëãîðèòì À. Àõî –


Ì. Êîðàñèê îäíîâðåìåííîãî ïîèñêà íåñêîëüêèõ îáðàçöîâ â
òåêñòå. Åãî èäåéíîé îñíîâîé ÿâëÿåòñÿ àëãîðèòì Ä. Êíó-
òà – Äæ. Ìîððèñà – Â. Ïðàòòà. Ðàçðàáîòêà ìåòîäà ïîèñêà
íåñêîëüêèõ îáðàçöîâ â òåêñòå íà îñíîâå ñèíòåçà èäåé àëãî-
ðèòìîâ Ð. Áîéåðà – Äæ. Ìóðà è À. Àõî – Ì. Êîðàñèê — ðå-
øàåìàÿ, íî íå òðèâèàëüíàÿ ïðîáëåìà.
Êîììåíòàðèé. Äàííàÿ ïðîáëåìà ðåøåíà Á. Êîììåíö-Óîëòåð2),
íî îò ñàìîñòîÿòåëüíîãî ïîèñêà ïîëó÷åíèå èíòåëëåêòóàëüíîãî
óäîâëåòâîðåíèÿ ãàðàíòèðîâàíî. Êðîìå òîãî, âàøà ðàáîòà ìîæåò
çàâåðøèòüñÿ ñîçäàíèåì áîëåå ïðîñòîãî ìåòîäà.

Çàäà÷à. Äàíî ïîëíîå äâîè÷íîå äåðåâî (êàæäàÿ âåðøèíà


äåðåâà èìååò äâóõ ñûíîâåé). Äëÿ êàæäîé ïàðû âåðøèí x è y
òðåáóåòñÿ íàéòè âåðøèíó z, ÿâëÿþùóþñÿ èõ íàèìåíüøèì
îáùèì ïðåäøåñòâåííèêîì.
Êîììåíòàðèé. Íà ðèñ. Ï2.7 ïîêàçàíî ïîëíîå äâîè÷íîå äåðåâî
èç 15 âåðøèí. Íîìåðà âåðøèí (ðÿäîì ñ èõ äåñÿòè÷íûì ïðåäñòàâ-
ëåíèåì ïðèâîäèòñÿ è äâîè÷íàÿ çàïèñü) óêàçàíû â ïîðÿäêå îáõîäà
äåðåâà â ãëóáèíó èëè ñèììåòðè÷íîãî îáõîäà — êîðåíü íóìåðóåòñÿ
ïîñëå ïðèñâîåíèÿ íîìåðîâ âåðøèíàì ëåâîãî ïîääåðåâà, íî ïåðåä
íóìåðàöèåé âåðøèí ïðàâîãî ïîääåðåâà3).
Äàííîé íóìåðàöèè âåðøèí ìîæíî äàòü è äðóãóþ èíòåðïðåòà-
öèþ. Äëÿ äåðåâà ñ p ëèñòüÿìè çàïèñü íîìåðà âåðøèíû òðåáóåò
d + 1 áèòîâ, ãäå d = log2p.

1)
Ziv J., Lempel A. A universal algorithm for sequential data compression // IEEE
Trans. on Info. Theory. 1977.Vol. 23. P. 337–343; Ziv J., Lempel A. Compression
of individual sequences via variable length coding // IEEE Trans. on Info.
Theory. 1978. Vol. 24. P. 530–536; Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâà-
òåëüíîñòè â àëãîðèòìàõ: Èíôîðìàòèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ / Ïåð. ñ
àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.: Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåðáóðã, 2003.
Ñ. 208–212.
2)
Commentz-Walter B. A string matching algorithm fast on average // Proc. of
the 6th Int. Colloq. on Automata, Languages and Programming. 1979. P.
118–132; Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ:
Èíôîðìàòèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ / Ïåð. ñ àíãë. È. Â. Ðîìàíîâñêî-
ãî. — ÑÏá.: Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåðáóðã, 2003. Ñ. 200–208; Ñìèò Á.
Ìåòîäû è àëãîðèòìû âû÷èñëåíèÿ íà ñòðîêàõ: ïåð. ñ àíãë. — Ì.: ÎÎÎ
«È. Ä. Âèëüÿìñ», 2006. Ñ. 364–366 (ïðàâäà, çäåñü àëãîðèòì íàçûâàåòñÿ «àë-
ãîðèòìîì Êîììåíö-Âàëüòåðà», íî ýòî — ñïåöèôèêà ïåðåâîäà ðàçëè÷íûìè
ëþäüìè).
3)
Îêóëîâ Ñ. Ì. Ðàçâèòèå èíòåëëåêòà øêîëüíèêà. Àáñòðàêòíûå òèïû äàí-
íûõ. — Ì.: ÁÈÍÎÌ. Ëàáîðàòîðèÿ çíàíèé, 2009. Ñ. 96.
Ïðèëîæåíèå 2 249

Ðèñ. Ï2.7. Ïîëíîå äâîè÷íîå äåðåâî èç 15 âåðøèí

Ðàññìîòðèì ïóòü îò êîðíÿ ê êàêîé-ëèáî âåðøèíå, íàïðèìåð 5.


Ïóòü âëåâî îáîçíà÷èì êàê 0, à âïðàâî — êàê 1. Äî ïÿòîé âåðøèíû
ìû èäåì íàëåâî (0), çàòåì íàïðàâî (1) è, íàêîíåö, îïÿòü íàëåâî (0).
Ïîëó÷èëè ìåòêó ïóòè 010. Ïðèïèøåì ê íåé åäèíèöó — èìååì
0101.
Åùå ïðèìåð — îò êîðíÿ äî âåðøèíû 10. Ìåòêà ïóòè èìååò âèä
10. Ïðèïèñûâàåì åäèíèöó è îñòàâøèåñÿ äî (d + 1)-ãî áèòà
íóëè, — ïîëó÷àåì 1010. Êîðåíü äåðåâà âñåãäà èìååò ìåòêó â âèäå
åäèíèöû íà ïåðâîì ìåñòå (ïðèïèñàííóþ) è îñòàâøèåñÿ íóëè.
Èòàê, ê ïîëó÷åííûì â ðåçóëüòàòå ïðîõîäà ïî ðåáðàì äåðåâà
áèòàì ìû ïðèïèñûâàåì åäèíèöó è äîïîëíÿåì íóëÿìè äî òðåáóåìî-
ãî êîëè÷åñòâà áèòîâ.
Âåðíåìñÿ ê ïîñòàâëåííîé çàäà÷å. Íåîáõîäèìî íàéòè íàèìåíü-
øåãî îáùåãî ïðåäøåñòâåííèêà âåðøèí x è y. Èñêëþ÷èì ïîêà ñëó-
÷àé, êîãäà îäíà èç âåðøèí ïðåäøåñòâóåò äðóãîé. Ïóñòü x = 9
(1001), à y =13 (1101). Âûïîëíèì îïåðàöèþ Xor íàä äâîè÷íûìè
íîìåðàìè: 1001 Xor 1101 = 0100. Äî ïåðâîé åäèíèöû ñëåâà (òî÷-
íåå, íîìåðà åå ïîçèöèè k) ðåçóëüòàòû îïåðàöèè Xor ïóòè äî âåð-
øèí x è y èç êîðíÿ ñîâïàäàþò, ò. å. ïåðâûå k – 1 ðåáåð îäèíàêîâû.
Ïóòü ïî ýòèì ðåáðàì èç êîðíÿ êàê ðàç è äàåò âåðøèíó, ÿâëÿþùóþ-
ñÿ íàèìåíüøèì îáùèì ïðåäøåñòâåííèêîì âåðøèí x è y. Äðóãèìè
ñëîâàìè, íîìåð ýòîé âåðøèíû ñîñòîèò èç k – 1 áèòà x èëè y, çà-
òåì — åäèíèöû è d + 1 – k íóëåé. Äëÿ åãî ïîëó÷åíèÿ ñëåäóåò âû-
ïîëíèòü îïåðàöèþ Xor, çàòåì íàéòè k, ñäâèíóòü x (èëè y) âïðàâî
íà d + 1 – k, ïîëîæèòü êðàéíèé ïðàâûé áèò ðàâíûì åäèíèöå è
ñäâèíóòü ðåçóëüòàò âëåâî íà d + 1 – k ïîçèöèé. Âñå ýòè îïåðàöèè
âûïîëíÿþòñÿ çà êîíñòàíòíîå âðåìÿ è, òàêèì îáðàçîì, íàèìåíü-
øèé îáùèé ïðåäøåñòâåííèê âåðøèí â ïîëíîì äâîè÷íîì äåðåâå
íàõîäèòñÿ çà ïîñòîÿííîå âðåìÿ.
Îñòàëñÿ íåðàññìîòðåííûì ñëó÷àé, êîãäà x ïðåäøåñòâóåò y
èëè y ïðåäøåñòâóåò x. Âûïîëíèì îïåðàöèþ Õîr è íàéäåì çíà÷å-
íèå k. Âåðøèíà x ïðåäøåñòâóåò âåðøèíå y òîãäà è òîëüêî òîãäà,
250 Ïðèëîæåíèÿ

êîãäà çíà÷åíèå k ñòðîãî áîëüøå, ÷åì êîëè÷åñòâî ðåáåð â ïóòè îò


êîðíÿ äî âåðøèíû x.

Ïðîáëåìà. Òðåáóåòñÿ íàéòè ìåòîä ïðåäâàðèòåëüíîé îá-


ðàáîòêè äåðåâà ñóôôèêñîâ ñ ëèíåéíîé âðåìåííîé îöåí-
êîé — òàêîé, ÷òî äëÿ ïîëó÷åíèÿ îòâåòà íà çàïðîñ î íàèìåíü-
øåì îáùåì ïðåäøåñòâåííèêå ëþáûõ äâóõ âåðøèí ïîòðåáó-
åòñÿ êîíñòàíòíîå âðåìÿ. Äðóãèìè ñëîâàìè, êîãäà çà
êîíñòàíòíîå âðåìÿ (ïðè ïîñòðîåííîì è ïðåäâàðèòåëüíî îá-
ðàáîòàííîì äåðåâå ñóôôèêñîâ çà îáùåå âðåìÿ O(n) ) îïðåäå-
ëÿåòñÿ íàèáîëüøèé îáùèé ïðåôèêñ äâóõ ïðîèçâîëüíûõ
ñóôôèêñîâ ñòðîêè.
Êîììåíòàðèé. Åñëè íàéòè îòîáðàæåíèå äåðåâà ñóôôèêñîâ â
ïîëíîå äâîè÷íîå äåðåâî, âûïîëíÿåìîå çà ëèíåéíîå âðåìÿ è ñîõðà-
íÿþùåå îòíîøåíèå íàñëåäîâàíèÿ â äåðåâå ñóôôèêñîâ, òî ïðîáëå-
ìà ðåøåíà1).

Çàäà÷à. Äàíû äâå ñòðîêè S1 (n = |S1|) è S2 (m = |S1|). Äëÿ


êàæäîé ïàðû çíà÷åíèé (i, j) òðåáóåòñÿ íàéòè äëèíó íàèáîëü-
øåãî îáùåãî ïðåôèêñà ñóôôèêñîâ S1[i..n] è S2[j..m].
Êîììåíòàðèé. Ñëåäóåò ïîñòðîèòü îáîáùåííîå äåðåâî ñóôôèê-
ñîâ äëÿ ñòðîê è âûïîëíèòü åãî ïðåäâàðèòåëüíóþ îáðàáîòêó òàê,
êàê ýòî óêàçàíî â îïèñàíèè ê ïðåäûäóùåé ïðîáëåìå. Ïîñëå ýòîãî
çàäà÷à ñâîäèòñÿ ê íàõîæäåíèþ ñòðîêîâîé ãëóáèíû íàèìåíüøåãî
îáùåãî ïðåäøåñòâåííèêà äâóõ âåðøèí (i è j) äåðåâà.

Ïðîáëåìà. Àíàëèç òåêñòîâ íà ðóññêîì ÿçûêå.


Ïî îïðåäåëåíèþ Ê. Øåííîíà, ýíòðîïèþ èñòî÷íèêà ñîîá-
ùåíèÿ ìîæíî îïðåäåëèòü êàê ìåðó ñîäåðæàùåãîñÿ â íåì
îáúåìà èíôîðìàöèè. Ïóñòü ó íàñ åñòü ÿçûê A, ñîñòîÿùèé èç
n ðàçíûõ ñèìâîëîâ A = {a1, a2, ..., an}. Ïðåäïîëîæèì, ÷òî
èñòî÷íèê S ìîæåò ãåíåðèðîâàòü ýòè ñèìâîëû ñ íåçàâèñèìû-
ìè âåðîÿòíîñòÿìè p[a1], p[a2], ..., p[an], ïðè÷åì ïîñëåäíèå
n
óäîâëåòâîðÿþò óñëîâèþ: å p[a i ] = 1. Òîãäà ýíòðîïèÿ èñòî÷-
i =1
n æ 1 ö
íèêà S ðàâíà H(S) = å p[a i ] × log 2 çç ÷÷ . Åå îáû÷íî îïðåäå-
i =1 è p[a i ] ø
1)
Ãàñôèëä Ä. Ñòðîêè, äåðåâüÿ è ïîñëåäîâàòåëüíîñòè â àëãîðèòìàõ: Èíôîðìà-
òèêà è âû÷èñëèòåëüíàÿ áèîëîãèÿ / Ïåð. ñ àíãë. È. Â. Ðîìàíîâñêîãî. — ÑÏá.:
Íåâñêèé Äèàëåêò; ÁÕÂ-Ïåòåðáóðã, 2003. Ñ. 227–244; Harel D., Tarjan R. E.
Fast algorithms for finding nearest common ancestors // SIAM J. Comput.
1984. Vol. 13. P. 338–355; Schieber B., Vishkin U. On finding lowest common
ancestors: simplifications and parallelization // SIAM J. Comput. 1988. Vol. 17.
P. 1253–1262.
Ïðèëîæåíèå 2 251

ëÿþò êàê ñðåäíåå êîëè÷åñòâî áèòîâ â ñîîáùåíèè, ïîðîæäåí-


íîì â èñòî÷íèêå. Ïðåäïîëîæèì, ÷òî ìû èìååì äåëî ñ òåê-
ñòàìè íà ðóññêîì ÿçûêå è àëôàâèò ñîñòîèò èç 32 ñèìâîëîâ
(«å» è «¸» íå ðàçëè÷àåì).

Çàäà÷à 1. Òðåáóåòñÿ ïðîèçâåñòè ýêñïåðèìåíòàëüíûå


îöåíêè çíà÷åíèé p[ai] ïî òåêñòàì íà ðóññêîì ÿçûêå è ïîä-
n æ 1 ö
ñ÷èòàòü âåëè÷èíó H(S( A)) = å p[a i ] × log 2 çç ÷÷ .
i =1 è p[a i ] ø
Êîììåíòàðèé. Ñëåäóåò âçÿòü t íåçàâèñèìûõ òåêñòîâ. Ïî êàæ-
äîìó òåêñòó j (ýêñïåðèìåíò) ïîäñ÷èòûâàþòñÿ (äëÿ âñåõ ñèìâî-
êîëè÷åñòâî ñèìâîëîâ ai
ëîâ ai) âåëè÷èíû pj [ai ] = è íàõîäèò-
t äëèíà òåêñòà
å pj [ai ]
j =1
ñÿ çíà÷åíèåp[ai ] = .
t
Âåëè÷èíó r(|A|) = log2|A| íàçûâàþò àáñîëþòíîé ýíòðî-
ïèåé ÿçûêà ñ àëôàâèòîì A. Äëÿ ðóññêîãî ÿçûêà ýòà âåëè÷è-
íà ðàâíà log232 = 5 áèòîâ íà áóêâó (äëÿ àíãëèéñêîãî ÿçûêà
log226 » 4,7 áèòîâ íà áóêâó).
Çàäà÷à 2. Ïðåäïîëîæèì, ÷òî â ñðåäíåì êàæäîå ñëîâî íà
ðóññêîì ÿçûêå ñîñòîèò èç k ñèìâîëîâ. Òðåáóåòñÿ âûïîë-
íèòü ýêñïåðèìåíòàëüíóþ îöåíêó âåëè÷èíû k ïî òåêñòàì
íà ðóññêîì ÿçûêå.
Ñ÷èòàåì, ÷òî èñòî÷íèê S ïîðîæäàåò ñëîâà â âèäå ïîñëå-
äîâàòåëüíîñòè, ñîñòîÿùåé èç k ñèìâîëîâ. Ïóñòü Ak îáîçíà-
÷àåò ìèíèìàëüíîå îæèäàåìîå êîëè÷åñòâî áèòîâ, òðåáóåìûõ
äëÿ çàïèñè ñëîâà èç k ñèìâîëîâ.
Òåîðåìà Ê. Øåííîíà ôîðìóëèðóåòñÿ â âèäå óòâåðæäå-
A
íèÿ: lim k = H(S). Äðóãèìè ñëîâàìè, ìèíèìàëüíîå ñðåä-
k®¥ A
íåå êîëè÷åñòâî áèòîâ, íåîáõîäèìîå äëÿ çàïèñè ñëîâà, ðàâíî
H(S( A))
H(S). Âåëè÷èíó r = íàçûâàþò ýíòðîïèåé ÿçûêà ñ
k
àëôàâèòîì A. Â ñâîå âðåìÿ Ê. Øåííîí ïîêàçàë, ÷òî ýíòðî-
ïèÿ àíãëèéñêîãî ÿçûêà ëåæèò â èíòåðâàëå îò 1,0 äî 1,5 áè-
òîâ íà áóêâó1).
1)
Ìàî Â. Ñîâðåìåííàÿ êðèïòîãðàôèÿ: òåîðèÿ è ïðàêòèêà. — Ì.: Èçäàòåëüñêèé
äîì «Âèëüÿìñ», 2005. Ñ. 114.
252 Ïðèëîæåíèÿ

Çàäà÷à 3. Òðåáóåòñÿ âûïîëíèòü ýêñïåðèìåíòàëüíóþ


îöåíêó ýíòðîïèè ðóññêîãî ÿçûêà.
Èçáûòî÷íîñòüþ ÿçûêà ñ àëôàâèòîì A íàçûâàþò âåëè-
÷èíó r(A) – r. Òàê, äëÿ àíãëèéñêîãî ÿçûêà îíà ðàâíà
4,7 – 1,5 = 3,2 áèòîâ íà áóêâó èëè, â ïðîöåíòíîì âûðàæå-
íèè, 3,2/4,7 » 68%. Äðóãèìè ñëîâàìè, àíãëèéñêèé òåêñò
áåç ïîòåðè èíôîðìàöèè ìîæíî ñîêðàòèòü íà 32%.
Çàäà÷à 4. Òðåáóåòñÿ ýêñïåðèìåíòàëüíî îïðåäåëèòü èçáû-
òî÷íîñòü ðóññêîãî ÿçûêà.
Èçâåñòíî, ÷òî â åñòåñòâåííûõ ÿçûêàõ íåêîòîðûå áóêâî-
ñî÷åòàíèÿ âñòðå÷àþòñÿ ÷àùå, ÷åì äðóãèå. Áóêâîñî÷åòàíèÿ
èç äâóõ áóêâ íàçûâàþò áèãðàììàìè, à èç òðåõ — òðèãðàì-
ìàìè. Çíàíèå ýòèõ îñîáåííîñòåé ÿçûêà èãðàåò çíà÷èòåëü-
íóþ ðîëü â ìåòîäàõ êðèïòîàíàëèçà (âñêðûòèÿ çàøèôðî-
âàííûõ äàííûõ). Åñëè êîëè÷åñòâî áèãðàìì â ðóññêîì ÿçûêå
ðàâíî 992, òî êîëè÷åñòâî òðèãðàìì — 29760.
Çàäà÷à 5. Òðåáóåòñÿ ýêñïåðèìåíòàëüíûì ïóòåì âûÿâèòü
íàèáîëåå ÷àñòî èñïîëüçóåìûå áèãðàììû è òðèãðàììû â ðóñ-
ñêîì ÿçûêå.
Ïðèìå÷àíèÿ. 1. Äëÿ ýòîãî íóæíî èìåòü òåêñòû èç ðàçëè÷íûõ
îáëàñòåé çíàíèÿ. 2. Ðåøåíèå ïóòåì ïðÿìîãî ïîäñ÷åòà èìååò «ïðà-
âî íà æèçíü», íî âàø óðîâåíü ðàçâèòèÿ ïîçâîëÿåò ðåøèòü çàäà÷ó è
áîëåå äîñòîéíûìè ìåòîäàìè. J
Êàæäûé èç íàñ îáëàäàåò îïðåäåëåííûì ñëîâàðíûì çàïà-
ñîì êàê â óñòíîé, òàê è â ïèñüìåííîé ðå÷è (âàðèàíò «ëþäî-
åäêè Ýëëî÷êè»1) èëè áåçäóõîâíûõ ìàíêóðòîâ çäåñü íå ðàñ-
ñìàòðèâàåòñÿ. Îáðàçîâàííûé ÷åëîâåê, ÷èòàÿ ñòèõè èëè ðî-
ìàí è íå çíàÿ àâòîðà, ïî îñîáåííîñòÿì ÿçûêà ñ äîñòàòî÷íî
áîëüøîé âåðîÿòíîñòüþ ìîæåò ñêàçàòü, êåì ýòîò òåêñò íàïè-
ñàí. Íàïðèìåð, îòëè÷èå ïîýçèè Â. Ìàÿêîâñêîãî îò òâîð÷åñ-
òâà Å. Åñåíèíà î÷åâèäíî äëÿ áîëüøèíñòâà.
Êîíêðåòèçàöèÿ ïðîáëåìû (à òî÷íåå, ïðîáëåìà íà äîëãèå
ãîäû J)2). Òðåáóåòñÿ ðàçðàáîòàòü àíàëèçàòîð òåêñòîâ ðóñ-
ñêîãî ÿçûêà. Äðóãèìè ñëîâàìè, åñëè íà âõîä òàêîé ïðîãðàì-
1)
Ãåðîèíÿ ðîìàíà È. Èëüôà è Å. Ïåòðîâà «Äâåíàäöàòü ñòóëüåâ», êîòîðàÿ îãðà-
íè÷èâàëàñü â îáùåíèè òîëüêî òðèäöàòüþ ñëîâàìè.
2)
Ó÷åíûìè, èññëåäîâàòåëÿìè, äà è ïðîñòî óìíûìè ëþäüìè ñòàíîâÿòñÿ íå
òîëüêî â ðåçóëüòàòå ÷òåíèÿ êíèã è íàêîïëåíèÿ â ïàìÿòè ôàêòîãðàôè÷åñêèõ
äàííûõ. Ñêîðåå âñåãî â ýòîì ñëó÷àå êàê ðàç è íå ñòàíîâÿòñÿ! «Ìíîãîçíàíèå
óìó íå íàó÷àåò», — ýòî ãîâîðèë, êàæåòñÿ, åùå Ãåðàêëèò. Ïóñòü íåñêîëüêî
ïðåóâåëè÷åííî, íî ýòî òàê, — ïðîôåññèîíàëû «âûðàñòàþò» â ðåçóëüòàòå ðå-
øåíèÿ ïðîáëåì, à èíîãäà (è íå î÷åíü ðåäêî) — â ðåçóëüòàòå ðåøåíèÿ îäíîé
ïðîáëåìû. Íî îíà (ïðîáëåìà) äîëæíà îáÿçàòåëüíî âàñ«âçÿòü çà æèâîå», îíà
äîëæíà áûòü âàøåé!
Ïðèëîæåíèå 2 253

ìû ïîäàåòñÿ íåêèé òåêñò, òî íà âûõîäå, íàïðèìåð, äîëæåí


áûòü óêàçàí àâòîð ýòîãî òåêñòà.
Ïðèìå÷àíèÿ. 1.  ñàìîì ïðîñòîì ñëó÷àå òðåáóåòñÿ ðàçëè÷àòü
òåêñòû äâóõ àâòîðîâ. 2. Ïðè ðåøåíèè ýòîé ïðîáëåìû ìíîãîå èç
òîãî, ÷òî èçó÷åíî ñ ïîìîùüþ ýòîé êíèãè, áóäåò âîñòðåáîâàíî, íî
äàííîãî ðàçäåëà computer science áóäåò ÿâíî íåäîñòàòî÷íî. 3. Ðå-
çóëüòàò âàøåé ðàáîòû, äîâåäåííûé äî «ïðîìûøëåííîãî» âàðèàí-
òà, áóäåò âîñòðåáîâàí î÷åíü ìíîãèìè. 4. Àâòîð íå ìîæåò äàòü ðàç-
âåðíóòûõ ðåêîìåíäàöèé ïî ðåøåíèþ ýòîé ïðîáëåìû. J

Ïðîáëåìà. Òðåáóåòñÿ ðàçðàáîòàòü ïðîãðàììíûé ñèíòå-


çàòîð îñìûñëåííûõ òåêñòîâ íà çàäàííóþ òåìó ñ òî÷êè çðå-
íèÿ ðóññêîãî ÿçûêà.
Êîììåíòàðèé. Ñì. ïðèìå÷àíèÿ ê ïðåäûäóùåé êîíêðåòèçà-
öèè. Åäèíñòâåííîå äîïîëíåíèå: åñëè âû íàó÷èòå êîìïüþòåð ïî çà-
äàííîìó ñþæåòó «âûäàâàòü» äåòåêòèâû ñîâðåìåííîãî òèïà, òî, âå-
ðîÿòíî, ñòàíåòå î÷åíü îáåñïå÷åííûì ÷åëîâåêîì. J

Ïðîáëåìà. Òðåáóåòñÿ ðàçðàáîòàòü àíàëèçàòîð ñîîáùåíèé,


ïåðåäàâàåìûõ ïî ýëåêòðîííîé ïî÷òå íà îïðåäåëåííûé àäðåñ.
Êîíêðåòèçàöèÿ ïðîáëåìû. Ñ ýëåêòðîííîé ïî÷òîé â íàñòîÿ-
ùåå âðåìÿ íå ðàáîòàåò ðàçâå òîëüêî î÷åíü ëåíèâûé. Îäíàêî
ìíîãèõ ðàçäðàæàåò îáèëèå ñïàìà. Ëþáîå ïèñüìî èìååò
îïðåäåëåííûé ôîðìàò è òàê èëè èíà÷å ïðåäñòàâëåíî â âèäå
áèòîâîé ïîñëåäîâàòåëüíîñòè. Ïðåäïîëîæèì, ÷òî â íåêîòî-
ðîì õðàíèëèùå (áàçå äàííûõ) åñòü «çàïðåùåííûå» äâîè÷-
íûå ïîäïîñëåäîâàòåëüíîñòè: ïðè èõ íàëè÷èè â òåêñòå ñîîá-
ùåíèÿ ïîñëåäíåå îòáðàñûâàåòñÿ. Åñòåñòâåííî, ÷òî äîëæåí
áûòü îáåñïå÷åí è èíñòðóìåíò äëÿ äîïîëíåíèÿ è èçìåíåíèÿ
äàííûõ â õðàíèëèùå.
Êîììåíòàðèé. Íà âîçðàæåíèå î òîì, ÷òî òàêèå ïðîãðàììû
óæå åñòü è îíè íàçûâàþòñÿ òàêèì-òî «ìóäðûì» àíãëèéñêèì ñëî-
âîì, ìû îòâå÷àòü íå áóäåì, êàê è íå áóäåì èñïîëüçîâàòü ñàìèõ
ýòèõ «ìóäðûõ» àíãëèéñêèõ ñëîâ. Âàøå ðåøåíèå ìîæåò áûòü è
ëó÷øå, è êà÷åñòâåííåå, — íî ñàìîå ãëàâíîå — îíî áóäåò âàøèì! J

Ïðîáëåìà. Òðåáóåòñÿ ðàçðàáîòàòü àíàëèçàòîð òðàôèêà


ýëåêòðîííîé ïî÷òû ñ öåëüþ âûÿâëåíèÿ îïàñíûõ ñîîáùå-
íèé.
Êîíêðåòèçàöèÿ ïðîáëåìû. Èçâåñòíî, ÷òî ýëåêòðîííóþ
ïî÷òó èñïîëüçóþò è íå î÷åíü õîðîøèå ëþäè, íàïðèìåð òåð-
ðîðèñòû. Ïðåäïîëîæèì, ÷òî èõ ñîîáùåíèÿ ìîæíî îõàðàêòå-
ðèçîâàòü íåêèì ìíîæåñòâîì äâîè÷íûõ ñëîâ, êîòîðûå óæå
âûÿâëåíû. Èõ íàëè÷èå (â ëþáîì ñî÷åòàíèè) â ñîîáùåíèè ãî-
254 Ïðèëîæåíèÿ

âîðèò î òîì, ÷òî îíî ïåðåäàåòñÿ «íåõîðîøèì ÷åëîâåêîì» è


ÿâëÿåòñÿ îïàñíûì.
Êîììåíòàðèé. Ñì. êîììåíòàðèé ê ïðåäûäóùåé êîíêðåòèçà-
öèè.
Ïðîáëåìà. Òðåáóåòñÿ íàïèñàòü ïðîãðàììó äëÿ òåìàòè-
÷åñêîé êëàññèôèêàöèè òåêñòîâ.
Êîíêðåòèçàöèÿ ïðîáëåìû. Äàí ìàññèâ òåêñòîâ íåñêîëüêèõ
ðàçëè÷íûõ òåìàòèê (íàïðèìåð, èç îáëàñòè ìàòåìàòèêè, ôè-
çèêè, àñòðîíîìèè è ò. ä.). Òðåáóåòñÿ íàïèñàòü ïðîãðàììó,
êîòîðàÿ íà ýòîì ìàññèâå îáó÷àåòñÿ ðàñïîçíàâàòü òåìàòèêó
òåêñòà. Ïîñëå ïðîöåññà îáó÷åíèÿ ïðîãðàììå ïðåäúÿâëÿåòñÿ
íîâûé òåêñò, êîòîðîãî íå áûëî â îáó÷àþùåì ìàññèâå. Íà âû-
õîäå äîëæíà ïîÿâèòüñÿ òåìà íîâîãî òåêñòà èëè çàêëþ÷åíèå
î íåèçâåñòíîé òåìå.
Êîììåíòàðèé. Îäèí èç ïîäõîäîâ ê äàííîé ïðîáëåìå çàêëþ÷à-
åòñÿ â íàõîæäåíèè â îáó÷àþùåì ìàññèâå òåêñòîâ âñåõ òåðìèíîâ —
ñëîâ èëè ñëîâîñî÷åòàíèé, çíà÷èìûõ äëÿ îïðåäåëåíèÿ òåìàòèêè.
Êàæäîìó òåðìèíó ïðèñâàèâàåòñÿ ñâîé âåñ — ÷èñëî, õàðàêòåðèçó-
þùåå çíà÷èìîñòü ýòîãî òåðìèíà. Âåñ â ïðîñòåéøåì ñëó÷àå ñîâïà-
äàåò ñ ÷àñòîòîé âõîæäåíèÿ òåðìèíà â òåêñò. Áîëåå ñëîæíûé ñïî-
ñîá — ïðèñâàèâàòü áîëüøèé âåñ òåðìèíàì, êîòîðûå ÷àñòî âñòðå÷à-
þòñÿ â òåêñòàõ îïðåäåëåííîé òåìàòèêè è ðåäêî — â îñòàëüíûõ
äîêóìåíòàõ, è íàîáîðîò, ìåíüøèé âåñ äàâàòü îáùåóïîòðåáèòåëü-
íûì ñëîâàì, êîòîðûå ÷àñòî âñòðå÷àþòñÿ âî âñåõ äîêóìåíòàõ îáó÷à-
þùåãî ìàññèâà.
Òàêèì îáðàçîì, çàäà÷à ñâîäèòñÿ ê ïîèñêó â äàííîì òåêñòå âñåõ
ñëîâîñî÷åòàíèé äëèíîé n (n = 1...N), âåñ êîòîðûõ ïðåâûøàåò çà-
äàííûé ïîðîã. Êîãäà âñå òàêèå ñëîâîñî÷åòàíèÿ áóäóò îïðåäåëåíû,
ïðîöåññ îáó÷åíèÿ ñ÷èòàåòñÿ çàêîí÷åííûì, è íà âõîä ïðîãðàììû
ïîñòóïàåò íîâûé òåêñò, òåìàòèêó êîòîðîãî íóæíî îïðåäåëèòü.
Çàìåòèì, ÷òî ïðîãðàììà áóäåò ðàáîòàòü óñòîé÷èâåå, åñëè îá-
ðàáîòêó îñóùåñòâëÿòü ïîñëå ìîðôîëîãè÷åñêîãî ðàçáîðà, ò. å. ïðè-
âåäåíèÿ âñåõ ñëîâ ê íîðìàëüíîé ôîðìå: äîìà, äîìîé, î äîìå º äîì.

Ïðîáëåìà. Òðåáóåòñÿ ñîñòàâèòü ïðîãðàììó äëÿ àâòîìà-


òè÷åñêîãî ðåôåðèðîâàíèÿ òåêñòà.
Êîíêðåòèçàöèÿ ïðîáëåìû. Íà âõîä ïðîãðàììû ïîñòóïàåò
òåêñò äëèíû N. Òðåáóåòñÿ íà âûõîäå ïîëó÷èòü òåêñò äëèíû
n (ðåôåðàò), àäåêâàòíî îòðàæàþùèé ñîäåðæàíèå èñõîäíîãî
òåêñòà; ïðè ýòîì n = N.
Êîììåíòàðèé. Ñóùåñòâóåò íåñêîëüêî ïîõîäîâ ê ðåøåíèþ äàí-
íîé ïðîáëåìû. Â îäíîì èç íèõ èñïîëüçóåòñÿ ïðèíöèï îòáîðà â ðå-
ôåðàò íàèáîëåå èíôîðìàòèâíûõ ïðåäëîæåíèé èñõîäíîãî òåêñòà,
èìåþùèõ íàèáîëüøèé âåñ (ñì. çàäà÷ó òåìàòè÷åñêîé êëàññèôèêà-
Ïðèëîæåíèå 2 255

öèè). Äðóãîé ïîäõîä çàêëþ÷àåòñÿ â ïîäñòàíîâêå íàèáîëåå çíà÷è-


ìûõ ñëîâ è ñëîâîñî÷åòàíèé â çàðàíåå çàäàííûå ôðàçû-êëèøå, òà-
êèå êàê «Â ñòàòüå ðàññìàòðèâàåòñÿ òåìà...», «Â òåêñòå óêàçûâàåò-
ñÿ, ÷òî...».
Îäíîé èç âàæíûõ õàðàêòåðèñòèê ïîäîáíîé ïðîãðàììû ÿâëÿ-
åòñÿ âîçìîæíîñòü íàñòðîéêè äëèíû ðåôåðàòà n.

Ïðîáëåìà. Òðåáóåòñÿ ðàçðàáîòàòü ïðîãðàììó ìàøèííî-


ãî ïåðåâîäà ñ êàêîãî-ëèáî èíîñòðàííîãî ÿçûêà íà ðóññêèé è
îáðàòíî.
Êîíêðåòèçàöèÿ ïðîáëåìû. Äàí òåêñò íà èíîñòðàííîì ÿçû-
êå. Ïðîãðàììà äîëæíà (ñ èñïîëüçîâàíèåì ñëîâàðÿ) ñîñòà-
âèòü òåêñò íà ðóññêîì ÿçûêå, êîòîðûé ÿâëÿåòñÿ ïåðåâîäîì
èíîñòðàííîãî òåêñòà.
Êîììåíòàðèé. Çàäà÷à ìîæåò ðåøàòüñÿ «â ëîá», êîãäà êàæäî-
ìó èíîñòðàííîìó (íàïðèìåð, àíãëèéñêîìó) ñëîâó ñîîòâåòñòâóåò
ðóññêîå, à ïðîãðàììà ïðîñòî çàìåíÿåò àíãëèéñêèå ñëîâà íà ñîîò-
âåòñòâóþùèå ðóññêèå èç ñëîâàðÿ.
Ñëåäóþùèì øàãîì ìîæåò áûòü àíàëîãè÷íàÿ çàìåíà íå îò-
äåëüíûõ ñëîâ, à óñòîé÷èâûõ ñëîâîñî÷åòàíèé, ôðàçåîëîãèçìîâ.
Ïðè ýòîì, ÷òîáû èçáåæàòü ñëèøêîì ñòðåìèòåëüíîãî ðîñòà îáúåìà
òàêîãî ñëîâàðÿ, ìîæíî îãðàíè÷èòüñÿ îïðåäåëåííîé ïðåäìåòíîé
îáëàñòüþ (íàïðèìåð, ïðîãðàììèðîâàíèåì).
Äàëüíåéøèå óñîâåðøåíñòâîâàíèÿ âåäóò íàñ â îáëàñòü ñèíòàê-
ñè÷åñêîãî ðàçáîðà ïðåäëîæåíèÿ è âûÿâëåíèÿ ñìûñëà òåêñòà (â îá-
ëàñòü ñåìàíòèêè).  õîäå ðåøåíèÿ òàêîé çàäà÷è âîçíèêàåò ïðî-
áëåìà ìîðôîëîãè÷åñêîãî àíàëèçà — îïðåäåëåíèÿ è ïîäñòàíîâêè
íóæíîé ôîðìû ñëîâà (ïðèñòàâîê, ñóôôèêñîâ, îêîí÷àíèé), íàïðè-
ìåð âûéòè èç äîìà — èäòè äîìîé. Ìîæíî ïîäóìàòü íàä ñîáñòâåí-
íûì ðåøåíèåì ëèáî âîñïîëüçîâàòüñÿ ñïåöèàëüíûìè ïðîãðàììàìè
ìîðôîëîãè÷åñêîãî àíàëèçà.
Минимальные системные требования определяются соответ-
ствующими требованиями программы Adobe Reader версии
не ниже 11-й для платформ Windows, Mac OS, Android, iOS,
Windows Phone и BlackBerry; экран 10"

Учебное электронное издание


Серия: «Развитие интеллекта школьников»

Окулов Станислав Михайлович

АЛГОРИТМЫ ОБРАБОТКИ СТРОК


Ведущий редактор Д. Ю. Усенков
Художник Н. А. Новак
Технический редактор Е. В. Денюкова
Корректор Л. Н. Макарова
Компьютерная верстка: В. А. Носенко
Подписано к использованию 19.03.15. Формат 125×200 мм
Издательство «БИНОМ. Лаборатория знаний»
125167, Москва, проезд Аэропорта, д. 3
Телефон: (499) 157-5272
e-mail: info@pilotLZ.ru, http://www.pilotLZ.ru
На материале задачи поиска подстроки в строке, решению которой
посвящены работы многих профессионалов за последние 20–30 лет,
показано, как построить занятия по информатике, чтобы побудить
школьника к творчеству, развить у него вкус к решению исследова-
тельских проблем.
Для школьников, преподавателей информатики, а также для студентов,
выбравших информатику в качестве основной специальности. Книга
может быть использована как в обычных школах при проведении
факультативных занятий, так и в образовательных учреждениях
с углубленным изучением информатики и математики.

ОКУЛОВ Станислав Михайлович


Декан факультета информатики Вятского государственного
гуманитарного университета, кандидат технических наук, доктор
педагогических наук, профессор, с 2001 г. почетный работник выс-
шего профессионального образования РФ. Автор 9 изобретений
по элементам ассоциативных вычислительных структур и автор
(соавтор) 15 книг по информатике для школьников и студентов.
Область интересов: развитие интеллектуальных способностей
школьника при активном изучении информатики, методика препо-
давания информатики в школе и вузе.
С 1993 по 2003 год деятельность в вузе совмещал с работой учителя
информатики. За это время его ученики отмечены 33 дипломами
(1-й и 2-й степени) на российских олимпиадах школьников по ин-
форматике; трое из них представляли Россию на международных
олимпиадах.

Вам также может понравиться