Бор — различия между версиями
(→Построение) |
|||
Строка 14: | Строка 14: | ||
Следуем из корня по ребрам, отмеченным буквами из <tex>P_i</tex>, пока возможно. | Следуем из корня по ребрам, отмеченным буквами из <tex>P_i</tex>, пока возможно. | ||
− | Если <tex>P_i</tex> заканчивается в <tex>v</tex>, сохраняем идентификатор <tex>P_i</tex> (например, <tex>i</tex>) в <tex>v</tex>. | + | Если <tex>P_i</tex> заканчивается в <tex>v</tex>, сохраняем идентификатор <tex>P_i</tex> (например, <tex>i</tex>) в <tex>v</tex> и отмечаем вершину <tex>v</tex> как терминальную. |
Если ребра, отмеченного очередной буквой <tex>P_i</tex> нет, то создаем новые ребра и вершины для всех оставшихся символов <tex>P_i</tex>. | Если ребра, отмеченного очередной буквой <tex>P_i</tex> нет, то создаем новые ребра и вершины для всех оставшихся символов <tex>P_i</tex>. |
Версия 12:10, 12 июня 2012
Бор (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на ребрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца.
Содержание
Пример
Бор для набора образцов {he, she, his, hers}:
Построение
Пусть
— набор строк, называемый словарем.Пусть
.Начинаем с дерева из одной вершины (корня); добавляем шаблоны
один за другим: Следуем из корня по ребрам, отмеченным буквами из , пока возможно.Если
заканчивается в , сохраняем идентификатор (например, ) в и отмечаем вершину как терминальную.Если ребра, отмеченного очередной буквой
нет, то создаем новые ребра и вершины для всех оставшихся символов .Это занимает, очевидно,
времени.Поиск строки в бору
Поиск строки
в бору: начинаем в корне, идем по ребрам, отмеченным символами , пока возможно. Если с последним символом мы приходим в вершину с сохраненным идентификатором, то — слово из словаря. Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки S в словаре нет. Ясно, что это занимает времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.Сжатый бор
Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно ребро с более чем одним символом.