Графы де Брюина — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Основные свойства)
Строка 8: Строка 8:
 
== Основные свойства ==
 
== Основные свойства ==
 
* <tex> |V| = n^l </tex>. Очевидно из определения <tex> V </tex>.
 
* <tex> |V| = n^l </tex>. Очевидно из определения <tex> V </tex>.
* <tex> l = 1 \Leftrightarrow G - </tex> полный граф. Действительно, для любых (необязательно различных) вершин <tex> u, v \ \exists L = \alpha \beta </tex>, где <tex> \alpha, \beta - </tex> слова (символы), соответствующие вершинам <tex> u, v </tex>. И тогда очевидно, что существует ребро <tex> e = (u, v)\  \forall u, v \in V </tex>.
+
* <tex> l = 1 \Leftrightarrow G - </tex> полный граф.  
* <tex> \forall v \in V </tex> верно, что <tex> deg_{out}(v) = n = deg_{in}(v)</tex>. Докажем первое равенство, второе аналогично. Существует ровно <tex> n </tex> символов алфавита, которые можно добавить в конец слова <tex> \alpha</tex>, соответствующему вершине <tex> v </tex>. Получим ровно <tex> n </tex> различных слов. И у всех этих слов различные суффиксы длины <tex> l </tex>. Таким образом, из вершины <tex> v </tex> выходит ровно <tex> n </tex> рёбер.
+
Действительно, для любых (необязательно различных) вершин <tex> u, v \ \exists L = \alpha \beta </tex>, где <tex> \alpha, \beta - </tex> слова (символы), соответствующие вершинам <tex> u, v </tex>. И тогда очевидно, что существует ребро <tex> e = (u, v)\  \forall u, v \in V </tex>.
* <tex> G - </tex> эйлеров. Это следует из предыдущего свойства, так как <tex> deg(v) = 0 </tex>.
+
* <tex> \forall v \in V </tex> верно, что <tex> deg_{out}(v) = n = deg_{in}(v)</tex>.  
 +
Докажем первое равенство, второе аналогично. Существует ровно <tex> n </tex> символов алфавита, которые можно добавить в конец слова <tex> \alpha</tex>, соответствующему вершине <tex> v </tex>. Получим ровно <tex> n </tex> различных слов. И у всех этих слов различные суффиксы длины <tex> l </tex>. Таким образом, из вершины <tex> v </tex> выходит ровно <tex> n </tex> рёбер.
 +
* <tex> G - </tex> эйлеров.  
 +
Это следует из предыдущего свойства, так как <tex> deg(v) = 0 </tex>.
 +
* <tex> e = (u, v) \in E \Leftrightarrow </tex> <tex> prefix_{l-1}(v) = suffix_{l-1}(u) </tex>.
 +
<tex> \Leftarrow </tex>
 +
Составим слово <tex> L = a \gamma b </tex>, где <tex> \gamma - </tex> общая часть слов, соответствующих вершинам <tex> u, v </tex>. А символы <tex> a, b \ - </tex> первый и последний символ этих слов соответственно. Из определения графа де Брюина следует, что ребро существует.
 +
 
 +
<tex> \Rightarrow </tex>
 +
Возьмём подстроку слова <tex> L </tex> (из определения) без крайних символов (её длина <tex> l - 1  </tex>). Так же из определения следует, что это будет суффиксом строки, соответствующей вершине <tex> u </tex>, и префиксом для строки, соответствующей <tex> v </tex>.
 +
 
 +
== Алгоритм построения ==
 +
 
 +
{{Задача
 +
|definition =
 +
Дан алфавит длины <tex> n </tex> и длина слов <tex> l </tex>. Построить по ним граф де Брюина.
 +
}}
 +
'''Алгоритм: '''
 +
 
 +
1. Создаём пустой граф из <tex> n^l </tex> вершин.
 +
 
 +
2. Генерируем слово длины <tex> l+1 </tex>.
 +
 
 +
3. Считаем префикс <tex> pref </tex> и суффикс <tex> suff </tex> длины <tex> l </tex> для текущего. Причём установим в алфавите отношение порядка и будем рассматривать его символы как цифры в <tex> n </tex>-значной системе счисления.
 +
 
 +
