7. Суффиксы слова T = “banana :
T [1..] = “banana
T [2..] = “anana
T [3..] = “nana
T [4..] = “ana ’
T [5..] = “na
T [6..] = “a
7 / 70
8. Суффиксное дерево: определение
СД слова T длины n — ордерево, у которого n листьев
Каждая внутренняя вершина имеет хотя бы двух сыновей, на
каждом ребре написано подслово T
Метки ребер, выходящих из одной вершины, начинаются с
разных букв
Вдоль пути от корня до листа i написано слово T [i..]$
8 / 70
9. Суффиксное дерево слова T = “banana
3
T[3..]$ = "nana$"
5
T[5..]$ = "na$"
1
na$
T[1..]$ = "banana$"
$
na
banana$
a
na
$
na
6
T[6..]$ = "a$"
$
$
2
4
T[2..]$ = "anana$"
T[4..]$ = "ana$"
9 / 70
10. Память = O(n):
≤ 2n − 1 вершин
≤ 2n − 2 ребер
В каждой вершине массив: буква → сын
Время построения = O(n)
10 / 70
11. Поиск вхождений слова P в слово T
i — позиция вхождения слова P в T ⇔ T [i..] начинается с P
Пусть v — конец пути из корня с меткой P
i — позиция вхождения слова P в T ⇔ лист i находится в
поддереве v
Алгоритм: найти v, перечислить листы
11 / 70
12. Найти вхождения P = “an в T = “banana
3
T[3..]$ = "nana$"
5
T[5..]$ = "na$"
1
na$
T[1..]$ = "banana$"
$
na
banana$
a
na
$
na
$
6
T[6..]$ = "a$"
$
2
4
T[2..]$ = "anana$"
T[4..]$ = "ana$"
Время: O(|P | + occ)
12 / 70
13. Поиск наибольшего общего подслова
Даны слова T и S суммарной длины n. Найти максимальное
по длине слово, входящее и в T , и в S.
Дональд Кнут, 1970: для решения требуется Ω(n log n)
времени
Суффиксные деревья — O(n) времени
13 / 70
14. Поиск наибольшего общего подслова
Обобщенное СД содержит суффиксы слов T1 и T2
Листы покрашены в два цвета
Метка вершины входит в T1 и в T2 ⇔ в ее поддереве есть
листы обоих цветов
14 / 70
15. Найти наибольшее общее подслово T1 = “banana и T2 = “cane
e#
4
e#
T2[4..]# = "e#"
3
a
5
T1[5..]$ = "na$"
T1[1..]$ = "banana$"
2
T2[2..]# = "ane#"
$
T [1..]# = "cane#"
cane#
banana$
1
n
T1[3..]$ = "nana$"
1
na$
T2[3..]# = "ne#"
3
2
a
n
$
e#
a
na
$
6
T1[6..]$ = "a$"
$
2 T [2..]$ = "anana$"
1
4 T [4..]$ = "ana$"
1
Время: O(n)
15 / 70
16. Поиск наибольшего общего подслова
Даны слова T1 , T2 , . . . , Tm суммарной длины n. Найти
максимальное по длине слово, входящее в ≥ d из этих слов.
Обобщенное СД содержит суффиксы слов T1 , T2 , . . . , Tm
Листы покрашены в m цветов
Метка вершины входит в ≥ d слов ⇔ в ее поддереве есть
листы d цветов
16 / 70
17. Найти макс. по длине слово, входящее в хотя бы два слова из
T1 = “banana , T2 = “cane и T3 = “bank
e#
e#
3
4
n cane#
3
na$
a
$
3
k@
1
5
ban ana$
1
k@
k@
a
4
1
n
2
e#
$
a
k@
6
na
$
2
$
2
4
Подзадача: найти количество цветов в каждом поддереве
17 / 70
18. Задача LCA (самый глубокий общий предок)
lca(u,v)
u
v
O(n) памяти, O(1) времени на поиск lca(u, v)
18 / 70
19. LCAc (x) — # вершин в Tx ,
являющихся LCA двух
последовательных листьев
цвета c
# листьев цвета c в
поддереве x - LCAc (x) = 1
c # листьев цвета c в Tx LCAc (x) = # цветов в
поддереве x!
c # листьев цвета c в Tx =
# листьев в поддереве x
c
LCAc (x)?
Лукас Чи Квонг Хьюи, 1992: O(n) времени, O(n) памяти
⇒ Задача о наибольшем общем подслове может быть решена
за O(n) времени, O(n) памяти
19 / 70
22. Поиск документов, содержащих слово P
Даны слова (документы) T1 , T2 , . . . , Tm суммарной длины n.
Найти документы, содержащие слово P .
Обобщенное СД содержит суффиксы слов T1 , T2 , . . . , Tm .
Листы покрашены в m цветов.
Пусть v — конец пути из корня с меткой P .
Документ Ti содержит P ⇔ в поддереве v есть цвет i
22 / 70
23. Документы T1 = banana, T2 = cane, T3 = bank, слово P = an.
e#
e#
3
4
n cane#
3
na$
a
$
3
k@
1
T
5
ban ana$
1
k@
k@
a
4
1
n
2
e#
$
a
k@
6
na
$
2
$
2
4
23 / 70
24. Документы T1 = banana, T2 = cane, T3 = bank, слово P = an.
4
6
2
4
2
2
1
1
1
3
5
3
3
4
24 / 70
25. Дан массив цветов C длины n
Выдать все различные значения в C[ , r]
P rev[k] — предыдущая ячейка массива C цвета C[k]
k ∈ [ , r] — первая ячейка, содержащая цвет
C[k] ⇔ P rev[k] <
Как находить k ∈ [ , r] т.ч. P rev[k] < ?
25 / 70
26. Найти ячейку P rev[k] ∈ P rev[ , r] содержащую минимальное
значение (O(1) времени)
Если P rev[k] < , выдать C[k] и запустить алгоритм для
P rev[ , k − 1] и P rev[k + 1, r]
Время работы = O(кол-во цветов)
26 / 70
27. Документы T1 = banana, T2 = cane, T3 = bank, слово P = an.
e#
e#
4
n cane#
3
na$
3
a
$
3
k@
1
T
5
ban ana$
1
k@
k@
a
4
1
n
2
e#
$
a
k@
6
na
$
2
$
2
4
На поиск документов, содержащих P , требуется O(|P | + output)
времени и O(n) памяти
[Муту Мутукришнан, 2002]
27 / 70
29. Лекция 1
Суффиксное дерево слова длины n занимает O(n) памяти
Время поиска вхождений P составляет
O(|P | + кол-во вхождений)
Время поиска документов, содержащих P , составляет
O(|P | + output)
29 / 70
30. Лекция 1: Определение и приложения.
Лекция 2: Построение.
[D. Breslauer, G. Italiano. Near real-time suffix tree construction
via the fringe marked ancestor problem. Best paper SPIRE 2011!]
Лекция 3: Когда дерево является суффиксным?
30 / 70
32. Алгоритмы с линейным временем работы
Алгоритм Питера Вайнера, 1973
Алгоритм Эварда МакКрейта, 1976
Алгоритм Эско Укконена, 1996
Алгоритм Мартина Фарах-Колтона, 1997
32 / 70
33. T = “banana
Алгоритм Питера Вайнера, 1973
$
$
na
a$
a$
na
na$
$
na
a
na
a
$
na
$
na$
$
na$
$
na
banana$
a
a
$
na
$
$
na
$
na
na
$
$
$
na
$
banan
an
an
banan
an
an
na
$
na
banana
an
an
a
$
na
bana
an
a
na
n
ban
an
na
n
ba
a
na
n
b
na
Алгоритм Эско Укконена, 1996
banana$
banana
a
na
$
na
$
$
O(1) амортизированного времени на букву!
33 / 70
34. Цви Копелович и др., 2005 — O(log n) времени на букву
Дэни Бреслауер, Джузеппе Итальяно, 2011 — O(log log n)
времени на букву (сегодня)
Открытый вопрос — O(1) времени на букву
34 / 70
35. Задача о граничных помеченных предках
По вершине x найти ее
ближайшего помеченного
родственника
Пометить вершину x (родитель
должен быть помечен)
Добавить вершину x на ребро
(u, v)
Добавить лист x как сына
вершины u
Линейная память, O(log logn) времени на операцию
Задача о помеченном предке (общий случай) — Ω(log n/ log log n)
времени на операцию!
35 / 70
36. Задача LCA (самый глубокий общий предок)
Найти lca(u, v)
Добавить вершину x на ребро
(u, v)
lca(u,v)
u
v
Добавить лист x как сына
вершины u
Линейная память, O(1) времени на операцию
[Коул, Харихаран, 2005]
36 / 70
39. 1
2
4
3
6
5
7
1
2
1
3
8
5
7
5
8
5
3
6
3
1
4
T (i) — момент первого появления i в обходе
Задача: по вершине j найти помеченную вершину
i = prevm (j) с T (i) ≤ T (j), T (i) макс.
Лемма: lca(j, prevm (j)) — граничный помеченный предок j
(на доске)
37 / 70
42. Как помечаются вершины и ищется prevm (i)? Для списка
поддерживаем структуру Диеца и Рамана (1991) со следующими
операциями:
Добавить элемент x после элемента y
Пометить элемент x
Найти помеченного предшественника x
O(log log n) времени на операцию
40 / 70
43. Задача о граничных помеченных предках
По вершине x найти ее
ближайшего помеченного
родственника
Пометить вершину x (родитель
должен быть помечен)
Добавить вершину x на ребро
(u, v)
Добавить лист x как сына
вершины u
Линейная память, O(log logn) времени на операцию
41 / 70
46. Суффиксные ссылки Вайнера
Wn(u)
3
na
Метка u равна L, метка v равна aL
$
na
5
banana$
1
a
u
na
$
6
na
v
$
2
Wb(v)
Wa (u) = v, если v —
вершина
(”зрелые” ссылки)
Wa (u) — конец ребра
содержащего v, если v —
позиция на ребре
(”непоспевшие” ссылки)
4
44 / 70
47. Два свойства суффиксных ссылок
Если для вершины u определена Wa (u), то и для любого ее
предка v определена Wa (v)
Если v = Wa (u), где (u, v) — зрелая ссылка, то
depth(u) ≥ depth(v) − 1
45 / 70
48. Добавление T [i − 1..]$. Случай 1.
T[i-1]
u
T[i..]$
V
T[i-1]
V
u
T[i-1..]$
T[i..]$
46 / 70
49. Добавление T [i − 1..]$. Случай 2.
T[i-1]
u'
u
T[i..]$
T[i-1]
u'
v'
v''
u
v'
v
v''
T[i-1..]$
T[i..]$
47 / 70
50. Количество шагов в случае 1 ограничено
depth(T [i..]$) − depth(u) ≤ depth(T [i..]$) − depth(T [i − 1..]$) + 1
Количество шагов в случае 2 ограничено
depth(T [i..]$) − depth(u ) ≤ depth(T [i..]$) − depth(T [i − 1..]$)
Суммируя, получаем: время работы = O(n)
48 / 70
51. Количество шагов в случае 1 ограничено
depth(T [i..]$) − depth(u) ≤ depth(T [i..]$) − depth(T [i − 1..]$) + 1
Количество шагов в случае 2 ограничено
depth(T [i..]$) − depth(u ) ≤ depth(T [i..]$) − depth(T [i − 1..]$)
Суммируя, получаем: время работы = O(n)
Небольшая неточность: глубины T [i..]$ в СД T [i..] и СД T [i − 1..]
могут немного отличаться. К счастью, не более, чем на 1!
48 / 70
52. O(1) амортизированного времени на букву. Как получить
O(log log n) времени на букву?
Для каждой буквы a алфавита помечаем вершины u, для
которых определены Wa (u)
u находим с помощью задачи о помеченных граничных
предках
Новые вершины и новые зрелые ссылки создаем сразу
Как поддерживать непоспевшие ссылки?
49 / 70
53. Непоспевшие ссылки — деамортизация
T[i-1]
u'
u
T[i-1]
u'
v'
v''
T[i..]$
u
v'
v
v''
T[i-1..]$
T[i..]$
depth(u ) ≥ depth(v ) − 1
Обрабатываем две ссылки из стека для каждого i
Глубины вершин в стеке, для которых надо обновить ссылки,
упорядочены по возрастанию
Суффиксное дерево слова T длины n может быть построено с
использованием O(log log n) времени на букву и линейной
памяти. [Дэни Бреслауер, Джузеппе Итальяно, 2011]
50 / 70
55. Лекция 1: Определение и приложения.
Лекция 2: Построение
Лекция 3: Когда дерево является суффиксным?
[Tomohiro I, Shunsuke Inenaga, Hideo Bannai, Masayuki Takeda.
Inferring Strings from Suffix Trees and Links on a Binary
Alphabet. 2011]
52 / 70
58. (a)
(b)
Дерево (a) является суффиксным деревом слова ababa, дерево (b)
не является суффиксным деревом.
55 / 70
59. Похожие задачи
Массив границ
[Франек и др., 2002]
[Дюваль и др., 2005]
Ориентированный
ациклический граф слова
[Баннаи и др., 2003]
Суффиксный массив
[Дюваль и Лефевр, 2002]
[Баннаи и др., 2003]
[Шурман и др., 2005]
[Кучеров и др., 2013]
Функция сдвига в
алгоритме КМП
[Гаврычовски и др., 2010]
Массив LPF
[Хе и др., 2011]
Массив покрытий
[Крошмор и др., 2010]
Решение обратных задач приводит к лучшему пониманию
структур данных!
56 / 70
60. Суффиксные ссылки
3
T[3..]$ = "nana$"
5
T[5..]$ = "na$"
1
na
T[1..]$ = "banana$"
$
na
banana$
$
a
na
$
na
6
T[6..]$ = "a$"
$
2
4
T[2..]$ = "anana$"
T[4..]$ = "ana$"
S(u) = v, если метка u равна aL, а метка v равна L
57 / 70
61. Дано дерево, суффиксные ссылки, первые буквы меток.
Существует ли такое суффиксное дерево?
.$
.$
..
b.
.
b.
.
..
.
..
..
.$
.
.$
.
a.
a.
..
b.
.
..
a. . .
a. . .
.$
..
a. . .
.$
..
b.
a. . .
..
Дерево слева — да (abaaa), дерево справа — нет
58 / 70
62. Необходимые свойства
3
T[3..]$ = "nana$"
5
T[5..]$ = "na$"
1
na
T[1..]$ = "banana$"
$
na
banana$
$
a
na
$
na
6
T[6..]$ = "a$"
$
2
4
T[2..]$ = "anana$"
T[4..]$ = "ana$"
Из любой внутренней вершины в корень ведет единственный
путь, состоящий из суффиксных ссылок
(u, v) — суффиксная ссылка, u — сын u, на ребре (u, u )
написана буква a ⇒ у v есть сын v : на ребре (v, v ) написана
буква a, а конец суффиксной ссылки, выходящей из u ,
принадлежит поддереву с корнем в v
59 / 70
63. Дано дерево, суффиксные ссылки, первые буквы меток.
Существует ли такое суффиксное дерево?
.$
.$
..
b.
.
b.
.
..
.
..
..
.$
.
.$
.
a.
a.
..
b.
.
..
a. . .
a. . .
.$
..
a. . .
.$
..
b.
a. . .
..
Дерево слева — да (abaaa), дерево справа — нет
60 / 70
64. Суффиксный граф
⊥
?
(2, 0)
.
(1, 0)
b.
a. . .
..
..
(0, 1)
(1, 1)
y1
.
..
.
a.
.$
(1, 0)
.$
(0, 1)
(0, 1)
. . .a
(0, 2)
. . .a
.$
. . .a
(1, 0)
b.
.
a. . .
..
x
y2
(x) — количество листьев y: суффиксная ссылка из parent(y)
ведет в parent(x) и первые буквы на ребрах (parent(x), x) и
(parent(y), y) равны
d(x) = |Lx | −
y∈Vx
(y)
∀x d(x) ≥ 0
61 / 70
65. Суффиксный граф
⊥
?
(2, 0)
.$
(1, 0)
b.
.
a. . .
..
⊥
.
(1, 0)
b.
.
a. . .
..
.$
.$
(1, 0)
(0, 1)
(1, 1)
.
..
(1, 0)
(0, 2)
(0, 1)
.
a.
EG =
(1, 0)
.
(1, 1)
(0, 1)
(2, 0)
(1, 0)
(0, 2)
(0, 1)
(0, 1)
(0, 1)
{(y, x)k | (y, x) ∈ E, k = d(x)} ∪
(1)
{(y, x) | y — лист, вносящий вклад в (x)}
(2)
62 / 70
66. Свойства
⊥
(2, 0)
(1, 0)
(1, 0)
(1, 0)
(0, 2)
(0, 1)
(1, 1)
(0, 1)
(0, 1)
Суффиксный граф —- Эйлеров граф
x — лист ⇒ (x) = 1 − d(x) ⇒ в x входит одно ребро, выходит
одно ребро.
x — внутренняя вершина ⇒ входит (x) + d(x) ребер, выходит
z∈children(x) d(x)
63 / 70
67. Основная лемма
Пусть выполняются три условия:
Из любой внутренней вершины в корень ведет единственный
путь, состоящий из суффиксных ссылок
(u, v) — суффиксная ссылка, u — сын u, на ребре (u, u )
написана буква a ⇒ у v есть сын v : на ребре (v, v ) написана
буква a, а конец суффиксной ссылки, выходящей из u ,
принадлежит поддереву с корнем в v
∀x d(x) ≥ 0
1) Дерево является суффиксным тогда и только тогда, когда
суффиксный граф содержит цикл, проходящий через корень и все
листы дерева.
2) T [i] — первая буква на пути от корня до листа с номером i
64 / 70
68. ⊥
?
(2, 0)
(1, 0)
.$
⊥
.
b.
.
a. . .
.$
.$
(1, 0)
(0, 2)
(0, 1)
(1, 0)
a.
(0, 1)
(1, 1)
..
..
(1, 0)
.
(1, 1)
(0, 1)
(2, 0)
(1, 0)
(0, 2)
..
(1, 0)
b.
.
a. . .
..
(0, 1)
(0, 1)
(0, 1)
T[1] = a, T[2] = b, T[3] = a, T[4] = a, T[5] = a ⇒ T = abaaa
65 / 70
69. Размер суффиксного графа — O(n)
⊥
(2, 0)
(1, 0)
(1, 0)
(1, 0)
(0, 2)
(0, 1)
(1, 1)
(0, 1)
(0, 1)
sldepth(x) — длина пути по суффиксным ссылкам из x в
корень
y — родитель x ⇒ sldepth(x) ≥ sldepth(y) + 1
(u, v) образовано из ребра ⇒ sldepth(v) − sldepth(u) < 0
(u, v) образовано из суффиксной ссылки ⇒
sldepth(v) − sldepth(u) = 1
66 / 70
70. Бинарный алфавит. Восстановление первых букв.
Простые наблюдения:
Если (u, v) — суфф. ссылка и степени u, v равны, то первые
буквы на выходящих из них ребрах совпадают
Степень любой вершины 2 или 3
Если у вершины три сына, то на ребре к первому сыну
написан $
Если у вершины u три сына, то у вершины S(u) три сына
67 / 70
71. Бинарный алфавит. Восстановление первых букв.
Не такие простые наблюдения:
Если у вершины u три сына, то у вершины S(u) три сына
Две вершины степени 3 не могут ссылаться на одну и ту же
вершину
Существует ≤ 1 вершины, на которую не ссылается другая
вершина степени 3
На эту вершину может ссылаться ≤ 2 вершины степени 2
Если вершина степени 2 ссылается на любую другую вершину
степени 3, то для нее первые буквы определены
67 / 70
72. Бинарный алфавит. Восстановление первых букв.
Вариативность только в первых буквах вершин степени 2,
ссылающихся на последнюю вершину степени 3:
(a, b), (a, b)
($, a), (a, b)
($, b, a, b)
(a, b), ($, a)
(a, b), ($, b)
⇒ 5 возможных разметок
67 / 70
73. Лекция 3: Когда дерево является суффиксным?
Когда дерево является суффиксным деревом?
Бинарный алфавит
Когда дерево является неявным суффиксным деревом?
68 / 70
75. Литература
Дэн Гасфилд. Строки, деревья и последовательности в
алгоритмах.
Peter Weiner. Linear pattern matching algorithms.
Lucas Chi Kwong Hui. Color set size problem and applications to
string matching.
S. Muthu Muthukrishnan. Efficient Algorithms for Document
Retrieval Problems.
Dany Breslauer, Guiseppe Italiano. Near real-time suffix tree
construction via the fringe marked ancestor problem.
Tomohiro I, Shunsuke Inenaga, Hideo Bannai, Masayuki Takeda.
Inferring strings from suffix trees and links on a binary alphabet.
70 / 70