Изменения

Перейти к: навигация, поиск

Дерево палиндромов

571 байт добавлено, 21:08, 7 июня 2016
Описание структуры
== Описание структуры ==
Дерево палиндромов состоит из вершин. Каждая вершина , каждая из которых соответствует палиндрому. Все вершины соответствуют разным палиндромам. Через <tex>u'</tex> будем обозначать строку, которой соответствует вершина <tex>u</tex>.Ребра дерева палиндромов ориентированные и помечены символами. Ребро с символом <tex>x</tex> ведет из вершины <tex>u</tex> в вершину <tex>v</tex> тогда и только тогда, когда <tex>v'=xu'x</tex>.
[[Файл:palindrome_tree_nodes.png|Пример четырех вершин дерева палиндромов|border]] [[Файл:palindrome_tree_edge.png|В данном примере мы получаем палиндром aba добавлением символа a к обоим сторонам палиндрома b|border]]
Также в дереве палиндромов присутствуют ''суффиксные ссылки''. Суффиксная ссылка из вершины <tex>u</tex> ведет в вершину <tex>w</tex>, если <tex>w'</tex> является наибольшим суффиксом строки <tex>u'</tex>.
[[Файл:palindrome_tree_suffix_link.png|Мы добавили суффиксную ссылку (пунктирная линия) из aba к a потому, что a является наибольшим паллиндромом-суффиксом строки aba|border]]
Стоит обратить внимание на то, что название структуры данных выбрано не совсем удачно. На самом деле структура представляет из себя два дерева {{---}} одно для палиндромов четной длины, другое для палиндромов нечетной длины. Обозначим корни этих деревьев за <tex>root_{even}</tex> и <tex>root_{odd}</tex> соответственно.
 
Помимо вершин и ребер в дереве палиндромов также присутствуют ''суффиксные ссылки''. Суффиксная ссылка из вершины <tex>u</tex> ведет в вершину <tex>w</tex> тогда и только тогда, когда <tex>w'</tex> является наибольшим суффиксом строки <tex>u'</tex>. При этом важно понимать, что суффиксная ссылка из вершины одного дерева может вести как в то же, так и в другое дерево.
Название структуры данных выбрано не совсем удачно, т[[Файл:palindrome_tree_suffix_link.png|Мы добавили суффиксную ссылку (пунктирная линия) из aba к. на самом деле она представляет из себя два дереваa потому, однако суффиксные ссылки могут вести как в то же, так и в другое дерево. Это сделано для удобства реализации. Также в целях экономии памяти мы не будем хранить для каждой вершины соответствующую ей строкучто a является наибольшим паллиндромом-палиндром. Вместо этого мы будем хранить только длину палиндрома.суффиксом строки aba|border]]
Итак, у нас будет два дерева. Одно дерево для палиндромов четной длины, другое {{---}} для палиндромов нечетной длины. Каждое дерево будет иметь фиктивный корень.
Обозначим корни четного и нечетного дерева соответственно <tex>root_{even}</tex> и <tex>root_{odd}</tex>.
<tex>root_{odd}</tex> будет соответствовать фиктивному палиндрому длины <tex>При реализации в целях экономии памяти мы не будем хранить для каждой вершины соответствующую ей строку-1</tex>палиндром. Это нужно для того, чтобы не обрабатывать отдельно случай добавления палиндрома длины 1Этот подход был бы неэффективным с точки зрения памяти. Теперь каждый раз при добавлении новой вершины <tex>u</tex> к вершине <tex>v</tex> Вместо этого мы будем просто указывать ее хранить только длину равной <tex>u.len = v.len + 2</tex>палиндрома (и для некоторых задач позицию палиндрома в строке).
Итак, структура будет состоять из двух деревьев и, соответственно, двух корней. Для удобства реализации каждый корень будет соответствовать фиктивной строке.* <tex>root_{odd}</tex> будет соответствовать палиндрому длины <tex>-1</tex>. Это нужно для того, чтобы не обрабатывать отдельно случай добавления палиндрома длины 1. Теперь каждый раз при добавлении новой вершины <tex>u</tex> к вершине <tex>v</tex> мы будем просто указывать ее длину равной <tex>u.len = v.len + 2</tex>.* <tex>root_{even}</tex> будет соответствовать фиктивному палиндрому длины 0.
Также направим суффиксные Суффиксные ссылки обоих корней будут вести к вершине <tex>root_{odd}</tex>.
== Построение ==
165
правок

Навигация