<?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=178.71.28.215&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=178.71.28.215&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/178.71.28.215"/>
		<updated>2026-05-11T01:35:33Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D1%80%D0%B0%D1%84%D1%8B_%D0%B4%D0%B5_%D0%91%D1%80%D1%8E%D0%B8%D0%BD%D0%B0&amp;diff=62391</id>
		<title>Графы де Брюина</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D1%80%D0%B0%D1%84%D1%8B_%D0%B4%D0%B5_%D0%91%D1%80%D1%8E%D0%B8%D0%BD%D0%B0&amp;diff=62391"/>
				<updated>2017-12-02T19:58:33Z</updated>
		
		<summary type="html">&lt;p&gt;178.71.28.215: /* Использование графов де Брюина */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Основные определения ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = de_bruijn_graph&lt;br /&gt;
|definition = '''Графом де Брюина''' (англ. ''De Bruijn graph'') с параметром &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-буквенного алфавита называется ориентированный граф &amp;lt;tex&amp;gt;G(V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; V - &amp;lt;/tex&amp;gt; множество всех слов длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; в заданном алфавите, и &amp;lt;tex&amp;gt;e = (u, v) \in E \Leftrightarrow \exists &amp;lt;/tex&amp;gt; слово &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt;l+1&amp;lt;/tex&amp;gt; в заданном алфавите такое, что &amp;lt;tex&amp;gt; u = prefix(L) \wedge v = suffix(L) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Основные свойства ==&lt;br /&gt;
* &amp;lt;tex&amp;gt; |V| = n^l &amp;lt;/tex&amp;gt;. Очевидно из определения &amp;lt;tex&amp;gt; V &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; l = 1 \Leftrightarrow G - &amp;lt;/tex&amp;gt; полный граф. &lt;br /&gt;
Действительно, для любых (необязательно различных) вершин &amp;lt;tex&amp;gt; u, v \ \exists L = \alpha \beta &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; \alpha, \beta - &amp;lt;/tex&amp;gt; слова (символы), соответствующие вершинам &amp;lt;tex&amp;gt; u, v &amp;lt;/tex&amp;gt;. И тогда очевидно, что существует ребро &amp;lt;tex&amp;gt; e = (u, v)\  \forall u, v \in V &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; \forall v \in V &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; deg_{out}(v) = n = deg_{in}(v)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Докажем первое равенство, второе аналогично. Существует ровно &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; символов алфавита, которые можно добавить в конец слова &amp;lt;tex&amp;gt; \alpha&amp;lt;/tex&amp;gt;, соответствующему вершине &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Получим ровно &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; различных слов. И у всех этих слов различные суффиксы длины &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;. Таким образом, из вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; выходит ровно &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; рёбер.&lt;br /&gt;
* &amp;lt;tex&amp;gt; G - &amp;lt;/tex&amp;gt; эйлеров. &lt;br /&gt;
Это следует из предыдущего свойства, так как &amp;lt;tex&amp;gt; deg(v) = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; e = (u, v) \in E \Leftrightarrow &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; prefix_{l-1}(v) = suffix_{l-1}(u) &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt; \Leftarrow &amp;lt;/tex&amp;gt;&lt;br /&gt;
Составим слово &amp;lt;tex&amp;gt; L = a \gamma b &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; \gamma - &amp;lt;/tex&amp;gt; общая часть слов, соответствующих вершинам &amp;lt;tex&amp;gt; u, v &amp;lt;/tex&amp;gt;. А символы &amp;lt;tex&amp;gt; a, b \ - &amp;lt;/tex&amp;gt; первый и последний символ этих слов соответственно. Из определения графа де Брюина следует, что ребро существует.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Rightarrow &amp;lt;/tex&amp;gt;&lt;br /&gt;
Возьмём подстроку слова &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; (из определения) без крайних символов (её длина &amp;lt;tex&amp;gt; l - 1  &amp;lt;/tex&amp;gt;). Так же из определения следует, что это будет суффиксом строки, соответствующей вершине &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и префиксом для строки, соответствующей &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм построения ==&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition =&lt;br /&gt;
Дан алфавит длины &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; и длина слов &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;. Построить по ним граф де Брюина.&lt;br /&gt;
}}&lt;br /&gt;
'''Алгоритм: '''&lt;br /&gt;
&lt;br /&gt;
1. Создаём пустой граф из &amp;lt;tex&amp;gt; n^l &amp;lt;/tex&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
2. Генерируем слово длины &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Считаем префикс &amp;lt;tex&amp;gt; pref &amp;lt;/tex&amp;gt; и суффикс &amp;lt;tex&amp;gt; suff &amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; для текущего. Причём установим в алфавите отношение порядка и будем рассматривать его символы как цифры в &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;-значной системе счисления. &lt;br /&gt;
&lt;br /&gt;
4. Проводим ребро &amp;lt;tex&amp;gt; (pref, suff) &amp;lt;/tex&amp;gt; в графе. Переходим к п.2 (например, будем перебирать в порядке лексикографического возрастания), пока не будут перебраны все слова длины &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Корректность''': перебраны все слова длины &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;, следовательно, были рассмотрены все возможные пары вершин, между которыми проведено ребро.&lt;br /&gt;
&lt;br /&gt;
'''Время работы''': &amp;lt;tex&amp;gt; O(n^{l+1} \cdot substring) = O(|E| \cdot l) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Использование графов де Брюина ==&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition =&lt;br /&gt;
Известно, что пароль имеет длину &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, и состоит из цифр от 1 до &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;. Требуется вывести кратчайшую последовательность цифр, которая гарантированно содержит пароль как подстроку.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Решение''':&lt;br /&gt;
&lt;br /&gt;
1. Составим граф де Брюина &amp;lt;tex&amp;gt; (n, l-1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Найдём в построенном графе эйлеров цикл. Он существует, так как граф де Брюина эйлеров (см. свойства)&lt;br /&gt;
&lt;br /&gt;
3. Слово, соответствующее первой вершине цикла, возьмём полностью (&amp;lt;tex&amp;gt; l - 1 &amp;lt;/tex&amp;gt; символов), затем будем последовательно добавлять в конец строки последний символ слова вершины, в которую был осуществлён переход. Так как рёбер &amp;lt;tex&amp;gt; n^l &amp;lt;/tex&amp;gt;, получим последовательность длиной &amp;lt;tex&amp;gt; n^l + l - 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Корректность''':&lt;br /&gt;
&lt;br /&gt;
1. Очевидно, что последовательность меньшей длины составить нельзя: в полученной последовательности ровно &amp;lt;tex&amp;gt; n^l &amp;lt;/tex&amp;gt; подстрок длины &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, и именно столько чисел можно составить из цифр от 1 до &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Двум разным рёбрам &amp;lt;tex&amp;gt; e_1 = (u_1, v_1), e_2 = (u_2, v_2) &amp;lt;/tex&amp;gt; соответствует два ''различных'' слова &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;. Иначе &amp;lt;tex&amp;gt; u_{1} = prefix(L) = u_{2} \wedge v_{1} = suffix(L) = v_{2} &amp;lt;/tex&amp;gt;. То есть это одно и то же ребро, при этом кратных рёбер в графе нет.&lt;br /&gt;
&lt;br /&gt;
3. Отсюда следует, что в последовательности содержится &amp;lt;tex&amp;gt; n^l &amp;lt;/tex&amp;gt; различных подстрок длины &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;. И короче последовательность получить нельзя. Значит, мы получили ответ за &amp;lt;tex&amp;gt; O((|E| \cdot (l-1)) + (|E| + |V|)) = O(|E| \cdot (l-1)) &amp;lt;/tex&amp;gt;, то есть за время построения графа де Брюина &amp;lt;tex&amp;gt; (n, l-1) &amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>178.71.28.215</name></author>	</entry>

	</feed>