О сложности поиска вхождений подстроки в множество строк

жит либо ап, либо а, то эти пары не могут совпадать с апа. Поэтому апа равно либо аао, либо an-1an. Следовательно, либо а = an, либо а = а0, тем самым в обоих случаях последовательность Q содержит три идущих подряд одинаковых символа, что противоречит ее бескубности.

3. Пусть правый корень квадрата w содержит монообраз с прообразом aß и число монообразов,

целиком содержащихся в правом корне, не меньше числа монообразов, целиком содержащихся в

левом корне. Таким образом, Фй содержит в качестве фактора Д-квадрат w, такой, что в его правом

корне присутствует монообраз с прообразом aß, равный (1)А+1 ми (2)А+1. Согласно лемме 6 Фй

имеет фактор wR, который, очевидно, тоже является Д-квадратом. В левом корне фактора wR

содержится фактор (1)А+1 ми (2)А+1, этот фактор является монообразом с прообразом aß, так

как ни (1)А+1, ни (2)А+1 не может быть строгим фактором конкатенации двух последовательных

wR

не меньше, чем в правом корне. Это противоречит разобранному ранее случаю 2.

4. Пусть левый корень квадрата w содержит монообраз с прообразом aß и число монообразов, целиком содержащихся в левом корне, меньше числа монообразов, целиком содержащихся в правом

w

два последовательных монообраза, из которых хотя бы один в силу сильной бескубности последовательности Q является монообразом с прообразом вида aß. Поэтому данный случай сводится к случаю 2.

w aß

целиком содержащихся в правом корне, меньше числа монообразов, целиком содержащихся в левом

w

два последовательных монообраза, из которых хотя бы один в силу сильной бескубности последовательности Q является монообразом с прообр азом вида aß. Поэтому данный случай сводится к случаю 2.

Таким образом, сверхслово Фй обладает свойством (А)-

ДД

ратом. Поэтому результат теоремы неулучшаем.

СПИСОК ЛИТЕРАТУРЫ

1. Thue A. Uber unendliche Zeichenreihen // Mat. Nat. Kl. Khristiania. 1906. 7. 1-22.

2. Саломаа А. Жемчужины теории формальных языков. М.: Мир, 1986.

3. Thue A. Uber die gegenseitige läge gleicher teile gewisser Zeichenreihen // Mat. Nat. Kl. Kristiania. 1912. 1. 1-67.

4. Aviezri S. How many squares must a binary sequence Contain? // Electron. J. Combinatorics. 1995. 2.

5. Crochemore M. Repetitions in strings: algorithms and combinatorics // Theor. Comput. Sei. 2009. 410, N 50. 5227-5235.

6. Crochemore M. Squares, cubes, and time-space efficient string searching // Algorithmica. 1995. 13, N 5. 405-425.

7. Котляров H.B. О существовании сколь угодно длинных слов, не содержащих квадратов с одной возможной ошибкой замещения // Дискретн. матем. 2015. 27, вып. 2. 56-72.

8. Котляров Н.В. О словах, избегающих квадратов с одной возможной ошибкой замещения // Вестн. Моск. ун-та. Матем. Механ. 2016. № 1. 48-52.

Поступила в редакцию 13.09.2017

УДК 519.712 -

О СЛОЖНОСТИ ПОИСКА ВХОЖДЕНИЙ ПОДСТРОКИ В МНОЖЕСТВО СТРОК

Е. М. Перпер1

Рассматривается задача поиска вхождений подстроки в множество строк: пусть дано множество строк, требуется для произвольной подстроки найти все ее вхождения в строки из этого множества. Исследуются алгоритмы осуществления такого поиска, приве-

1 Перпер Евгений Михайлович — инженер АО "Крафтвэй корпорэйшн ПЛС", e-mail: e_m_perperQmail.ru.

дены нижняя оценка времени работы этих алгоритмов и оценки объема памяти для самых быстрых (по порядку) алгоритмов.

Ключевые слова: подстрока, строка, вхождение, поиск вхождений подстроки, нижняя оценка, верхняя оценка.

The paper considers the problem of listing all occurrences of an arbitrary pattern in the strings from given set. We obtain lower bound for amount of time taken by search algorithms. We also obtain the order of memory volumes required by algorithms with the best order search time.

Key words: pattern, text, occurrence, string matching, lower bound, higher bound.

