Бор — различия между версиями
ExileHell (обсуждение | вклад) (→Построение) |
ExileHell (обсуждение | вклад) (→Построение) |
||
| Строка 22: | Строка 22: | ||
Поскольку на каждую вершину приходится <tex>O(k)</tex> памяти, то использование памяти есть <tex>O(nk)</tex>. | Поскольку на каждую вершину приходится <tex>O(k)</tex> памяти, то использование памяти есть <tex>O(nk)</tex>. | ||
| − | Потребление памяти можно уменьшить до линейного | + | Потребление памяти можно уменьшить до линейного <tex>O(n)</tex>, но за счёт увеличения асимптотики работы до <tex>O(n \log k)</tex>. Для этого достаточно хранить переходы <tex>next</tex> не массивом, а отображением <tex>map</tex><tex><</tex><tex>\mathtt{char}\ , \mathtt{int}\ </tex><tex>></tex>. |
Бор позволяет решать задачу поиска подстроки в строке, если построить его на множестве суффиксов исходной строки. Такой бор называется [[Суффиксный бор | суффиксным бором]], который позволяет найти количество различных подстрок данной строки и решить другие задачи за линейное время, если его оптимизировать. Такая оптимизация называется [[Сжатое суффиксное дерево | сжатым суффиксным деревом]]. | Бор позволяет решать задачу поиска подстроки в строке, если построить его на множестве суффиксов исходной строки. Такой бор называется [[Суффиксный бор | суффиксным бором]], который позволяет найти количество различных подстрок данной строки и решить другие задачи за линейное время, если его оптимизировать. Такая оптимизация называется [[Сжатое суффиксное дерево | сжатым суффиксным деревом]]. | ||
Версия 23:51, 26 марта 2016
Бор (англ. trie) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на рёбрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца.
Содержание
Пример
Построение
Пусть — набор строк, называемый словарем.
Пусть .
Непосредственно построение:
- Начинаем с дерева из одной вершины (корня).
- Добавляем шаблоны один за другим.
- Следуем из корня по рёбрам, отмеченным буквами из , пока возможно.
- Если заканчивается в , сохраняем идентификатор (например, ) в и отмечаем вершину как терминальную.
- Если ребра, отмеченного очередной буквой нет, то создаем новые ребра и вершины для всех оставшихся символов .
Это занимает, очевидно, времени.
Поскольку на каждую вершину приходится памяти, то использование памяти есть .
Потребление памяти можно уменьшить до линейного , но за счёт увеличения асимптотики работы до . Для этого достаточно хранить переходы не массивом, а отображением .
Бор позволяет решать задачу поиска подстроки в строке, если построить его на множестве суффиксов исходной строки. Такой бор называется суффиксным бором, который позволяет найти количество различных подстрок данной строки и решить другие задачи за линейное время, если его оптимизировать. Такая оптимизация называется сжатым суффиксным деревом.
Поиск строки в бору
| Задача: |
| Поиск строки в бору — |
Поиск строки в бору: начинаем в корне, идем по рёбрам, отмеченным символами , пока возможно. Если с последним символом мы приходим в вершину с сохраненным идентификатором, то — слово из словаря. Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки в словаре нет. Ясно, что это занимает времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.
Сжатый бор
Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно ребро с более чем одним символом.
Использование бора в качестве ассоциативного массива
Мы можем ввести для каждой вершины поле . Например, мы имеем . Будем искать ключ, спускаясь по бору. Соответственно, если на какой-то вершине нет пометки, что вершина является концом слова, то объекта в нет. Если хотим добавить его, то ставим в вершину флаг конца слова и заносим значение. Работать такой алгоритм будет за , где — количество добавленных слов.
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — ISBN 5-8489-0857-4
- Бор. Построение бора
