Бор — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «'''Бор''' (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, предста…»)
 
Строка 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}:
Aho-corasick1.jpg

Построение

Идея

Пусть [math]P = \{P_1,...,P_k\} [/math] — набор строк, называемый словарем.

Пусть [math]n = \sum_{i=1}^k|P_i|[/math].

Начинаем с дерева из одной вершины (корня); добавляем шаблоны [math]P_i[/math] один за другим: Следуем из корня по ребрам, отмеченным буквами из [math]P_i[/math], пока возможно.

Если [math]P_i[/math] заканчивается в [math]v[/math], сохраняем идентификатор [math]P_i[/math] (например, [math]i[/math]) в [math]v[/math].

Если ребра, отмеченного очередной буквой [math]P_i[/math] нет, то создаем новые ребра и вершины для всех оставшихся символов [math]P_i[/math].

Это занимает, очевидно, [math]O (|P_1| + ... + |P_k|) = O (n)[/math] времени.

Пример реализации

Поиск строки в бору

Поиск строки [math]S[/math] в бору: начинаем в корне, идем по ребрам, отмеченным символами [math]S[/math], пока возможно. Если с последним символом [math]S[/math] мы приходим в вершину с сохраненным идентификатором, то [math]S[/math] — слово из словаря. Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки S в словаре нет. Ясно, что это занимает [math]O (|S|)[/math] времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.

Сжатый бор

Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно ребро с более чем одним символом.