Поиск вхождений какой-либо подстроки в строки из большого массива — задача, имеющая важное практическое значение. Она возникает, например, при пользовании словарем, когда необходимо найти все вхождения какого-либо корня в содержащие его слова; при поиске участка цепи ДНК в нескольких цепях ДНК. Очевидное решение — перебор всех строк и проверка каждой строки с целью обнаружения нужной подстроки — требует больших затрат времени.

Известен ряд алгоритмов, решающих похожую задачу — задачу поиска вхождений произвольной подстроки ("образца") в одну строку ("текст"). Заслуживают упоминания алгоритм Кнута-Морриса-Пратта [1], осуществляющий поиск за время, в худшем случае пропорциональное сумме длин текста и образца; алгоритм Бойера-Мура-Галиля [2], позволяющий достичь времени работы, не превышающего (по порядку) длины образца, а в среднем требующий проверки числа символов, меньшего суммы длин текста и образца. Оба этих алгоритма не требуют предобработки текста. В отличие от них для алгоритмов, использующих суффиксные деревья или суффиксные массивы со словарями рангов [3], необходима предобработка текста, но они осуществляют поиск значительно быстрее — за время, пропорциональное сумме длины образца и количества вхождений образца в текст. Эти алгоритмы требуют O(nlogn) памяти в модели МПД (машина произвольного доступа), где n — длина текста.

Для решения задачи поиска вхождений подстроки в множество строк можно использовать обобщенное суффиксное дерево [4]. Основанный на нем алгоритм позволяет искать образец в массиве строк за время, пропорциональное сумме длины образца и количества вхождений образца в массив строк. Если в массиве p строк и все они имеют длину n, то обобщенное суффиксное дерево потребует O(pn log(pn)) памяти. В настоящей работе предлагается (в рамках информационно-графовой модели данных [5, 6]) алгоритм, фактически представляющий собой модификацию обобщенного суффиксного дерева. Он требует O(pn) памяти. Отсутствие множителя log(pn) в выражении для оценки памяти в информационно-графовой модели данных связано с тем, что в модели МПД длина машинного слова полагается равной логарифму числа символов в массиве строк, т.е. равной log(pn), тогда как в информационно-графовой модели она неявно полагается равной 1. Доказывается, что время работы предложенного алгоритма и требуемая им память минимальны по порядку. Другой алгоритм поиска вхождений подстроки в множество строк, представляющий собой модификацию обобщенного суффиксного дерева, был опубликован в работе [7]. Он отличается от алгоритма, предложенного в настоящей работе, меньшим временем обработки запроса в худшем случае, но большим объемом затрачиваемой памяти.

Введем необходимые обозначения. Пусть N = {1, 2,... , k}; Wk,n = un=iNS{0}n-s — множество строк длины не более n над алфавитом N. Для каждой строки w € Wfc,n ее длину будем обозначать через l(w); г-й буквой строки w € Wfc,n, где i € {1,..., n}, назовем i-й элемент соответствующего строке w набора. В частности, если i > l(w), то i-я буква строки w равна 0. Будем обозначать i-ю букву строки w через w[i]. Через w[a...b], где a, b € N, 1 ^ a ^ b ^ l(w), будем обозначать такую строку v € Wfc,n, что l(v) = b — a + 1 и v[i] = w[a + i — 1] для всех натуральных i, не превышающих l(v). Будем называть строку w[a...b] подстрокой строки w, начинающейся с a-й буквы последней и заканчивающейся ее ^й буквой. Будем говорить, что строки w € Wfc,n и v € Wfc,n равны или совпадают (и писать w = v) , если l(v) = l(w) и v[1] = w[1],v[2] = w[2],... , v[1(v)] = w[1(w)]. Для строки w ее подстроку w[1...q], q € N, q ^ ¿(w), будем называть префиксом строки w, а если при этом q < l(w), то собственным префиксом строки w.

Пару (w, i), где w € Wfc,n и i € N^w), назовем вхождением в строку w. Множество всех вхождений в строки из некоторого множества M будем обозначать через Oc(M).

Рассмотрим X = Wfc,n — множество запросов, а также Y = N^ — множество записей. Каждая запись является строкой длины n над алфавитом N, а запрос — строкой длины не более n над

алфавитом Введем бинарное отношение р, которое позволит устанавливать, когда вхождение (у, г) € Ос(У) удовлетворяет запросу х € X (отношение поиска): х р (у, г) х = у[г...1(х) + г — 1]. Рассмотрим задачу информационного поиска (ЗИП) I = < Х,У, р >, где V = {уь у2,   , ур}, V ^ У. Множество V будем называть библиотекой. Будем считать, что задача I = < Х^, р > состоит в перечислении для произвольно взятого запроса х € X всех тех и только тех вхождений ш € Ос^), для которых выполнено х р ш. Назовем эту задачу задачей поиска вхождений подстроки.

