Суффиксный бор

Материал из Викиконспекты
Перейти к: навигация, поиск

Суффиксный бор (англ. suffix trie) — бор, содержащий все суффиксы данной строки.

По определению, в суффиксном боре для строки s (где |s|=n) содержатся все строки s[1n],,s[nn]. Заметим, что если в суффиксном боре находится строка s[in], то все её префиксы s[ij] (ijn) уже содержатся в боре.

Применение

Суффиксный бор можно использовать для поиска подстроки в строке s тем же образом, что и для поиска строки в боре. Чтобы бор формально содержал все подстроки s, нужно пометить все его вершины терминальными, при этом корень будет соответствовать пустой строке ε.

Суффиксный бор для строки abbc

Свойства

Суффиксный бор для строки «aaabbb»

Суффиксный бор для строки s:

  • можно использовать для поиска образца p в строке s за время O(|p|),
  • можно построить за время O(n2), последовательно добавив все суффиксы s,
  • имеет порядка n2 вершин в худшем случае. Например, для строки anbn суффиксный бор будет содержать:
1 корневую вершину,
n вершин для суффикса bn,
n вершин для подстроки an, у каждой по n вершин для соответствующего суффикса bn.
  • итого 1+2n+n2=(n+1)2=θ(n2) вершин.

Реализация

Зададим бор его корнем:

struct Trie:
   Node root

По каждому символу будем хранить переход в соответствующую вершину:

struct Node:
   map<char, Node> children

При добавлении узла будем идти вниз по сыновьям и добавлять их, если необходимо:

function add(s : string):
   Node current = root
   for c in s
      if current.children[c] == [math]\varnothing[/math]
         current.children[c] = Node()
      current = current.children[c]

Чтобы построить суффиксный бор для некоторой строки, последовательно добавим в пустой бор все её суффиксы:

function build(s : string):
   root = Node()
   int n = s.size
   for i = 0 to n - 1
      add(s[i..n])

Оценки использования памяти

Пусть мы построили суффиксный бор для строки sΣ (|s|=n). Из третьего свойства следует, что если хранить переходы суффиксного бора из каждой вершины как массив размера |Σ| (по каждому символу — переход), то потребуется O(n2|Σ|) памяти. Однако, заметим, что число ветвлений в не превышает числа листьев, что, в свою очередь, не превышает количества суффиксов. Количество суффиксов — n, а значит число вершин, из которых ведет больше одного перехода, O(n). Поэтому, если в неветвящихся вершинах хранить только символ перехода и ребенка, то можно получить оценку O(n2+n|Σ|). Улучшением суффиксного бора, расходующим всего O(n|Σ|) памяти, является сжатое суффиксное дерево.

См. также

Источники информации

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