Хакасский государственный университет им. Н.Ф. Катанова

     Структуры и алгоритмы обработки данных

           Лекция: Поиск подстрок.

       Николай Гребенщиков, www.grebenshikov.ru
Задачи на строках

Основное приложение: вычислительная молекулярная био-
логия (расшифровка ДНК).


 • Поиск внутренних паттернов. Например, построение пре-
   фиксного дерева.


 • Поиск частных паттернов. Например, поиск подстроки,
   растояния преобразования, наибольшей общей подпосле-
   довательности, совпадения с регулярным выражением.


 • Поиск характеристических паттернов. Например, поиск
   кратных подстрок.

                                                   1
Поиск подстрок

Дано: Текст в виде массива T [1..n] и образец в виде массива
P [1..m], где m ≤ n. Элементы массивов P и T - символы из
конечного алфавита Σ. Говорят, что P встречается в T со
сдвигом s, если 0 ≤ s ≤ n − m и T [s + 1..s + m] = P [1..m].

Найти: Все допустимые сдвиги с которыми образец P встре-
чается в тексте T .




                                                       2
Терминология

Σ∗ - множество всех строк конечной длины, образованных с
помощью символов алфавита Σ.

 - пустая строка.

xy - конкатенация двух строк.

w < x - w является префиксом строки x, то есть ∃y ∈ Σ∗, что
x = wy.

w = x - w является суффиксом строки x, то есть ∃y ∈ Σ∗,
что x = yw.
                                                      3
Лемма о перекрывающихся суффиксах

Пусть x, y, z - строки, для которых выполняются соотноше-
ния x = z и y = z.

Если |x| ≥ |y|, то x = y.

Если |x| ≤ |y|, то y = x.

Если |x| = |y|, то x = y.



                                                    4
Простейший алгоритм поиска подстрок


NaiveStringMatcher(T, P )
1   n ← length[T ]
2   m ← length[P ]
3   for s ← 0 to n − m
4         do if P [1..m] = T [s + 1..s + m]
5               then print(s)




                                              5
Простейший алгоритм поиска подстрок




                                      6
Анализ - простейшего алгоритма поиска подстрок

Наихудший случай: T = an, P = am

T (n) = Θ((n − m + 1)m)

При m = n/2 T (n) = Θ(n2)




                                                 7
Алгоритм Рабина-Карпа

Идея: использовать хэш-функцию опеределенную на множе-
стве строк.

h(S[1..k]) = (S[k] + d(S[k − 1] + . . . + d(S[2] + dS[1]) . . .))mod q,
где d - основание системы, q - модуль.




                                                                 8
Алгоритм Рабина-Карпа

h(P [1..m]) - хэш образца.

{s : h(P [1..m]) = h(T [s..s + m]) ∧ 0 ≥ s ≥ n − m} - множество до-
пустимых сдвигов.

Обозначим ts = h(T [s..s + m]),

тогда ts+1 = (d(ts − T [s + 1]g) + T [s + m + 1]) mod q,

где g ≡ dm−1(mod q)


                                                            9
Алгоритм Рабина-Карпа




                        10
Алгоритм Рабина-Карпа




                        11
Проблема алгоритма Рабина-Карпа

Из равества h(P ) = ts не следует, что P = T [s..s + m].

Решение проверить сдвиг s посимвольным сравнением.




                                                           12
13
Анализ алгоритма Рабина-Карпа

В наихудшем случае T (n, m) = Θ(m) + Θ((n − m + 1)m).

Почему?

В общем случае T (n, m) = O(n) + O(m(v + n/q)), где v - ко-
личество допустимых сдвигов и q - модуль хэш-функции.

Если v = O(1) ∧ q ≥ m ⇒ T (n, m) = O(m + n) = O(n), так как
n≥m


                                                      14
Конечные автоматы

M = (Q, q0, A, Σ, δ)

Q - конечное множество состояний,

q0 ∈ Q - начальное состояние,

A ⊆ Q - конечное множество допустимых состояний,

Σ - конечный входной алфавит,

δ - функция переходов Q × Σ → Q.

                                                   15
Конечные автоматы




φ - функция конечного состояния.

φ( ) = q0