Введем понятие информационного графа (ИГ) в соответствии с работами [5, 6] с той разницей, что там, где в [5, 6] рассматривалось множество У, мы будем рассматривать множество Ос(У). В формальном определении понятия ИГ будем использовать два описанных выше множества X и Ос(У), а также множество Е предикатов, заданных на множестве X (предикаты — это функции, которые могут принимать только два значения: 0 или 1), и множество О переключателей, заданных на множестве X (переключатели — это функции, область значений которых является начальным отрезком натурального ряда). Пару $ = < Е, О > будем называть базовым множеством. Рассмотрим произвольный ориентированный граф. Выделим в нем одну вершину. Назовем ее корнем. Выделим в графе какие-либо другие вершины. Назовем их листьями. Сопоставим каждому листу неко-

Ос

графе некоторые вершины (это могут быть в том числе корень и листья) и назовем их точками переключения. Если в — вершина графа, то через фв обозначим полустепень исхода вершины в (т.е. число исходящих из этой вершины ребер). Каждой точке переключения в сопоставим некий О

в

из множества {1, 2,    ,фв}• Эти ребра назовем переключательными, а это соответствие — нагрузкой переключательных ребер. Ребра, не являющиеся переключательными, назовем предикатными. Каждому предикатному ребру графа сопоставим некоторый элемент множества Е. Это соответствие назовем нагрузкой предикатных ребер. Полученный нагруженный граф назовем информационным графом над базовым множеством $ = < Е,О >.

Определим функционирование ИГ. Скажем, что предикатное ребро проводит запрос х € X,

1х

ребро, которому приписан номер г, проводит запрос х € X, если переключатель, приписанный к началу этого ребра, принимает значение г на запросе х; ориентированная цепь ребер проводит запрос х € X, если каждое ребро цепи проводит запрос х; запрос х € X проходит в вершину в ИГ,

вх

запись у, приписанная к листу а, попадает (включается) в ответ ИГ на запрос х € X, если запрос х проходит в лист а Ответом ИГ и на запрос х назовем множество вхождений, попавших в ответ ИГ на запрос х, и обозначим его (х). Функцию Ju(х) будем считать результатом функционирования ИГ и и называть функцией ответа ИГ и. Скажем, что ИГ и решает ЗИП I = если для

любого запроса х € X ответ на этот запрос содержит все те и только те записи из V, которые удовлетворяют запросу х, т.е. Ju(х) = {ш € Ос^) : хрш} = J^(х).

Обозначим через ]V = (х) : х € X} множество ответов, соответствующих библиотеке V. Назовем ответом любое множество, являющееся элементом Jv, т.е. ответ — это множество всех вхождений, удовлетворяющих одному и тому же запросу. Если задача I зафиксирована, ответ на запрос х будем обозначать J (х).

Определим понятие сложности информационного графа на запросе. Сделаем это в более общем виде, чем в [5, 6]: будем считать, что время вычисления функции /(х) зависит те только от /, но и от х. Обозначим через Рг(и,х) множество всех предикатных вершин ИГ и, в которые проходит запрос х, а через и, х) множество всех переключательных вершин ИГ и, в которые проходит запрос х. Обозначим через Е(в) множество всех ребер, выходящих из вершины в Тогда определим

их

Т(и,х)= ^ 1(др,х)+ £ ^ /,х),

вeSw

гДе дв — переключатель, сопоставленный вершине в /е — предикат, сопоставленный ребру е; Ь(/,х) — время обработки запроса х функцией /. Величина Т(и,х) характеризует суммарное время х

Объемом Q(U) ИГ U назовем число ребер в ИГ U. Объем Q(U) соответствует объему памяти, используемой информационным графом.

