Строки: суффиксное дерево (11 ноября 2024)
- Бор
- Способы хранения. Array, list, treeSet, hashSet, splaySet. Хеш-таблицу выгодно хранить одну большую.
- Сортировка бором за O(∑i leni × log|Σ|).
- Алгоритм Ахо-Корасик
- Постановка задачи, решение бором в лоб за O(|text|*max|si|)
- Как оптимизировать? Связь с префикс-функцией, определение суффссылок.
- Вычисление суфф ссылок. Порядок вычисления: bfs. Фиктивная вершина.
- Доказательство времени работы O(∑leni): для каждой строки суммарное время вычисления по всем символам строки O(leni).
- Тонкость оценки времени работы: не O(размера бора), а именно O(суммы длин строк)
- Полный автомат: вычисление next[v,char], использование для получения суфф ссылок за O(1). Практика: ленивое вычисление.
- Применение к поиску строки в тексте. Добавляем isEnd[v], доказываем, что всегда найдём строку (s1=ababac, s2=bab : t=ababax).
− Перерыв −
- Суфф дерево
- Сжатый бор. Хранение: Edge next[v,c]; int p[v], pc[v]; или int next[v,c]; Edge p[v]; (информацию про ребро хранится в вершине, куда ведёт ребро)
- Суфф дерево за [T=O(n2), M=O(n)]. Пример: ababb.
- Задача "поиск подстроки в тексте" за O(|s|) суфф деревом. ∀ подстрока ⇔ путь от корня в суффдереве. ⇔ вершина суффдерева. Число вхождений.
- Алгоритм Укконена построения суфф дерева в online
- Простая версия за [T=O(n2), M=O(n)]: храним указатели на концы суффиксов. Пример: ababbaa.
- Суффиксы-листья растут сами. Два варианта реализации: наростить сразу до конца, или хранить ребро [l,&inf;]
- Жизненный цикл суффикса (1) идёт по дереву, (2) разветвился, (3) саморастущий лист.
- Основная лемма: если суффикс не разветвился, то все более короткие тоже не разветвились.
- Алгоритм: храним указатель на самый длинный не разветвившийся, пересчитываем его.
- Суффссылки. Лемма: суффиксная ссылка вершины − вершина
- Подсчёт суфф ссылки. Линейность времени работы.
- Пример построения на строке "ababbaabbc".
- Псевдокод.
- Тонкости реализации
- Фиктивная вершина помогает два раза: всегда есть суфф ссылка, всегда будет (1)-суффикс
- При создании новой суфф ссылки, может оказаться, вершина ещё не создана... но мы уже знаем её номер (наша нумерация − автоинкремент).
- После перехода по суфф ссылке идти вниз нужно, пока не дойдём до вершины, до которой "чуть-чуть не достаём".
− Перерыв −
- Бонус. Задача: пусть даны два корневых дерева, проврить их на изоморфизм
- nlogn : динамика, хеш от сортированного массива детей
- n : динамика, умные хеши от множеств
- n : динамика, но сортрировка детей → перебираем типы детей по возрастанию
- n : хеш-таблица от хеша от вектора → бор от вектора в число
- но в каждой вершине бора нужно хранить только последнее ребро...