φ(wa) = δ(φ(w), a) для w ∈ Σ∗, a ∈ Σ


                                       16
Конечный автомат для поиска подстрок

σ(x) = max{k : Pk = x}, где Pk < P ∧ |Pk | = k - суффиксная
функция

Пример, P = ab, σ( ) = 0, σ(ccaca) = 1, σ(ccab) = 2.

Правила построения автомата:


1. Q = {0, 1, . . . m}, q0 = 0, A = m


2. δ(q, a) = σ(Pq a)

                                                       17
Конечный автомат для образца P = ababaca




                                           18
Алгоритм поиска подстроки с помощью конечного ав-
томата




                                             19
Алгоритм вычисления функции переходов




                                        20
Анализ применения конечных автоматов для поиска под-
строки

Вычисление функции переходов - T (n, m) = O(m3|Σ|). Суще-
ствуют алгоритмы - T (n, m) = O(m|Σ|)

Поиск подстроки - T (n, m) = Θ(n)




                                                    21
На семинар и рефераты


 • Поиск наибольшей общей последовательности.


 • Алгоритмы поиска подстрок: Кнута-Морриса-Пратта, Бойера-
   Мура, Демелки-Бейза-Ятса-Гоннета, Бойера-Мура-Хоспула,
   Бойера-Мура-Санди, Бойера-Мура-Гелила.


 • Алгоритмы вычисления растояния ммежду строками: Вагнера-
   Фишера, Хешберга, Ханта-Шиманского, Укконена-Майерса.


                                                  22
На семинар и рефераты


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


 • Алгоритмы вычисления периодичности: Крочемора, Мейна-
   Лоренца, Колпакова-Кучерова.


 • Алгоритмы построения суффиксных деревьев: Укконена,
   Вайнера, Мак-Крейга.



                                                 23