В качестве базового множества F будем рассматривать < F1 [J F2, G1 U G2 >• Здесь F1 = {/(ж)}, где /(ж) = 1; F2 = {/¿j(ж), i € N,j € NU{0}}, где /¿j(ж) = 1, если x[i] = j, и /¿j(ж) = 0, если x[i] = j; G1 = {gi(#),i € N}, где ^¿(ж) = жИ, если ^[i] = 0, и $г(ж) = k + ^ли #[i] = 0. Наконец, G2 = {hv>i(^),v € Wk,n\Nn", i € N}, где переключатель hV)i(ж) определяется следующим образом: hv>i(ж) = 1, если i > ¿(ж) либо ж[!..1(ж)] — собственный префикс v; hV)i(ж) = 2 если i ^ ¿(ж) и v — префикс ж[^..1(ж)]; (ж) = 3 во всех остальных случаях.

При вычислении любого переключателя gi

/

/¿,j(ж) и gi(ж). Будем считать, что ложность вычисления любого переключателя gi(ж) и предиката /¿j (ж) равна 1, а сложность вычисления предиката /(ж) равнa t, 0 < t < 1. Согласно [7], сложность вычисления переключателя ^¿(ж) равна 1 + 2тах(1(ж) — i + 2,1) если ^¿(ж) = 11 + 21(v), если hv>i(ж) = 2; 3 + 2 max j, если hV)i(ж) = 3.

j:[i...i+j-1]=v[1...j ]

Введем следующие обозначения: U(I, F) — множество всех ИГ над базовым множеством F, решающих ЗИП I = < X, V, р >; е(ж) = т1п(1(ж) + 1, n); R(I, F, ж) = е(ж) + t  (| Jj(ж)| — 1).

Теорема 1 [7]. Пр и k ^ 2 дм каждой за дачи I = < X, V, р >, для любых U € U (I, F) м ж € X выполняется следующее утверждение: если |Jj(ж)| ^ 1, то T(U, ж) ^ R(I, F, ж).

Обозначим через Ui, i € N, множество таких графов U € U(I, F), что для каждого из них при любых ж из X выполняется условие T(U, ж) ^ i  R(I, F, ж).

Пусть Q(p,n) = max min Q(U); Q^p, n) = max min Q(U).

J:J=<X,V,p>,|V|=p UeU(J,F) J:J=<X,V,p>,|V|=p UeU

Теорема 2 [7]. Для любых натуральных n u p выполнено pn ^ Q(p, n) ^ Q3(p, n) ^ (2k + 11)pn.

Теорема 3. Для любых натуральных n и p выполнено pn ^ Q(p, n) ^ Q &+1(p, n) ^ 13pn.

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

Лемма. Пусть I = < X, V, р > — задача, поиска вхождений подстроки, причем V состоит из p строк. Тогда найдет,ся, ИГ U1 без листьев (т.е. вершин, которым сопоставлены вхождения) над базовым множеством F, обладающий следующими свойствами:

1) для каждого непустого ответа J, соответствующего V, найдется вершина k(J), из кото-

ж

J

2) Q(U') < 10pn;

3) для каждого за проса, ж € X выполнено нера венет во T (U'^) ^ (k + 1)е(ж).

Доказательство. Рассмотрим все элементы множества Oc

рассмотрим ж = vi[j...n]. Выберем е(ж) + 1 вершин, пронумеруем их от 1 до е(ж) + 1, а затем для каждого r € {1,..., е(ж)} проведем из вершины под номером r в вершину под номером r + 1 ребро, присвоив ему номер ж [г]. Вершину с ном ером е(ж) + 1 дополнительно назовем А(ж).

1

r 1 n—1

r

из этой вершины, и вершины, в которые входят эти ребра (по построению все отождествленные вершины будут иметь номер r + 1). Заметим, что по построению из вершины с номером n не могут выходить два или более ребра с одним и тем же номером, так как это означало бы наличие в библиотеке одинаковых строк.

Полученный граф является ориентированным деревом, так как в корень не входит ни одно ребро, а в каждую вершину, кроме корня, входит одно ребро. Каждой вершине а, в которую ведет ребро с номером из N&, можно сопоставить строку ж(а), являющуюся конкатенацией номеров ребер, по которым можно пройти из корня в эту вершину. По построению графа никаким двум различным вершинам не будет сопоставлена одна и та же строка (в противном случае эти вершины были бы

ж

либо строки vi[j...n], т.е. подстрокой какой-либо строки из V, и обратно: каждая подстрока какой-либо строки из V является ж(а) для какой-либо вершины а.

Сопоставим каждому ребру предикат /¿j (ж) где j — номер ребра, a i — номер вершины, из

которой выходит данное ребро. Получим, что в каждую вершину а, в которую ведет ребро с номером из Ык, пройдут все те и только те запросы, префикс которых совпадает с х(а); в вершину, в которую из некоторой вершины а ведет ребро с номером 0 пройдет только запрос х(а). Заметим, что концевыми вершинами дерева являются все те и только те вершины, которые обозначены \(vi[^п}) для некоторых г и причем в каждую концевую вершину А(х) проходит только запрос х. Для каждой концевой вершины А(х) обозначим через М(х) множество всех таких вхождений (Уi,]), что х = У^^п]. Очевидно, что множества М(х), соответствующие разным концевым вершинам,

