Опубликован: 08.04.2009 | Уровень: для всех | Доступ: платный
Лекция 10:

Сопоставление с образцом

Подведем итоги. Рассмотренный способ хранения деревьев позволяет (для фиксированного слова Y )

  • создать дерево из одного корня [ O(1) ];
  • найти отца любой вершины (кроме корня) [ O(1) ];
  • узнать пометку любой вершины (кроме корня), то есть пометку ведущего к ней ребра [ O(1) ];
  • пройти из любой позиции p вдоль любого слова w, если заранее известно, что мы не выйдем из дерева; результатом является позиция q в дереве, для которой s(q)=s(p)+w [ O (число ребер на пути)];
  • добавить слово w, начав с позиции p ; если при этом слово w является подсловом Y, а в дереве нет позиции q, для которой s(q)=s(p)+w, то дерево меняется и такая позиция q создается (она будет листом) [ O (число букв в w, не вошедших в l(q) ];
  • наконец, для любого слова X можно выяснить, найдется ли в дереве позиция q, для которой s(q)=X [ O(|X|) ].

В квадратных скобках указано число действий при выполнении соответствующих операций.

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

Начнем с полного (не сжатого) суффиксного дерева для слова Y. Каждой его вершине (кроме корня) отвечает некоторое непустое подслово слова Y. Если мы отрежем у этого подслова последнюю букву, то в дереве спустимся на один шаг к корню. Но что будет, если мы отрежем первую букву? Снова получится подслово, но оно уже будет совсем в другом месте дерева.

Вот как выглядят эти переходы в нашем примере (отрезание первой буквы соответствует пунктирной стрелке):


Эти стрелки мы будем называть суффиксными ссылками, поскольку они соответствуют переходу от слова к его суффиксу на единицу меньшей длины. Они определены для всех вершин, кроме корня.

Формально можно сказать так. Пусть w' означает слово w без первой буквы ( w' определено для любого непустого слова w ). Тогда суффиксная ссылка ведет из вершины p в вершину q, если s(q)=s(p)' (напомним, что s(u) - слово, соответствующее вершине u ).

10.8.5. Как связаны суффиксные ссылки двух соседних вершин (отца и сына)?

Ответ. Они указывают на соседние вершины, и буква на соединяющем их ребре та же самая.

10.8.6. Доказать, что при переходе к сжатому суффиксному дереву ссылки по-прежнему идут из вершины в вершину (а не внутрь ребер).

Решение. В самом деле, по нашему предположению последняя буква слова больше в нем не встречается, поэтому из листа ссылка ведет в лист. А если вершина (отличная от корня) является точкой ветвления, то соответствующее ей слово s встречается с различными буквами после него. Другими словами, для некоторых букв a и b слова sa и sb являются подсловами слова Y. Отрезав от них первую букву, получим слова s'a и s'b, которые также являются подсловами слова Y, поэтому и s' является точкой ветвления.

Вот что получится для нашего примера:


Теперь мы уже готовы к изложению алгоритма МакКрейта. Сжатое суффиксное дерево строим постепенно, добавляя к нему суффиксы по мере уменьшения их длины. Обозначим через Y_i суффикс, начинающийся с i -ой буквы слова Y. (Таким образом, Y_1=Y, а Y_m состоит из одной буквы.) После i шагов построения наше дерево будет хранить Y_1,\ldots,Y_i.

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

Решение. В самом деле, суффиксная ссылка из листа Y_j ведет в лист Y_{j+1}, и потому ей есть куда вести. Рассмотрим теперь внутреннюю вершину v, не являющуюся отцом последнего листа. Пусть в ней разветвляются два пути в листья Y_j и Y_k. Без ограничения общности можно считать, что j,k<i (если один из путей ведет в Y_i, то его можно заменить другим, ведь вершина v по предположению не последняя развилка на этом пути). Отрезав от этих путей первый символ, получим пути в листья Y_{j+1} и Y_{k+1} ; эти пути присутствуют в дереве (поскольку j+1 и k+1 не превосходят i ), а точка их развилки будет концом суффиксной ссылки вершины v.

Суффиксные ссылки для листьев нам не понадобятся, и вычислять мы их не будем, а для всех остальных вершин дерева мы их будем вычислять и хранить. Более точно, после i шагов алгоритма

  • в дереве хранятся слова Y_1,\ldots Y_i (и все их начала);
  • адрес листа, соответствующего последнему добавленному суффиксу ( Y_i ) хранится в переменной \textit{last} ;
  • для всех внутренних вершин дерева, кроме, быть может, отца вершины \textit{last}, хранится правильная суффиксная ссылка.
Татьяна Новикова
Татьяна Новикова
Россия, Пошатово
Artem Bardakov
Artem Bardakov
Россия