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

Алгоритмы программирования и

структуры данных

Поиск подстрок
Алгоритмы программирования и структуры данных
Поиск подстрок

Поиск подстрок 3.
Алгоритм Кнута — Морриса — Пратта
Название Вашего доклада

Вспомним простой алгоритм

.BABCAABABC..
ABCAABD...
ABCAAB...
ABCAA...
ABCA...
ABC...
AB...
A...
3
Название Вашего доклада

Большие сдвиги

.BABCAABABC..
ABCAABD...
ABC...
A...

4
Название Вашего доклада

Префикс-функция

pref(S) = максимальный по длине


собственный префикс строки S,
являющийся также ее суффиксом

pref(“ABABAB”) = “ABAB”
pref(“ABCAAB”) = “AB”
pref(“AB”) = “”
5
Название Вашего доклада

Большие сдвиги с использованием


префикс-функции

.BABCAABABC..
ABCAABD...
ABC...
A...

6
Название Вашего доклада

Префикс-функция для префиксов

• Посчитаем префикс-функцию для всех


префиксов строки P.
• Префикс-функция от префикса – тоже
префикс
• Достаточно хранить ее длину
• p[i] = |pref(P[0..i-1]))|
7
Название Вашего доклада

Пример

ABACABABACB
p -00101232340
p[0] p[n]

8
Название Вашего доклада

Алгоритм поиска подстроки Т

Состояние
i
S .BABCAABABC..
T ABCAAB...
j

9
Название Вашего доклада

Алгоритм поиска подстроки Т

Случай 1. S[i] == T[j]


i
S .BABCAABABC..
T ABCAABA...
j

i++
j++
10
Название Вашего доклада

Алгоритм поиска подстроки Т

Случай 2. S[i] != T[j], j>0


i
S .BABCAABABC..
T ABCAABD...
ABC...
j

j = p[j]

11
Название Вашего доклада

Алгоритм поиска подстроки Т

Случай 3. S[i] != T[j], j=0


i
S .BABCAABBAB..
T ABCAABD...
ABC...
A...
A . . i++
j
12
Название Вашего доклада

Код
find(s, t: String):
i = 0, j = 0
while i < n && j < m:
if s[i] == t[j]:
i++, j++
else:
if j > 0:
j = p[j]
else:
i++
if j == m:
return i – m
else:
return -1
Время работы: O(N + M) 13
Название Вашего доклада

Алгоритм построения массива Р

Состояние
i
T .BABCAABABC..
T ABCAAB...
j

14
Название Вашего доклада

Алгоритм построения массива Р

Случай 1. T[i] == T[j]


i
T .BABCAABABC..
T ABCAABA...
j

p[i+1] = j+1
i++
j++
15
Название Вашего доклада

Алгоритм построения массива Р

Случай 2. T[i] != T[j], j>0


i
T .BABCAABABC..
T ABCAABD...
ABC...
j

j = p[j]

16
Название Вашего доклада

Алгоритм построения массива Р

Случай 3. T[i] != T[j], j=0


i
T .BABCAABBAB..
T ABCAABD...
ABC...
A...
A . . p[i+1] = 0
j i++
17
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
Aj B A C A B A B A C B
p -0----------
p[i+1] = 0
i++
18
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
Aj B A C A B A B A C B
p -00---------
p[i+1] = j+1
i++
j++
19
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A Bj A C A B A B A C B
p -001--------
j = p[j]

20
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
Aj B A C A B A B A C B
p -001--------
p[i+1] = 0
i++
21
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
Aj B A C A B A B A C B
p -0010-------
p[i+1] = j+1
i++
j++
22
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A Bj A C A B A B A C B
p -00101------
p[i+1] = j+1
i++
j++
23
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A B Aj C A B A B A C B
p -001012-----
p[i+1] = j+1
i++
j++
24
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A B A Cj A B A B A C B
p -0010123----
j = p[j]

25
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A Bj A C A B A B A C B
p -0010123----
p[i+1] = j+1
i++
j++
26
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A B Aj C A B A B A C B
p -00101232---
p[i+1] = j+1
i++
j++
27
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A B A Cj A B A B A C B
p -001012323--
p[i+1] = j+1
i++
j++
28
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
A B A C Aj B A B A C B
p -0010123234-
j = p[j]

29
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
Aj B A C A B A B A C B
p -0010123234-
p[i+1] = 0
i++
30
Название Вашего доклада

Алгоритм построения массива Р

Пример
i
ABACABABACB
Aj B A C A B A B A C B
p -00101232340
p[i+1] = 0
i++
31
Название Вашего доклада

Код
buildP(t: String):
i = 1, j = 0
while i < n:
if t[i] == t[j]:
p[i + 1] = j + 1
i++, j++
else:
if j > 0:
j = p[j]
else:
p[i + 1] = 0
i++
Время работы: O(N) 32