а

А(х), для которых х(а) является префиксом строки х. Так как ответ J(х(а)) состоит из всех тех и только тех вхождений (у,,]), для которых х(а) является префиксом строки у^Д^п], то этот от-

М

а

Добавим в граф еще одну вершину, назовем ее к(0).

Для каждой пары (¿1 ,¿2), ¿1, ¿2 € N„+1, 2 ^ ¿1 < ¿2, рассмотрим каждую цепочку вершин с номерами гl,,г2, обладающую следующими свойствами: а) из каждой вершины этой цепочки,

г2

0, и это ребро входит в вершину, которая также принадлежит этой цепочке; б) добавить к этой цепочке какие-либо вершины так, чтобы свойство а сохранилось, невозможно. Обозначим каждую принадлежащую цепочке вершину через аг, где г — номер этой вершины. Заметим, что J(х(а^)) = Л(х(а^+1)) =    = Л(х(а^)), так как из всех аг, г € {¿1, г1 1,   , г2}, схемно достижимы одни и те же концевые вершины.

Обозначим .](х(а^)) через Е Рассмотрим произвольный запрос х, прошедший в вершину а т.е. х[1   ¿1 — 1} = х(а^). Возможно несколько случаев:

1) х проходит в вершину а2, т.е. строка x(аi2) является префиксом строки х;

2) х является собственным префиксом строки x(аi2), тогда, так как х = х(а) для некоторого г € {¿1,    ,г2 — 1} ответом на запрос х является J;

3) х не проходит в вершину а^ и не совпадает с x(ai) ни для какого г € {¿1,    ,¿2 — 1}- Тогда по построению графа получаем, что ](х) = 0.

Удалим теперь вершины а^+1,   , а^_1 и выходящие из них ребра, а ребро, выходящее из а^, направим в а^ и присвоим ему номер 2. Если вершина А(х(а^)) существует (это либо а либо в нее из а^ входит ребро с номером 0), дополнительно назовем ее к(,1), иначе выберем новую вершину, назовем ее к(.1) и проведем в нее из щ2 ребро с предикатом Д,о(х). Проведем в к(,1) из а^ ребро с номером 1. Кроме того, проведем из а^ в к(0) ребро номер 3. Сопоставим вершине а^ переключатель где у = х(а^)[г1   г2 — 1]. Получим, что в случае 1 запрос х по-прежнему проходит в вершину а^, а если х совпадает с х(а^), то и в к(,1); в случае 2 запрос х проходит в вершину к(,1), а в случае 3 — в вершину к(0).

Пусть все цепочки рассмотрены. Все вершины А(х), не обозначенные дополнительно через к(,1) для некоторого ответа Д обозначим дополнительно через к(,1 (х)). Из каждой вершины а, из которой выходит хотя бы одно ребро с предикатом Д^-, г € € и не выходит ребро с предикатом До, выпустим ребро с предикатом До и направим его в новую вершину, которую назовем к(,1 (х(а))). Получим, что каждый запрос х, имеющий непустой ответ J(х), пройдет в вершину к^(х)) и не пройдет ни в какую вершину к(,1 (х')), где ](х) = ](х'). Утверждение 1 леммы доказано.

Заметим, что в построенном графе в каждую вершину, имеющую ненулевую полустепень исхода, входит не более одного ребра, причем в корень не входит ни одно ребро.

Рассмотрим произвольное ребро построенного графа. Если ребро выходит из вершины, которой сопоставлен переключатель (х), то выходящее из той же вершины ребро с номером 1 ведет в некоторую вершину к(.]). Если рассматриваемому ребру сопоставлен предикат До(х), то оно ведет в некоторую вершину к(,1). Если ребру сопоставлен предикат Д^-(х),] = 0, то рассмотрим вершину, в которую ведет это ребро. Возможны три варианта: это некоторая вершина к(,1); это вершина, из которой выходит ребро До(х), ведущее в некоторую вершину к(,1); это вершина, которой сопоставлен переключатель Ни^(х), причем выходящее из этой вершины ребро с номером 1 входит в некоторую вершину к(,1). Во всех случаях сопоставим рассматриваемому ребру ответ .].