Список литературы


 • Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-
   мы: построение и анализ, 2-е издание. - М. : Издатель-
   ский дом “Вильямс”, 2007. сс.1017-1046.


 • Смит, Билл. Методы и алгоритмы вычислений на стро-
   ках. - М.: ООО “И.Д. Вильямс”, 2006.


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

                                                    24

Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"

  • 1.
    Хакасский государственный университетим. Н.Ф. Катанова Структуры и алгоритмы обработки данных Лекция: Поиск подстрок. Николай Гребенщиков, www.grebenshikov.ru
  • 2.
    Задачи на строках Основноеприложение: вычислительная молекулярная био- логия (расшифровка ДНК). • Поиск внутренних паттернов. Например, построение пре- фиксного дерева. • Поиск частных паттернов. Например, поиск подстроки, растояния преобразования, наибольшей общей подпосле- довательности, совпадения с регулярным выражением. • Поиск характеристических паттернов. Например, поиск кратных подстрок. 1
  • 3.
    Поиск подстрок Дано: Текств виде массива T [1..n] и образец в виде массива P [1..m], где m ≤ n. Элементы массивов P и T - символы из конечного алфавита Σ. Говорят, что P встречается в T со сдвигом s, если 0 ≤ s ≤ n − m и T [s + 1..s + m] = P [1..m]. Найти: Все допустимые сдвиги с которыми образец P встре- чается в тексте T . 2
  • 4.
    Терминология Σ∗ - множествовсех строк конечной длины, образованных с помощью символов алфавита Σ. - пустая строка. xy - конкатенация двух строк. w < x - w является префиксом строки x, то есть ∃y ∈ Σ∗, что x = wy. w = x - w является суффиксом строки x, то есть ∃y ∈ Σ∗, что x = yw. 3
  • 5.
    Лемма о перекрывающихсясуффиксах Пусть x, y, z - строки, для которых выполняются соотноше- ния x = z и y = z. Если |x| ≥ |y|, то x = y. Если |x| ≤ |y|, то y = x. Если |x| = |y|, то x = y. 4
  • 6.
    Простейший алгоритм поискаподстрок NaiveStringMatcher(T, P ) 1 n ← length[T ] 2 m ← length[P ] 3 for s ← 0 to n − m 4 do if P [1..m] = T [s + 1..s + m] 5 then print(s) 5
  • 7.
  • 8.
    Анализ - простейшегоалгоритма поиска подстрок Наихудший случай: T = an, P = am T (n) = Θ((n − m + 1)m) При m = n/2 T (n) = Θ(n2) 7
  • 9.
    Алгоритм Рабина-Карпа Идея: использоватьхэш-функцию опеределенную на множе- стве строк. h(S[1..k]) = (S[k] + d(S[k − 1] + . . . + d(S[2] + dS[1]) . . .))mod q, где d - основание системы, q - модуль. 8
  • 10.
    Алгоритм Рабина-Карпа h(P [1..m])- хэш образца. {s : h(P [1..m]) = h(T [s..s + m]) ∧ 0 ≥ s ≥ n − m} - множество до- пустимых сдвигов. Обозначим ts = h(T [s..s + m]), тогда ts+1 = (d(ts − T [s + 1]g) + T [s + m + 1]) mod q, где g ≡ dm−1(mod q) 9
  • 11.
  • 12.
  • 13.
    Проблема алгоритма Рабина-Карпа Изравества h(P ) = ts не следует, что P = T [s..s + m]. Решение проверить сдвиг s посимвольным сравнением. 12
  • 14.
  • 15.
    Анализ алгоритма Рабина-Карпа Внаихудшем случае T (n, m) = Θ(m) + Θ((n − m + 1)m). Почему? В общем случае T (n, m) = O(n) + O(m(v + n/q)), где v - ко- личество допустимых сдвигов и q - модуль хэш-функции. Если v = O(1) ∧ q ≥ m ⇒ T (n, m) = O(m + n) = O(n), так как n≥m 14
  • 16.
    Конечные автоматы M =(Q, q0, A, Σ, δ) Q - конечное множество состояний, q0 ∈ Q - начальное состояние, A ⊆ Q - конечное множество допустимых состояний, Σ - конечный входной алфавит, δ - функция переходов Q × Σ → Q. 15
  • 17.
    Конечные автоматы φ -функция конечного состояния. φ( ) = q0 φ(wa) = δ(φ(w), a) для w ∈ Σ∗, a ∈ Σ 16
  • 18.
    Конечный автомат дляпоиска подстрок σ(x) = max{k : Pk = x}, где Pk < P ∧ |Pk | = k - суффиксная функция Пример, P = ab, σ( ) = 0, σ(ccaca) = 1, σ(ccab) = 2. Правила построения автомата: 1. Q = {0, 1, . . . m}, q0 = 0, A = m 2. δ(q, a) = σ(Pq a) 17
  • 19.
    Конечный автомат дляобразца P = ababaca 18
  • 20.
    Алгоритм поиска подстрокис помощью конечного ав- томата 19
  • 21.
  • 22.
    Анализ применения конечныхавтоматов для поиска под- строки Вычисление функции переходов - T (n, m) = O(m3|Σ|). Суще- ствуют алгоритмы - T (n, m) = O(m|Σ|) Поиск подстроки - T (n, m) = Θ(n) 21
  • 23.
    На семинар ирефераты • Поиск наибольшей общей последовательности. • Алгоритмы поиска подстрок: Кнута-Морриса-Пратта, Бойера- Мура, Демелки-Бейза-Ятса-Гоннета, Бойера-Мура-Хоспула, Бойера-Мура-Санди, Бойера-Мура-Гелила. • Алгоритмы вычисления растояния ммежду строками: Вагнера- Фишера, Хешберга, Ханта-Шиманского, Укконена-Майерса. 22
  • 24.
    На семинар ирефераты • Алгоритмы для поиска по регулярным выражениям. • Алгоритмы вычисления периодичности: Крочемора, Мейна- Лоренца, Колпакова-Кучерова. • Алгоритмы построения суффиксных деревьев: Укконена, Вайнера, Мак-Крейга. 23
  • 25.
    Список литературы •Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит- мы: построение и анализ, 2-е издание. - М. : Издатель- ский дом “Вильямс”, 2007. сс.1017-1046. • Смит, Билл. Методы и алгоритмы вычислений на стро- ках. - М.: ООО “И.Д. Вильямс”, 2006. • Гасфилд, Дэн. Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология. - СПб.: Невский Диалект; БХВ-Петербург, 2003. 24