1632
правки
Изменения
Бор
,rollbackEdits.php mass rollback
'''Бор''' (англ. ''trie'', ''луч'', ''нагруженное дерево'') — {{---}} структура данных для хранения набора строк, представляющая из себя [[Дерево, эквивалентные определения | подвешенное дерево ]] с символами на ребрах[[Основные определения теории графов | рёбрах]]. Строки получаются прохождением из корня по рёбрампоследовательной записью всех символов, записывая соответствующие им символы, до хранящихся на [[Основные определения теории графов | рёбрах]] между корнем бора и терминальной вершинывершиной. Размер бора линейно
зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца.
==Пример==
Бор для набора образцов <tex> \{ \textbf{he}, \textbf{she}, \textbf{his}, \textbf{hers}\} </tex>:<br />[[Файл:Aho-corasick1Бор.jpg]]
==Построение==
===Алгоритм===Непосредственно построение:*Начало.*'''Шаг 1.''' Создадим [[Дерево, эквивалентные определения | дерево]] из одной вершины (в нашем случае корня).*'''Шаг 2.''' Добавление элементов в дерево.**Добавляем шаблоны <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>v</tex> как терминальную.**Если [[Основные определения теории графов | ребра]], отмеченного очередной буквой <tex>P_i</tex> нет, то создаем новое ребро и вершину для символа строки <tex>P_i</tex>.*Конец.Построение занимает, очевидно, <tex>O(|P_1| + \ldots + |P_k|) = O(n)</tex> времени, так как поиск буквы, по которой нужно переходить, происходит за <tex>O(1)</tex>.
===Цифровой бор==={{main|Сверхбыстрый цифровой бор}} ==Использование бора=====Поиск строки в бору==={{Задача|definition =Поиск строки Требуется найти слово <tex>S</tex> в бору: начинаем в корнесловаре.}}При решении этой задачи, идем обход бора совершается из его корня по ребрам[[Основные определения теории графов | рёбрам]], отмеченным символами строки <tex>S</tex>, пока возможно.Если с последним символом <tex>S</tex> мы приходим в терминальную вершину с сохраненным идентификатором, то <tex>S</tex> — слово из словаря.Если в какой-то момент [[Основные определения теории графов | ребра]], отмеченного нужным символом, не находится, то строки <tex>S </tex> в словаре нет.
Ясно, что это занимает <tex>O (|S|)</tex> времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.
==Сжатый бор=Использование бора в качестве ассоциативного массива===Сжатый Благодаря тому, что бор — позволяет решать задачу, описанную выше, он может выступать в качестве ассоциативного массива. Обычно, когда требуется такая структура , то используют [[Дерево поиска, наивная реализация | двоичное дерево поиска]] или [[Хеш-таблица | хеш-таблицу]]. ====Достоинства====Бор объединяет некоторые преимущества этих структур данных для хранения набора строки позволяет одновременно делать следующие операции, отличающаяся от боракоторые каждая из структур не может делать по отдельности. {| class="wikitable" style="width:10cm" border=1|+| || '''Бор''' || '''Дерево''' || '''Хеш-таблица'''|-|-align="center" bgcolor=#FFFFFF| ''Добавление элемента'' | align="center" style="background: #ddffdd;" | <tex>O(|S|)</tex>| align="center" style="background: #ffdddd;" |<tex>O(|S|\log k)</tex> | align="center" style="background: #ddffdd;" | <tex>O(|S|)</tex>|-align="center" bgcolor=#FFFFFF| ''Получение всех ключей в отсортированном порядке'' | align="center" style="background: #ddffdd;" | <tex>O(k)</tex>| align="center" style="background: #ddffdd;" | <tex>O(k)</tex> следующим улучшением| align="center" style="background: если #ffdddd;" | <tex>O(k\log k)</tex>|} ====Недостатки====Несмотря на данные достоинства у некоторой вершины исходящая степень равна 1реализации ассоциативного массива в виде бора есть следующие недостатки:# Бор хранит строки или символы, то этувершинуа это значит, реброчто у значения ключа будет ограничение на тип (строки, входящее в неесимволы, и ребролибо числа, исходящее из неепредставленные как строки). Чтобы это исправить, можно объединить научимся приводить любой тип данных к строке. Тогда сможем хранить любой вид данных в однокачестве ключа.ребро с более чем одним символом#Если реализовывать ассоциативный массив на обычном боре, а ключами будут являться строки, то будет использоваться слишком много памяти (возможен, например, вариант, когда у слов нет пересечений по префиксу, тогда бор будет использовать <tex>O(n| \Sigma |)</tex> памяти).
==См. также==
* [[Суффиксный массив]]
* [[Суффиксный бор]]
* [[Сжатое суффиксное дерево]]
* [[Алгоритм Ахо-Корасик]]
== Источники информации ==
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — ISBN 5-8489-0857-4
*[http://e-maxx.ru/algo/aho_corasick Алгоритм Ахо-КорасикБор. Построение бора]
[[Категория: Дискретная математика Алгоритмы и алгоритмыструктуры данных]]
[[Категория: Поиск подстроки в строке]]
[[Категория: Точный поиск]]
[[Категория: Структуры данных]]