Покажем, что каждому непустому ответу .] сопоставлено не более 5 ребер. Действительно, если в вершину к(.]) входит ребро с номером 1 из вершины с переключателем (х), то всего ей сопоставлено не более 5 ребер: 3 ребра, выходящие из вершины с переключателем (х); ребро, входящее в

вершину с переключателем hv,i(ж); ребро с предикатом Л+г(^);о(ж), выходящее из вершины, в которую ведет ребро с номером 2 из вершины с переключателем hv,i(ж) Если в вершину k(J) не входит ребро с номером 1 из какой-либо вершины с переключателем hv,i(ж), то в нее входит только ребро с предикатом fi;j (ж). Если j = О то ответу J сопоставлены 2 ребра: само ребро с предикатом До (ж) и ребро, входящее в вершину, из которой выходит ребро с предикатом До(ж). Если же j = О, то ответу J сопоставлено только ребро с предикатом fi,j(ж).

V

2pn

ответу сопоставлено не более 5 ребер графа, получаем, что объем графа не превышает 1Орп. Таким образом, утверждение 2 леммы доказано.

ж

непуст, каждая его буква (а также буква ж[1(ж) + 1], если 1(ж) < n) обрабатывается либо в функции hv,i(ж) (согласно [7], в этом случае сложность обработки буквы не превышает 3), либо путем вычисления для этой буквы не более k + 1 предикат ов fi, j (ж). Других затрат времени при обработке запроса нет. Таким образом, время, за которое запрос попадет из корня в некоторую вершину k(j), не превышает (k+1)e(ж). Тем самым утверждение 3 леммы доказано, а вместе с ним и сама лемма.  Перейдем к непосредственному доказательству теоремы 3.

Рассмотрим граф, построенный по лемме. Согласно лемме 2 из [7], этот граф можно достроить до ИГ U, решающего задачу поиска вхождений подстроки, добавив не более pn +I Jy I — 1 ребер, причем время обработки запроса ж после попадания в вершину к( J (ж)) не будет превышать 2(I J (ж) I — l)t. Согласно лемме 1 из [7], Jy I ^ 2pn. Таким образом, объем построенного графа не будет превышать 1Зрп, тогда как сложность обработки запроса не будет превышать (k + 1^(ж) + 2(I J (ж) I — l)t, что в свою очередь не превосходит (k + 1)R(I, F, ж), т.е. U G U&+1, откуда следует верхняя оценка Qfc+1(p,n) Нижняя оценка следует го теоремы 2 и определения Q(p, n). Теорема 3 доказана.

Автор приносит благодарность профессору Э.Э. Гасанову за постановку задачи и помощь в работе.

СПИСОК ЛИТЕРАТУРЫ

1. Knuth D.E., Morris J.H., Pratt V.B. Fast pattern matching in strings // SIAM J. Comput. 1977. 6, N 2. 323-350.

2. Galil Z. On improving the worst case running time of the Boyer-Moore string searching algorithm // Communs ACM. 1979. 22, N 9. 505-508.

3. Navarro G., Mäkinen V. Compressed fulltext indexes // ACM Comput. Surv. 2007. 39, N 1, article 2.

4. Гасфилд Д. Строки, деревья и последовательности в алгоритмах. Информатика и вычислительная биология. СПб.: Невский Диалект; БХВ-Петербург, 2003.

5. Гасанов Э.Э., Кудрявцев В.Б. Теория хранения и поиска информации. М.: Физматлит, 2002.

6. Кудрявцев В.В., Гасанов Э.Э., Подколзин A.C. Основы теории интеллектуальных систем. М.: Макс Пресс, 2016.

7. Перпер Е.М. Порядок сложности задачи поиска в множестве слов вхождений подслова // Интеллектуальные системы. Теория и приложения. 2015. 19, №1. 99-116.

Поступила в редакцию 27.09.2017

УДК 154

ТОПОЛОГИЯ СЛОЕНИЙ ЛИУВИЛЛЯ ИНТЕГРИРУЕМОГО БИЛЬЯРДА

В НЕВЫПУКЛЫХ ОБЛАСТЯХ

В. А. Москвин1

Исследованы плоские бильярды в невыпуклых областях, ограниченных дугами софо-кусных квадрик, а также в областях, ограниченных дугами взаимно перпендикулярных прямых. Изучена топология изоэнергетических поверхностей таких бильярдов путем вычисления молекулы Фоменко — инварианта грубой лиувиллевой эквивалентности.

1 Москвин Виктор Александрович — студ. каф. дифференциальной геометрии и приложений мех.-мат. ф-та МГУ, e-mail: aoshi.k68Qgmail.com.