Бор — различия между версиями
Geork (обсуждение | вклад) (Новая страница: «'''Бор''' (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, предста…») |
Geork (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| + | {{В разработке}} | ||
| + | |||
'''Бор''' (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на ребрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно | '''Бор''' (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на ребрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно | ||
зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца. | зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца. | ||
| − | ==Пример | + | ==Пример== |
Бор для набора образцов {he, she, his, hers}:<br /> | Бор для набора образцов {he, she, his, hers}:<br /> | ||
[[Файл:Aho-corasick1.jpg]] | [[Файл:Aho-corasick1.jpg]] | ||
| − | ==Построение | + | ==Построение== |
| + | ===Идея=== | ||
Пусть <tex>P = \{P_1,...,P_k\} </tex> — набор строк, называемый словарем. | Пусть <tex>P = \{P_1,...,P_k\} </tex> — набор строк, называемый словарем. | ||
| Строка 19: | Строка 22: | ||
Это занимает, очевидно, <tex>O (|P_1| + ... + |P_k|) = O (n)</tex> времени. | Это занимает, очевидно, <tex>O (|P_1| + ... + |P_k|) = O (n)</tex> времени. | ||
| + | ===Пример реализации=== | ||
==Поиск строки в бору== | ==Поиск строки в бору== | ||
| Строка 24: | Строка 28: | ||
Если с последним символом <tex>S</tex> мы приходим в вершину с сохраненным идентификатором, то <tex>S</tex> — слово из словаря. | Если с последним символом <tex>S</tex> мы приходим в вершину с сохраненным идентификатором, то <tex>S</tex> — слово из словаря. | ||
Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки S в словаре нет. | Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки S в словаре нет. | ||
| − | Ясно, что это занимает <tex>O (|S|)</tex> времени. Таким образом, бор | + | Ясно, что это занимает <tex>O (|S|)</tex> времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова. |
| + | |||
| + | ==Сжатый бор== | ||
| + | Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора | ||
| + | следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту | ||
| + | вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно | ||
| + | ребро с более чем одним символом. | ||
Версия 15:18, 7 мая 2011
Бор (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на ребрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца.
Пример
Бор для набора образцов {he, she, his, hers}:
Построение
Идея
Пусть — набор строк, называемый словарем.
Пусть .
Начинаем с дерева из одной вершины (корня); добавляем шаблоны один за другим: Следуем из корня по ребрам, отмеченным буквами из , пока возможно.
Если заканчивается в , сохраняем идентификатор (например, ) в .
Если ребра, отмеченного очередной буквой нет, то создаем новые ребра и вершины для всех оставшихся символов .
Это занимает, очевидно, времени.
Пример реализации
Поиск строки в бору
Поиск строки в бору: начинаем в корне, идем по ребрам, отмеченным символами , пока возможно. Если с последним символом мы приходим в вершину с сохраненным идентификатором, то — слово из словаря. Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки S в словаре нет. Ясно, что это занимает времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.
Сжатый бор
Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно ребро с более чем одним символом.