<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.188.204.171&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.188.204.171&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/109.188.204.171"/>
		<updated>2026-05-22T11:50:31Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BE%D1%80&amp;diff=23803</id>
		<title>Суффиксный бор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BE%D1%80&amp;diff=23803"/>
				<updated>2012-06-04T15:55:23Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.204.171: Отмена правки 23680 участника 109.188.204.171 (обсуждение)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Syffix_trie_1.png|400px|thumb|right|Суффиксный бор для строки &amp;lt;tex&amp;gt;abbc&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
'''Суффиксный бор''' (англ. ''suffix trie'') {{---}} [[бор]], содержащий все суффиксы данной строки.&lt;br /&gt;
&lt;br /&gt;
По определению, в суффиксном боре для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\lvert s\rvert=n&amp;lt;/tex&amp;gt;) содержатся все строки &amp;lt;tex&amp;gt;s[1..n], ..., s[n..n]&amp;lt;/tex&amp;gt;. Заметим, что если в суффиксном боре находится строка &amp;lt;tex&amp;gt;s[i..n]&amp;lt;/tex&amp;gt;, то все ее префиксы &amp;lt;tex&amp;gt;s[i..j], i \le j \le n&amp;lt;/tex&amp;gt; уже содержатся в боре. &lt;br /&gt;
==Применение==&lt;br /&gt;
Суффиксный бор можно использовать для поиска подстроки в строке &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; (чтобы бор формально содержал все подстроки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, нужно пометить все его вершины терминальными, при этом корень будет соответствовать пустой строке &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Для поиска подстроки p в суффиксном боре нужно искать совпадения для символов из p вдоль единственного пути в боре до тех пор, пока либо p не исчерпается, либо дальнейшее совпадение будет невозможным. Если p исчерпалось, то подстрока найдена за &amp;lt;tex&amp;gt;O(|p|)&amp;lt;/tex&amp;gt;, если дальнейшее совпадение невозможно, то p нет в суффиксном дереве.&lt;br /&gt;
&lt;br /&gt;
==Свойства==&lt;br /&gt;
Суффиксный бор для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* Можно использовать для поиска образца &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; в строке &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(\lvert p\rvert)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Можно построить за время &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, последовательно добавив все суффиксы &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Имеет порядка &amp;lt;tex&amp;gt;n^2&amp;lt;/tex&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
 '''struct Trie'''&lt;br /&gt;
    map&amp;lt;char, integer&amp;gt;[length^2] trie &lt;br /&gt;
    number &amp;lt;tex&amp;gt; \leftarrow 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Add'''(i, j)&lt;br /&gt;
   current &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 0 &lt;br /&gt;
   '''for''' (char c &amp;lt;tex&amp;gt;\in&amp;lt;/tex&amp;gt; s[i, j])&lt;br /&gt;
     if (trie[current] constainKey(c))&lt;br /&gt;
       trie[current].add(c, number)  &lt;br /&gt;
       number++; &lt;br /&gt;
     current &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; trie[current][c]&lt;br /&gt;
&lt;br /&gt;
 '''Build'''(String  s)&lt;br /&gt;
   '''for'''(int i = 0, i &amp;lt; n, i++)&lt;br /&gt;
     Add(i, n)&lt;br /&gt;
&lt;br /&gt;
==Оценки использования памяти==&lt;br /&gt;
Пусть мы построили суффиксный бор для строки &amp;lt;tex&amp;gt;s \in \Sigma*&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|s| = n&amp;lt;/tex&amp;gt;. Из третьего свойства следует, что если хранить переходы суффиксного бора  из каждой вершины как массив размера &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; (по каждому символу — ребенок), то потребуется &amp;lt;tex&amp;gt;O(n^2 |\Sigma|)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
Однако, заметим, что число ветвлений в боре равно количеству суффиксов, так как каждый лист соответствует единственному суффиксу. Количество суффиксов  — &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, а значит число вершин, из которых ведет больше одного перехода, &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Поэтому, если в неветвящихся вершинах хранить только символ перехода и ребенка, то можно получить оценку &amp;lt;tex&amp;gt;O(n^2 + n|\Sigma|)&amp;lt;/tex&amp;gt;. Улучшением суффиксного бора, расходующим всего &amp;lt;tex&amp;gt;O( n|\Sigma|)&amp;lt;/tex&amp;gt; памяти, является [[сжатое суффиксное дерево]].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Словарные структуры данных]]&lt;/div&gt;</summary>
		<author><name>109.188.204.171</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BE%D1%80&amp;diff=23680</id>
		<title>Суффиксный бор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BE%D1%80&amp;diff=23680"/>
				<updated>2012-06-04T12:29:50Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.204.171: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Syffix_trie_1.png|400px|thumb|right|Суффиксный бор для строки &amp;lt;tex&amp;gt;abbc&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
'''Суффиксный бор''' (англ. ''suffix trie'') {{---}} [[бор]], содержащий все суффиксы данной строки.&lt;br /&gt;
&lt;br /&gt;
По определению, в суффиксном боре для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\lvert s\rvert=n&amp;lt;/tex&amp;gt;) содержатся все строки &amp;lt;tex&amp;gt;s[1..n], ..., s[n..n]&amp;lt;/tex&amp;gt;. Заметим, что если в суффиксном боре находится строка &amp;lt;tex&amp;gt;s[i..n]&amp;lt;/tex&amp;gt;, то все ее префиксы &amp;lt;tex&amp;gt;s[i..j], i \le j \le n&amp;lt;/tex&amp;gt; уже содержатся в боре. &lt;br /&gt;
==Применение==&lt;br /&gt;
Суффиксный бор можно использовать для поиска подстроки в строке &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; (чтобы бор формально содержал все подстроки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, нужно пометить все его вершины терминальными, при этом корень будет соответствовать пустой строке &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Для поиска подстроки p в суффиксном боре нужно искать совпадения для символов из p вдоль единственного пути в боре до тех пор, пока либо p не исчерпается, либо дальнейшее совпадение будет невозможным. Если p исчерпалось, то подстрока найдена за &amp;lt;tex&amp;gt;O(|p|)&amp;lt;/tex&amp;gt;, если дальнейшее совпадение невозможно, то p нет в суффиксном дереве.&lt;br /&gt;
&lt;br /&gt;
==Свойства==&lt;br /&gt;
Суффиксный бор для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* Можно использовать для поиска образца &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; в строке &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(\lvert p\rvert)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Можно построить за время &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, последовательно добавив все суффиксы &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Имеет порядка &amp;lt;tex&amp;gt;n^2&amp;lt;/tex&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
 '''struct Vert'''&lt;br /&gt;
    char symbol&lt;br /&gt;
    count number&lt;br /&gt;
    char[] array&lt;br /&gt;
    integer count&lt;br /&gt;
&lt;br /&gt;
 '''struct Trie'''&lt;br /&gt;
    Vert[length^2] trie &lt;br /&gt;
    number &amp;lt;tex&amp;gt; \leftarrow 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Add'''(i, j)&lt;br /&gt;
   current &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 0 &lt;br /&gt;
   '''for''' (char c &amp;lt;tex&amp;gt;\in&amp;lt;/tex&amp;gt; s[i, j])&lt;br /&gt;
     if (trie[current] constainKey(c))&lt;br /&gt;
       if(trie[current].count &amp;gt; 1)  &lt;br /&gt;
         inicialize array&lt;br /&gt;
         array[c] = number&lt;br /&gt;
       else &lt;br /&gt;
         symbol = c&lt;br /&gt;
         number = number  &lt;br /&gt;
       number++; &lt;br /&gt;
     current &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; trie[current][c]&lt;br /&gt;
&lt;br /&gt;
 '''Build'''(String  s)&lt;br /&gt;
   '''for'''(int i = 0, i &amp;lt; n, i++)&lt;br /&gt;
     Add(i, n)&lt;br /&gt;
&lt;br /&gt;
==Оценки использования памяти==&lt;br /&gt;
Пусть мы построили суффиксный бор для строки &amp;lt;tex&amp;gt;s \in \Sigma*&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|s| = n&amp;lt;/tex&amp;gt;. Из третьего свойства следует, что если хранить переходы суффиксного бора  из каждой вершины как массив размера &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; (по каждому символу — ребенок), то потребуется &amp;lt;tex&amp;gt;O(n^2 |\Sigma|)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
Однако, заметим, что число ветвлений в боре равно количеству суффиксов, так как каждый лист соответствует единственному суффиксу. Количество суффиксов  — &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, а значит число вершин, из которых ведет больше одного перехода, &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Поэтому, если в неветвящихся вершинах хранить только символ перехода и ребенка, то можно получить оценку &amp;lt;tex&amp;gt;O(n^2 + n|\Sigma|)&amp;lt;/tex&amp;gt;. Улучшением суффиксного бора, расходующим всего &amp;lt;tex&amp;gt;O( n|\Sigma|)&amp;lt;/tex&amp;gt; памяти, является [[сжатое суффиксное дерево]].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Словарные структуры данных]]&lt;/div&gt;</summary>
		<author><name>109.188.204.171</name></author>	</entry>

	</feed>