4. Проводим ребро <tex> (pref, suff) </tex> в графе. Переходим к п.2 (например, будем перебирать в порядке лексикографического возрастания), пока не будут перебраны все слова длины <tex> l+1 </tex>.
 +
 
 +
'''Корректность''': перебраны все слова длины <tex> l+1 </tex>, следовательно, были рассмотрены все возможные пары вершин, между которыми проведено ребро.
 +
 
 +
'''Время работы''': <tex> O(n^{l+1} \cdot substring) = O(|E| \cdot l) </tex>
 +
 
 +
== Использование графов де Брюина ==

Версия 00:07, 1 декабря 2017

Основные определения

Определение:
Графом де Брюина (англ. De Bruijn graph) с параметром [math]l[/math] для [math]n[/math]-буквенного алфавита называется ориентированный граф [math]G(V, E)[/math], где [math] V - [/math] множество всех слов длины [math]l[/math] в заданном алфавите, и [math]e = (u, v) \in E \Leftrightarrow \exists [/math] слово [math]L[/math] длины [math]l+1[/math] в заданном алфавите такое, что [math] u = prefix(L) \wedge v = suffix(L) [/math]


Основные свойства

  • [math] |V| = n^l [/math]. Очевидно из определения [math] V [/math].
  • [math] l = 1 \Leftrightarrow G - [/math] полный граф.

Действительно, для любых (необязательно различных) вершин [math] u, v \ \exists L = \alpha \beta [/math], где [math] \alpha, \beta - [/math] слова (символы), соответствующие вершинам [math] u, v [/math]. И тогда очевидно, что существует ребро [math] e = (u, v)\ \forall u, v \in V [/math].

  • [math] \forall v \in V [/math] верно, что [math] deg_{out}(v) = n = deg_{in}(v)[/math].

Докажем первое равенство, второе аналогично. Существует ровно [math] n [/math] символов алфавита, которые можно добавить в конец слова [math] \alpha[/math], соответствующему вершине [math] v [/math]. Получим ровно [math] n [/math] различных слов. И у всех этих слов различные суффиксы длины [math] l [/math]. Таким образом, из вершины [math] v [/math] выходит ровно [math] n [/math] рёбер.

  • [math] G - [/math] эйлеров.

Это следует из предыдущего свойства, так как [math] deg(v) = 0 [/math].

  • [math] e = (u, v) \in E \Leftrightarrow [/math] [math] prefix_{l-1}(v) = suffix_{l-1}(u) [/math].

[math] \Leftarrow [/math] Составим слово [math] L = a \gamma b [/math], где [math] \gamma - [/math] общая часть слов, соответствующих вершинам [math] u, v [/math]. А символы [math] a, b \ - [/math] первый и последний символ этих слов соответственно. Из определения графа де Брюина следует, что ребро существует.

[math] \Rightarrow [/math] Возьмём подстроку слова [math] L [/math] (из определения) без крайних символов (её длина [math] l - 1 [/math]). Так же из определения следует, что это будет суффиксом строки, соответствующей вершине [math] u [/math], и префиксом для строки, соответствующей [math] v [/math].

Алгоритм построения

Задача:
Дан алфавит длины [math] n [/math] и длина слов [math] l [/math]. Построить по ним граф де Брюина.

Алгоритм:

1. Создаём пустой граф из [math] n^l [/math] вершин.

2. Генерируем слово длины [math] l+1 [/math].

3. Считаем префикс [math] pref [/math] и суффикс [math] suff [/math] длины [math] l [/math] для текущего. Причём установим в алфавите отношение порядка и будем рассматривать его символы как цифры в [math] n [/math]-значной системе счисления.

4. Проводим ребро [math] (pref, suff) [/math] в графе. Переходим к п.2 (например, будем перебирать в порядке лексикографического возрастания), пока не будут перебраны все слова длины [math] l+1 [/math].

Корректность: перебраны все слова длины [math] l+1 [/math], следовательно, были рассмотрены все возможные пары вершин, между которыми проведено ребро.

Время работы: [math] O(n^{l+1} \cdot substring) = O(|E| \cdot l) [/math]

Использование графов де Брюина