Бор — различия между версиями
(→Построение) |
|||
Строка 21: | Строка 21: | ||
==Поиск строки в бору== | ==Поиск строки в бору== | ||
− | Поиск строки <tex>S</tex> в бору: начинаем в корне, идем по | + | Поиск строки <tex>S</tex> в бору: начинаем в корне, идем по [[Основные определения теории графов | рёбрам]], отмеченным символами <tex>S</tex>, пока возможно. |
Если с последним символом <tex>S</tex> мы приходим в вершину с сохраненным идентификатором, то <tex>S</tex> — слово из словаря. | Если с последним символом <tex>S</tex> мы приходим в вершину с сохраненным идентификатором, то <tex>S</tex> — слово из словаря. | ||
− | Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки <tex>S</tex> в словаре нет. | + | Если в какой-то момент [[Основные определения теории графов | ребра]], отмеченного нужным символом, не находится, то строки <tex>S</tex> в словаре нет. |
Ясно, что это занимает <tex>O (|S|)</tex> времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова. | Ясно, что это занимает <tex>O (|S|)</tex> времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова. | ||
Строка 29: | Строка 29: | ||
Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора | Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора | ||
следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту | следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту | ||
− | вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно | + | вершину, [[Основные определения теории графов | ребро]], входящее в нее, и [[Основные определения теории графов | ребро]], исходящее из нее, можно объединить в одно |
− | ребро с более чем одним символом. | + | [[Основные определения теории графов | ребро]] с более чем одним символом. |
==См. также== | ==См. также== |
Версия 20:32, 26 марта 2016
Бор (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на рёбрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца.
Содержание
Пример
Бор для набора образцов {he, she, his, hers}:
Построение
Пусть
— набор строк, называемый словарем.Пусть
.Непосредственно построение:
- Начинаем с дерева из одной вершины (корня).
- Добавляем шаблоны один за другим.
- Следуем из корня по рёбрам, отмеченным буквами из , пока возможно.
- Если заканчивается в , сохраняем идентификатор (например, ) в и отмечаем вершину как терминальную.
- Если ребра, отмеченного очередной буквой нет, то создаем новые ребра и вершины для всех оставшихся символов .
Это занимает, очевидно,
времени.Поиск строки в бору
Поиск строки рёбрам, отмеченным символами , пока возможно. Если с последним символом мы приходим в вершину с сохраненным идентификатором, то — слово из словаря. Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки в словаре нет. Ясно, что это занимает времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.
в бору: начинаем в корне, идем поСжатый бор
Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно ребро с более чем одним символом.
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — ISBN 5-8489-0857-4
- Алгоритм Ахо-Корасик