http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&user=Danek+g30&feedformat=atomВикиконспекты - Вклад участника [ru]2024-03-28T19:58:21ZВклад участникаMediaWiki 1.30.0http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35925Регулярная аппроксимация КС-языков2014-01-19T17:29:39Z<p>Danek g30: /* Аппроксимации самоприменимой грамматики */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br \><br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в нетерминал или символ алфавита:<br />
# символ алфавит или <tex> \varepsilon </tex> {{---}} добавляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный нетерминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)<br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Аппроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободно-контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN аппроксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим в него два состояния <tex> q_A</tex> и <tex>q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT аппроксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
<br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров аппроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной аппроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35924Регулярная аппроксимация КС-языков2014-01-19T17:25:24Z<p>Danek g30: /* Источники */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br \><br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в нетерминал или символ алфавита:<br />
# символ алфавит или <tex> \varepsilon </tex> {{---}} добавляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный нетерминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)<br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Аппроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободно-контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN аппроксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT аппроксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
<br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров аппроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной аппроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35923Регулярная аппроксимация КС-языков2014-01-19T17:24:10Z<p>Danek g30: /* Апроксимации самоприменимой грамматики */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br \><br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в нетерминал или символ алфавита:<br />
# символ алфавит или <tex> \varepsilon </tex> {{---}} добавляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный нетерминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)<br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Аппроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободно-контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN аппроксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT аппроксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
<br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35922Регулярная аппроксимация КС-языков2014-01-19T17:20:54Z<p>Danek g30: /* Идея алгоритма */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br \><br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в нетерминал или символ алфавита:<br />
# символ алфавит или <tex> \varepsilon </tex> {{---}} добавляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный нетерминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)<br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35921Регулярная аппроксимация КС-языков2014-01-19T17:16:22Z<p>Danek g30: /* Идея алгоритма */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br \><br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> \varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)<br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35920Регулярная аппроксимация КС-языков2014-01-19T17:15:35Z<p>Danek g30: /* Идея алгоритма */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br \><br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода)<br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35919Регулярная аппроксимация КС-языков2014-01-19T17:14:37Z<p>Danek g30: /* Алгоритм преобразования грамматики в конечный автомат */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. В источниках есть ссылка на формальное доказательство.<br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35918Регулярная аппроксимация КС-языков2014-01-19T17:10:26Z<p>Danek g30: /* Источники */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
== Источники ==<br />
* [http://books.google.ru/books?id=tFvtwGYNe7kC&pg=PA21&lpg=PA21&dq=prove+that+grammars+that+are+not+self-embedding+generate+regular+languages.&source=bl&ots=3gFnA7ig-l&sig=Ub9f_BJKv_jdiO7mWRvkYJVamDE&hl=ru&sa=X&ei=qQfcUoy9Nubb4QSI4YGQDg&redir_esc=y#v=onepage&q=prove%20that%20grammars%20that%20are%20not%20self-embedding%20generate%20regular%20languages.&f=false Формальное доказательство, что кс не самоприменимая грамматика генерирует регулярный язык]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35917Регулярная аппроксимация КС-языков2014-01-19T17:06:41Z<p>Danek g30: /* MT апраксимация */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex><br />
== Источники ==<br />
* [http://www.mpi.nl/world/materials/publications/levelt/Levelt_Formal_Grammars_Vol1_1974.pdf Формальное доказательство экивалентости кс не самоприменимых кс языков и регулярных]<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.cs.ucsb.edu%2F~omer%2FDOWNLOADABLE%2Fcfg-reg09.pdf&ei=AQbcUrL_DIfi4wSx3IDYDg&usg=AFQjCNHsSWONr0_c2MDgvApwrhc81deY0w&sig2=_2iZj4Xexe6-p5Cyt-GEMg&bvm=bv.59568121,d.bGE Разобрано много примеров апроксимаций]<br />
<br />
* [https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCkQFjAA&url=http%3A%2F%2Facl.ldc.upenn.edu%2FJ%2FJ00%2FJ00-1003.pdf&ei=CgfcUrWwA-mF4ATY7IHQAQ&usg=AFQjCNG3QHL7yQSwTUbSi9xkse2j0p6YaA&sig2=UF88aXWRAbapv4o_UrIjGg&bvm=bv.59568121,d.bGE практические эксперименты с регулярной апроксимацией]<br />
<br />
<br />
[[Категория: Теория формальных языков]]<br />
[[Категория: Контекстно-свободные грамматики]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35916Регулярная аппроксимация КС-языков2014-01-19T16:50:26Z<p>Danek g30: /* MT апраксимация */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).<br />
В итоге <tex> G^*</tex> {{---}} [[Правоконтекстные грамматики, эквивалентность автоматам|правоконтекстная грамматика]], эквивалентная конечному автомату, который задает регулярный язык.<br />
==== Пример ====<br />
<tex> G = \left\{\begin{matrix} A \rightarrow \alpha A \alpha <br />
\\ B \rightarrow \beta A | \beta<br />
\end{matrix}\right.\Rightarrow G^* = \left\{\begin{matrix} A \rightarrow \alpha B <br />
\\ A^* \rightarrow B^* | \varepsilon<br />
\\ B \rightarrow \beta A | \beta B^*<br />
\\ B^* \rightarrow \alpha A^* | \varepsilon<br />
\end{matrix}\right.</tex></div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35915Регулярная аппроксимация КС-языков2014-01-19T16:29:25Z<p>Danek g30: /* MT апраксимация */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.<br />
(Если <tex>m = 0 </tex>, тогда добавим правило <tex> A \rightarrow {\alpha}_0 A^* </tex>).</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35913Регулярная аппроксимация КС-языков2014-01-19T16:24:15Z<p>Danek g30: /* Апроксимации самоприменимой грамматики */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
===MT апраксимация ===<br />
Построим, по данной самоприменимой кс грамматике <tex> G </tex>, регулярную грамматику <tex> G^*</tex>.<br />
#Для каждого нетерминала <tex> A \in N </tex> из <tex>G</tex>, добавим нетерминалы <tex>A</tex> и <tex> A^*</tex> в <tex> G^* </tex>. <br />
#Для каждого правила <tex> A \rightarrow {\alpha}_{0} B_1 {\alpha}_{1} B_2 {\alpha}_{2} \cdots B_m {\alpha}_{m}</tex>, где <tex> B_1, \cdots, B_m \in N \land {\alpha}_i \in \Sigma^*</tex>. Добавим в <tex> G^*</tex> нетерминалы <tex> B_1 \cdots B_m , B_1^* \cdots B_m^*</tex> и следуюшие правила: <tex> A \rightarrow {\alpha}_0 B_1 \\ B_1^* \rightarrow {\alpha}_1 B_2\\ \vdots \\ B^*_m \rightarrow {\alpha}_m A^* </tex>.</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35909Регулярная аппроксимация КС-языков2014-01-19T15:23:29Z<p>Danek g30: /* Апроксимации самоприменимой грамматики */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
[[Файл:RTN_Automat.png|280px|thumb|right|Автоматы <tex>T_A,T_B</tex> для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
[[Файл:RTN_Automat1.png|280px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]] <br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BF%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D1%8F_%D0%9A%D0%A1-%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2&diff=35908Регулярная аппроксимация КС-языков2014-01-19T15:12:16Z<p>Danek g30: /* RTN апрксимация */</p>
<hr />
<div><br />
<br />
==Определения==<br />
{{Определение<br />
|definition =<br />
[[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|Контекстно-свободная]] грамматика <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''самоприменимой''', если <tex> \exists A \in N: A \Rightarrow^* \alpha A \beta</tex>, <tex> \alpha \neq \varepsilon \land \beta \neq \varepsilon </tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминал <tex> A \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называется '''рекурсивным''', если <tex> \exists \alpha,\beta \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha A \beta</tex> .<br />
}}<br />
{{Определение<br />
|definition =<br />
Нетерминалы <tex> A,B \in N</tex> в грамматике <tex> G = \langle N, \Sigma, P, S \rangle</tex> называются '''взаимно рекурсивными''', если <tex> \exists \alpha_1,\beta_1,\alpha_2,\beta_2 \in (\Sigma \cup N)^* : A \Rightarrow^* \alpha_1 B \beta_1 \land B \Rightarrow^* \alpha_2 A \beta_2</tex> .<br />
}}<br />
== Алгоритм преобразования грамматики в конечный автомат ==<br />
{{Лемма<br />
|statement = Не самоприменимая контекстно-свободная грамматика генерирует регулярный язык.<br />
|proof = В качестве конструктивного доказательства, мы приведем алгоритм построения [[Недетерминированные конечные автоматы|конечного автомата]] по грамматике. <br />
<br />
}}<br />
=== Идея алгоритма ===<br />
Пусть, <tex> N^* </tex> множество рекурсивных терминалов из <tex> N </tex>. <br />
Пусть, <tex> P = \{N_1,N_2,...,N_K\} </tex> разбиение <tex> N^*</tex> на <tex> k </tex> дизъюнктных множеств взаимно рекурсивных терминалов, <br />
<tex> N_1 \cup N_2 \cup ... \cup N_k = N^* \land \forall i N_i \neq \emptyset </tex>. <br />
Ввведем функцию <tex> recursive(N_i): P \rightarrow \{left, right, self, cycle\} </tex>:<br />
'''function''' IsLeftType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \alpha \neq \varepsilon ]</tex><br />
<br />
'''function''' IsRightType(<tex>N_i</tex>)<br />
'''return''' <tex> \exists (A \Rightarrow \alpha B \beta) \in P[ A \in N_i \land B \in N_i \land \beta \neq \varepsilon ]</tex><br />
<br />
<br />
'''function''' recursive (<tex>N_i</tex>):<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return left;<br />
'''if''' IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return right;<br />
'''if''' (IsLeftType(<tex>N_i</tex>) && IsRihtType(<tex>N_i</tex>) <br />
return self;<br />
'''if''' !IsLeftType(<tex>N_i</tex>) && !IsRihtType(<tex>N_i</tex>) <br />
return cyclic;<br />
Заметим, что <tex> \forall i </tex> <tex>recursive(N_i) \neq self </tex>, т.к грамматика не самоприменима.<br />
В основе алгоритма будет рекурсивный обход грамматики во все стороны. Спускаемся по грамматике до тех пор не приходим в терминал или символ алфавита:<br />
# символ алфавит или <tex> /varepsilon </tex> {{---}} добовляем новое правило в автомат<br />
# нерекурсивный нетерминал {{---}} запускаемся от всех правых частей правил, который терминал порождает<br />
# рекурсивный терминал {{---}} в зависимости от типа рекурсивного нетерминала, продолжаем рекурсию (будет ясно из пседокода) <br />
<br />
===Псевдокод===<br />
<tex>Q</tex> {{---}} множество состояний ДКА.<br />
<tex>\Delta</tex> {{---}} множество переходов ДКА.<br />
<tex>T</tex> {{---}} множество допускающих состояний.<br />
'''function''' createFA(G) // <tex> G = \langle N, \Sigma, P, S \rangle</tex><br />
<tex>\mathtt{Q} \leftarrow \varnothing</tex><br />
<tex>\Delta \leftarrow \varnothing </tex><br />
s = createState<br />
f = createState<br />
<tex>F \leftarrow \{f\} </tex><br />
'''return''' makeFA (s,S,f)<br />
<br />
'''function''' makeFA (q0,a,q1)<br />
'''if''' a == <tex> \varepsilon </tex> || a <tex> \in \Sigma</tex> <font color=green>// пришли в лист дерева разбора</font><br />
<tex> \Delta = \Delta \cup \{(q_0,a,q_1)\} </tex><br />
'''return'''<br />
'''if''' a == <tex>X\beta</tex> '''where''' <tex> X \in (N \cup \Sigma) \land \beta \in (N \cup \Sigma)^* \land |\beta| > 0 </tex> <br />
q = createState<br />
makeFA (<tex>q_0,X,q_1</tex>)<br />
makeFA (<tex>q, \beta, q_1 </tex>)<br />
'''return'''<br />
'''if''' '''exist''' <tex> N_i </tex> '''where''' <tex> a \in N_i </tex> <br />
'''foreach''' b '''in''' <tex>N_i</tex> <br />
<tex>q_b</tex> = createState<br />
'''if recursive'''(<tex> N_i </tex>) == '''left''' <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_0, X_1 \cdots X_m, q_C</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_a,\varepsilon,q_1)\} </tex><br />
'''else''' <font color=green>// рекурсивный нетерминал rihgt или self</font> <br />
'''foreach''' C '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow X_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_C, X_1 \cdots X_m, q_1</tex>) <br />
'''foreach''' C,D '''in''' <tex>N_i</tex> '''where''' <tex> C \rightarrow DX_1...X_m \land X_1,...X_m \neq N_i </tex><br />
makeFA (<tex>q_D, X_1 \cdots X_m, q_C</tex>)<br />
<tex> \Delta = \Delta \cup \{(q_0, \varepsilon ,q_a)\} </tex> <br />
'''return'''<br />
'''foreach''' p '''in''' <tex>P</tex> '''where''' p == <tex> a \rightarrow \beta </tex><br />
makeFA (<tex> q_0, \beta, q_1 </tex>)<br />
== Апроксимации самоприменимой грамматики ==<br />
В данном разделе покажем методы апроксимации самоприменимой свободной контекстной грамматики <tex> G = \langle N, \Sigma, P, S \rangle</tex> к регулярной грамматике. Для удобства будем считать, что грамматика представлена в [[Нормальная форма Хомского|НФХ]]. <br />
<br />
=== RTN апраксимация ===<br />
Построим, по данной грамматике аппроксимирующий ее конечный автомат.<br />
#Для каждого нетерминала <tex> A</tex> в грамматике, создадим новый конечный автомат <tex> T_A</tex>, добавим два состояния в <tex> T_A</tex>: <tex>q_A,q_{A^*}</tex>.<br />
#Для каждого правила грамматике <tex> (A \rightarrow X_1 \cdots X_m ) \in P</tex>, введм новые состояния в автомат этого нетерминала <tex> q_0^A \cdots q_m^A</tex>, а также добавим новые правила перехода в <tex> \Delta</tex>: <tex> (q_A, \varepsilon, q_0),(q_0^A,X_1,q_1^A), \cdots,(q_{m-1}^A,X_m,q_m^A),(q_m^A,\varepsilon,q_{A^*})</tex>.<br />
[[Файл:RTN_Automat1.png|300px|thumb|left|Конечный автомат для грамматики <br />
<tex>A \rightarrow aBb \\ A \rightarrow cA \\ B \rightarrow dAe \\ B \rightarrow f </tex>]]<br />
#Таким образом мы построили множество конечных автоматов <tex>T</tex> = <tex> \{ T_A \| A \in N\}</tex> для каждого нетерминала <tex>A</tex>. Теперь объединим все в один автомат. Объединим все состоянии автоматов из <tex>T</tex> в множество <tex>Q</tex>. Скопируем все переходы каждого автомата из <tex>T</tex> в <tex>\Delta</tex>. Далее для каждого перехода вида <tex>(q,A,p), A\in N</tex>, вместо него добавим два новых перехода: <tex> (q, \varepsilon, q_A),(q_A^{*}, \varepsilon, p) </tex>.</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:RTN_Automat1.png&diff=35907Файл:RTN Automat1.png2014-01-19T15:09:31Z<p>Danek g30: </p>
<hr />
<div></div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:RTN_Automat.png&diff=35906Файл:RTN Automat.png2014-01-19T14:51:52Z<p>Danek g30: </p>
<hr />
<div></div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B5_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D1%85%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B0&diff=30446Верхние и нижние оценки хроматического числа2013-01-20T07:50:05Z<p>Danek g30: /* Нижняя оценка числом внутренней устойчивости */</p>
<hr />
<div>== Верхняя оценка длиной максимального нечетного цикла ==<br />
{{Лемма <br />
|about = оценка хроматического числа длиной максимального нечётного цикла<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - длина максимального простого цикла графа <tex>G</tex>, <tex>\Delta \ge 3</tex>. Тогда, <tex>\chi(G) \le \Delta(G) + 1</tex>. <br />
|proof=<br />
Опишем на графе следующий алгоритм раскраски:<br />
*Из произвольной вершины <tex>v</tex> запусти алгоритм поиска в глубину. Пусть <tex>T</tex> {{---}} дерево обхода глубина графа <tex>G</tex> с корнем в вершине <tex>v</tex>.<br />
*Произвольную вершину <tex>u</tex>, покрасим в цвет <tex>dist(v,u)</tex> <tex> \mod </tex> <tex> (\Delta + 1)</tex>, где <tex>dist(v,u)</tex>{{---}} расстояние между вершинами <tex>u,v</tex> в графe <tex>T</tex>.<br />
Докажем от противного, что после выполнения описанного алгоритма граф <tex>G</tex> будет правильно раскрашен.<br />
Предположим, что после выполнения алгоритма покраски в графе существует ребро, соединяющее вершины <tex> a,b </tex> одного цвета.Пусть <tex>color(v)</tex> {{---}} цвет вершины после выполнения алгоритма раскраски.Заметим, что для произвольной вершины графа <tex>p</tex>, <tex>dist(v,p) = color(p) + n(\Delta + 1)</tex> , <tex>n \ge 0 </tex>.Тогда, <tex>dist(v,a) - dist(v,b) = k(\Delta + 1)</tex>.Поскольку в дереве dfs между вершинами находящимися на одинаковом расстоянии от корня нет перекрестных ребер, то <tex> k \ge 1</tex>. То есть, вершины <tex>a,b</tex> лежат на простом цикле длины по крайней мере <tex>\Delta + 2</tex>. Получается противоречие с условием потому, что длина максимального простого цикла получается больше чем <tex>\Delta</tex>.<br />
Таким образом в графе <tex>G</tex> после выполнения алгоритма раскраски нет вершин одного цвета соединенных ребром и при этом каждая вершина покрашена в один из <tex>\Delta + 1</tex>, то есть <tex>G</tex> правильно раскрашен в <tex>\Delta + 1</tex> цвет, следовательно <tex>\chi(G) \le \Delta(G) + 1</tex><br />
<br />
<br />
}}<br />
==Нижняя оценка числом независимости ==<br />
{{Определение<br />
<br />
|definition=<br />
Подмножество <tex>S</tex> вершин графа <tex>G</tex> называется '''независимым''', если любые две вершины из <tex>S</tex> не смежны в <tex>G</tex> <br />
}}<br />
<br />
{{Определение<br />
<br />
|definition=<br />
'''Число независимости''' <tex>\alpha(G)</tex> графа <tex>G(V,E)</tex> {{---}} <tex>max \{|S|:S \in V</tex> и S независимо в G<tex>\}</tex><br />
}}<br />
{{Лемма <br />
|about = нижняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами .Тогда, <tex>n/\alpha \le \chi(G)</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.Каждое из <tex>V_i</tex> {{---}} независимое множество (поскольку вершины множества покрашены в один цвет при правильной покраски графа <tex>G</tex>, следовательно, они попарно не смежны внутри множества ).<br />
Заметим, что для произвольного <tex>i</tex>, <tex>|V_i| \le \alpha</tex> (т.к <tex>V_i</tex> независимое множество). То есть, <tex>\sum\limits^{\chi}_{i = 1}|V_i| = n \le \chi \alpha </tex>, следовательно <tex>n / \alpha \le \chi</tex>.<br />
}}<br />
<br />
== Верхняя оценка количеством ребер ==<br />
{{Лемма <br />
|about = верхняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>m</tex> ребрами.Тогда, <tex>\chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}}</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>. Заметим, что между любыми двумя различными множествами существует хотя бы одно ребро (в противном случаи эти множества можно было бы покрасить в один цвет).<br />
Тогда, <tex>\frac{1}{2}\chi(\chi-1) \le m \Rightarrow (\chi - \frac{1}{2})^2 \le 2m + \frac{1}{4} \Rightarrow \chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}} </tex>.<br />
}}<br />
== Нижняя оценка количеством ребер и количеством вершин ==<br />
{{Лемма <br />
|about = нижняя оценка Геллера<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами и <tex>m</tex> ребрами .Тогда, <tex>\frac{n^2}{n^2 - 2m} \le \chi(G) </tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.<br />
<tex>m \le \frac{1}{2}n(n - 1) - \frac{1}{2}\sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1) \Rightarrow \frac{n^2}{n^2 - 2m} \le \frac{n^2}{n^2 -n(n - 1) + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{n + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i| + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} = \frac{(\sum\limits^{\chi}_{i = 1}|V_i|)^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} \le \chi</tex>.<br />
}}<br />
== Полезные материалы ==<br />
* [http://www.ucdenver.edu/academics/colleges/CLAS/Departments/math/students/alumni/Documents/Student%20Theses/Mitchell_MSThesis.pdf Множество разных оценок для хроматических чисел]<br />
* [http://geometr.freehostia.com/sravnenie_summ.html Сравнение квадрата суммы и суммы квадратов действительных чисел]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B5_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D1%85%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B0&diff=30445Верхние и нижние оценки хроматического числа2013-01-20T07:48:32Z<p>Danek g30: /* Нижняя оценка числом внутренней устойчивости */</p>
<hr />
<div>== Верхняя оценка длиной максимального нечетного цикла ==<br />
{{Лемма <br />
|about = оценка хроматического числа длиной максимального нечётного цикла<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - длина максимального простого цикла графа <tex>G</tex>, <tex>\Delta \ge 3</tex>. Тогда, <tex>\chi(G) \le \Delta(G) + 1</tex>. <br />
|proof=<br />
Опишем на графе следующий алгоритм раскраски:<br />
*Из произвольной вершины <tex>v</tex> запусти алгоритм поиска в глубину. Пусть <tex>T</tex> {{---}} дерево обхода глубина графа <tex>G</tex> с корнем в вершине <tex>v</tex>.<br />
*Произвольную вершину <tex>u</tex>, покрасим в цвет <tex>dist(v,u)</tex> <tex> \mod </tex> <tex> (\Delta + 1)</tex>, где <tex>dist(v,u)</tex>{{---}} расстояние между вершинами <tex>u,v</tex> в графe <tex>T</tex>.<br />
Докажем от противного, что после выполнения описанного алгоритма граф <tex>G</tex> будет правильно раскрашен.<br />
Предположим, что после выполнения алгоритма покраски в графе существует ребро, соединяющее вершины <tex> a,b </tex> одного цвета.Пусть <tex>color(v)</tex> {{---}} цвет вершины после выполнения алгоритма раскраски.Заметим, что для произвольной вершины графа <tex>p</tex>, <tex>dist(v,p) = color(p) + n(\Delta + 1)</tex> , <tex>n \ge 0 </tex>.Тогда, <tex>dist(v,a) - dist(v,b) = k(\Delta + 1)</tex>.Поскольку в дереве dfs между вершинами находящимися на одинаковом расстоянии от корня нет перекрестных ребер, то <tex> k \ge 1</tex>. То есть, вершины <tex>a,b</tex> лежат на простом цикле длины по крайней мере <tex>\Delta + 2</tex>. Получается противоречие с условием потому, что длина максимального простого цикла получается больше чем <tex>\Delta</tex>.<br />
Таким образом в графе <tex>G</tex> после выполнения алгоритма раскраски нет вершин одного цвета соединенных ребром и при этом каждая вершина покрашена в один из <tex>\Delta + 1</tex>, то есть <tex>G</tex> правильно раскрашен в <tex>\Delta + 1</tex> цвет, следовательно <tex>\chi(G) \le \Delta(G) + 1</tex><br />
<br />
<br />
}}<br />
==Нижняя оценка числом внутренней устойчивости ==<br />
{{Определение<br />
<br />
|definition=<br />
Подмножество <tex>S</tex> вершин графа <tex>G</tex> называется '''независимым''', если любые две вершины из <tex>S</tex> не смежны в <tex>G</tex> <br />
}}<br />
<br />
{{Определение<br />
<br />
|definition=<br />
'''Число независимости''' <tex>\alpha(G)</tex> графа <tex>G(V,E)</tex> {{---}} <tex>max \{|S|:S \in V</tex> и S внутренне устойчиво в G<tex>\}</tex><br />
}}<br />
{{Лемма <br />
|about = нижняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами .Тогда, <tex>n/\alpha \le \chi(G)</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.Каждое из <tex>V_i</tex> {{---}} независимое множество (поскольку вершины множества покрашены в один цвет при правильной покраски графа <tex>G</tex>, следовательно, они попарно не смежны внутри множества ).<br />
Заметим, что для произвольного <tex>i</tex>, <tex>|V_i| \le \alpha</tex> (т.к <tex>V_i</tex> независимое множество). То есть, <tex>\sum\limits^{\chi}_{i = 1}|V_i| = n \le \chi \alpha </tex>, следовательно <tex>n / \alpha \le \chi</tex>.<br />
}}<br />
<br />
== Верхняя оценка количеством ребер ==<br />
{{Лемма <br />
|about = верхняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>m</tex> ребрами.Тогда, <tex>\chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}}</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>. Заметим, что между любыми двумя различными множествами существует хотя бы одно ребро (в противном случаи эти множества можно было бы покрасить в один цвет).<br />
Тогда, <tex>\frac{1}{2}\chi(\chi-1) \le m \Rightarrow (\chi - \frac{1}{2})^2 \le 2m + \frac{1}{4} \Rightarrow \chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}} </tex>.<br />
}}<br />
== Нижняя оценка количеством ребер и количеством вершин ==<br />
{{Лемма <br />
|about = нижняя оценка Геллера<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами и <tex>m</tex> ребрами .Тогда, <tex>\frac{n^2}{n^2 - 2m} \le \chi(G) </tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.<br />
<tex>m \le \frac{1}{2}n(n - 1) - \frac{1}{2}\sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1) \Rightarrow \frac{n^2}{n^2 - 2m} \le \frac{n^2}{n^2 -n(n - 1) + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{n + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i| + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} = \frac{(\sum\limits^{\chi}_{i = 1}|V_i|)^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} \le \chi</tex>.<br />
}}<br />
== Полезные материалы ==<br />
* [http://www.ucdenver.edu/academics/colleges/CLAS/Departments/math/students/alumni/Documents/Student%20Theses/Mitchell_MSThesis.pdf Множество разных оценок для хроматических чисел]<br />
* [http://geometr.freehostia.com/sravnenie_summ.html Сравнение квадрата суммы и суммы квадратов действительных чисел]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30422Теорема Брукса2013-01-19T22:19:53Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на пятом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
Для доказательства теоремы рассмотрим несколько случаев:<br />
#<tex>\Delta(G) \le 2</tex>, тогда:<br />
#*Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#*Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#*Если <tex> \Delta = 2</tex>, то:<br />
#*# <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
#*#<tex> G</tex> нечетный цикл<br />
#<tex>\Delta(G) \ge 3</tex>, тогда:<br />
##Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex> {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> {{---}} две компоненты связности, полученные при удалении вершины <tex>v</tex>. Тогда, по выше доказанной лемме эти компоненты можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов. Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
##Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность. Пусть <tex>G_1,G_2</tex> {{---}} два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая.<br />
### Если сумма степеней вершин <tex>u,v</tex> в каждом из подграфов <tex>G_1,G_2</tex> меньше <tex>2(\Delta-1)</tex>. Тогда, в одном из данных подграфах <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex>. Тоесть, эти подграфы можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов. А из этого следует, что граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
### Если сумма степеней вершин <tex>u,v</tex> в одном из подграфов <tex>G_1,G_2</tex> равна <tex>2(\Delta-1)</tex>. Тогда, степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex>, рассмотрим например, что в подграфе <tex>G_1</tex>:<br />
###* Если вершины <tex>u,v</tex> смежны с вершиной <tex>p \in G_2</tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где степени вершин <tex>u,v</tex> равны <tex>1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета. Следовательно, можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
###*[[Файл:Brooks_2.png|400px|thumb|Алгоритм раскраски. Третий случай, пятый шаг]]Если вершины <tex>u,v</tex> смежны с вершинами <tex>u_1,v_1 \in G_2</tex> соответственно, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>. Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра. При этом, сумма степеней новой пары вершин в каждой из компонент, полученных после их удаления, меньше <tex>2(\Delta-1)</tex>. Поэтому, если для этой пары вершин провести рассуждения аналогичные тем, которые проводились для вершин <tex> v,u</tex>, получится, что граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta </tex> цветов.<br />
##Если <tex>G</tex> является <tex>k</tex>-связным графом, где <tex>k > 2</tex>. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случае <tex>G = K_n</tex>. Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2}</tex>, где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Теперь пусть <tex> v_{n-1} = v</tex>, и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке, начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски, где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей. Следовательно, вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Вершину <tex>w</tex> мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30421Теорема Брукса2013-01-19T22:18:36Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на пятом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
Для доказательства теоремы рассмотрим несколько случаев:<br />
#<tex>\Delta(G) \le 2</tex>, тогда:<br />
#*Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#*Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#*Если <tex> \Delta = 2</tex>, то:<br />
#*# <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
#*#<tex> G</tex> нечетный цикл<br />
#<tex>\Delta(G) \ge 3</tex>, тогда:<br />
##Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex> {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> {{---}} две компоненты связности, полученные при удалении вершины <tex>v</tex>. Тогда, по выше доказанной лемме эти компоненты можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов. Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
##Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность. Пусть <tex>G_1,G_2</tex> {{---}} два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая.<br />
### Если сумма степеней вершин <tex>u,v</tex> в каждом из подграфов <tex>G_1,G_2</tex> меньше <tex>2(\Delta-1)</tex>. Тогда, в одном из данных подграфах <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex>. Тоесть, эти подграфы можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов. А из этого следует, что граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
### Если сумма степеней вершин <tex>u,v</tex> в одном из подграфов <tex>G_1,G_2</tex> равна <tex>2(\Delta-1)</tex>. Тогда, степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex>, рассмотрим например, что в подграфе <tex>G_1</tex>:<br />
###* Если вершины <tex>u,v</tex> смежны с вершиной <tex>p \in G_2</tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где степени вершин <tex>u,v</tex> равны <tex>1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета. Следовательно, можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
###*[[Файл:Brooks_2.png|400px|thumb|Алгоритм раскраски. Третий случай, пятый шаг]]Если вершины <tex>u,v</tex> смежны с вершинами <tex>u_1,v_1 \in G_2</tex> соответственно, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>. Заметим, что при удалении этих вершин граф потеряет связность, и между ними нет ребра. При этом, сумма степеней новой пары вершин в каждой из компонент, полученных после их удаления, меньше <tex>2(\Delta-1)</tex>. Поэтому, если для этой пары вершин провести рассуждения аналогичные тем, которые проводились для вершин <tex> v,u</tex>, получится, что граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta </tex> цветов.<br />
##Если <tex>G</tex> является <tex>k</tex>-связным графом, где <tex>k > 2</tex>. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случае <tex>G = K_n</tex>. Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2}</tex>, где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Теперь пусть <tex> v_{n-1} = v</tex>, и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке, начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски, где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей. Следовательно, вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Вершину <tex>w</tex> мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30420Теорема Брукса2013-01-19T22:15:27Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на пятом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
Для доказательства теоремы рассмотрим несколько случаев:<br />
#<tex>\Delta(G) \le 2</tex>, тогда:<br />
#*Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#*Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#*Если <tex> \Delta = 2</tex>, то:<br />
#*# <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
#*#<tex> G</tex> нечетный цикл<br />
#<tex>\Delta(G) \ge 3</tex>, тогда:<br />
##Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex> {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> {{---}} две компоненты связности, полученные при удалении вершины <tex>v</tex>. Тогда, по выше доказанной лемме эти компоненты можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов. Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
##Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность . Пусть <tex>G_1,G_2</tex> {{---}} два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая.<br />
### Если сумма степеней вершин <tex>u,v</tex> в каждом из подграфов <tex>G_1,G_2</tex> меньше <tex>2(\Delta-1)</tex>. Тогда, в одном из данных подграфах <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex>. Тоесть, эти подграфы можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов. А из этого следует, что граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
### Если сумма степеней вершин <tex>u,v</tex> в одном из подграфов <tex>G_1,G_2</tex> равна <tex>2(\Delta-1)</tex>. Тогда, степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex>, рассмотрим например,что в подграфе <tex>G_1</tex>:<br />
###* Если вершины <tex>u,v</tex> смежны с вершиной <tex>p \in G_2</tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где степени вершин <tex>u,v</tex> равны <tex>1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета. Следовательно, можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
###*[[Файл:Brooks_2.png|400px|thumb|Алгоритм раскраски. Третий случай, пятый шаг]]Если вершины <tex>u,v</tex> смежны с вершинами <tex>u_1,v_1 \in G_2</tex> соответственно, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>. Заметим, что при удалении этих вершин граф потеряет связность, и между ними нет ребра. При этом, сумма степеней новой пары вершин в каждой из компонент, полученных после их удаления, меньше <tex>2(\Delta-1)</tex>. Поэтому, если для этой пары вершин провести рассуждения аналогичные тем, которые проводились для вершин <tex> v,u</tex>, получится, что граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta </tex> цветов.<br />
##Если <tex>G</tex> является <tex>k</tex>-связным графом, где <tex>k > 2</tex>. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случае <tex>G = K_n</tex>. Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2}</tex>, где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Теперь пусть <tex> v_{n-1} = v</tex>, и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке, начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски, где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей. Следовательно, вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Вершину <tex>w</tex> мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30418Теорема Брукса2013-01-19T22:06:48Z<p>Danek g30: /* Вспомогательная Лемма */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на пятом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
Для доказательства теоремы рассмотрим несколько случаев:<br />
#<tex>\Delta(G) \le 2</tex>, тогда:<br />
#*Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#*Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#*Если <tex> \Delta = 2</tex>, то:<br />
#*# <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
#*#<tex> G</tex> нечетный цикл<br />
#<tex>\Delta(G) \ge 3</tex>, тогда:<br />
##Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex> {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> {{---}} две компоненты связности, полученные при удалении вершины <tex>v</tex>. Тогда, по выше доказанной лемме эти компоненты можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов. Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
##Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность . Пусть <tex>G_1,G_2</tex> {{---}} два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая.<br />
### Если сумма степеней вершин <tex>u,v</tex> в каждом из подграфов <tex>G_1,G_2</tex> меньше <tex>2(\Delta-1)</tex>. Тогда, в одном из данных подграфах <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex>. Тоесть, эти подграфы можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов. А из этого следует, что граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
### Если сумма степеней вершин <tex>u,v</tex> в одном из подграфов <tex>G_1,G_2</tex> равна <tex>2(\Delta-1)</tex>. Тогда, степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex>, рассмотрим например,что в подграфе <tex>G_1</tex>:<br />
###* Если вершины <tex>u,v</tex> смежны с вершиной <tex>p \in G_2</tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где степени вершин <tex>u,v</tex> равны <tex>1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета. Следовательно, можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
###*[[Файл:Brooks_2.png|400px|thumb|Алгоритм раскраски. Третий случай, пятый шаг]]Если вершины <tex>u,v</tex> смежны с вершинами <tex>u_1,v_1 \in G_2</tex> соответственно, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>. Заметим, что при удалении этих вершин граф потеряет связность, и между ними нет ребра. При этом, сумма степеней новой пары вершин в каждой из компонент, полученных после их удаления, меньше <tex>2(\Delta-1)</tex>. Поэтому, если для этой пары вершин провести рассуждения аналогичные тем, которые проводились для вершин <tex> v,u</tex>, получится, что граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta </tex> цветов.<br />
##Если <tex>G</tex> является <tex>k</tex>-связным графом, где <tex>k > 2</tex>. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случае <tex>G = K_n</tex>. Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2}</tex>, где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Теперь пусть <tex> v_{n-1} = v</tex>, и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке, начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски, где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно, вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Вершину <tex>w</tex> мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30417Теорема Брукса2013-01-19T22:01:35Z<p>Danek g30: /* Теорема */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
Для доказательства теоремы рассмотрим несколько случаев:<br />
#<tex>\Delta(G) \le 2</tex>, тогда:<br />
#*Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#*Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#*Если <tex> \Delta = 2</tex>, то:<br />
#*# <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
#*#<tex> G</tex> нечетный цикл<br />
#<tex>\Delta(G) \ge 3</tex>, тогда:<br />
##Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex> {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> {{---}} две компоненты связности, полученные при удалении вершины <tex>v</tex>. Тогда, по выше доказанной лемме эти компоненты можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов. Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
##Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность . Пусть <tex>G_1,G_2</tex> {{---}} два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая.<br />
### Если сумма степеней вершин <tex>u,v</tex> в каждом из подграфов <tex>G_1,G_2</tex> меньше <tex>2(\Delta-1)</tex>. Тогда, в одном из данных подграфах <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex>. Тоесть, эти подграфы можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов. А из этого следует, что граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
### Если сумма степеней вершин <tex>u,v</tex> в одном из подграфов <tex>G_1,G_2</tex> равна <tex>2(\Delta-1)</tex>. Тогда, степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex>, рассмотрим например,что в подграфе <tex>G_1</tex>:<br />
###* Если вершины <tex>u,v</tex> смежны с вершиной <tex>p \in G_2</tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где степени вершин <tex>u,v</tex> равны <tex>1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета. Следовательно, можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
###*[[Файл:Brooks_2.png|400px|thumb|Алгоритм раскраски. Третий случай, пятый шаг]]Если вершины <tex>u,v</tex> смежны с вершинами <tex>u_1,v_1 \in G_2</tex> соответственно, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>. Заметим, что при удалении этих вершин граф потеряет связность, и между ними нет ребра. При этом, сумма степеней новой пары вершин в каждой из компонент, полученных после их удаления, меньше <tex>2(\Delta-1)</tex>. Поэтому, если для этой пары вершин провести рассуждения аналогичные тем, которые проводились для вершин <tex> v,u</tex>, получится, что граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta </tex> цветов.<br />
##Если <tex>G</tex> является <tex>k</tex>-связным графом, где <tex>k > 2</tex>. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случае <tex>G = K_n</tex>. Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2}</tex>, где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Теперь пусть <tex> v_{n-1} = v</tex>, и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке, начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски, где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно, вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Вершину <tex>w</tex> мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30401Теорема Брукса2013-01-19T19:19:58Z<p>Danek g30: /* Теорема */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
Для доказательства теоремы рассмотрим несколько случаев:<br />
#<tex>\Delta(G) \le 2</tex>, тогда:<br />
#*Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#*Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#*Если <tex> \Delta = 2</tex>, то:<br />
#*# <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
#*#<tex> G</tex> нечетный цикл<br />
#<tex>\Delta(G) \ge 3</tex>, тогда:<br />
##Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex> {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> {{---}} две компоненты связности, полученные при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
##Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> {{---}} два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая.<br />
### Если сумма степеней вершин <tex>u,v</tex> в каждом из подграфов <tex>G_1,G_2</tex> меньше <tex>2(\Delta-1)</tex>. Тогда, в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex>.Тоесть, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует, что граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
### Если сумма степеней вершин <tex>u,v</tex> в одном из подграфов <tex>G_1,G_2</tex> равна <tex>2(\Delta-1)</tex>.Тогда, степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex>, например, в подграфе <tex>G_1</tex>:<br />
###* Если вершины <tex>u,v</tex> смежны с вершиной <tex>p \in G_2</tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где степени вершин <tex>u,v</tex> равны <tex>1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета. Следовательно, можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
###*[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3-его случая на 5ом шаге]]Если вершины <tex>u,v</tex> смежны с вершинами <tex>u_1,v_1 \in G_2</tex> соответственно, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность, и между ними нет ребра и сумма степеней новой пары вершин в каждой из компонент полученных после их удаления меньше <tex>2(\Delta-1)</tex>.Поэтому,если для этой пары вершин провести рассуждения аналогичные тем, которые проводились для вершин <tex> v,u</tex>,получится, что граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta </tex> цветов.<br />
##Если <tex>G</tex> является <tex>k</tex>-связным графом, где <tex>k > 2</tex>. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случае <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2}</tex>, где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке, начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски, где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно, вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Вершину <tex>w</tex> мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30156Теорема Брукса2013-01-17T19:34:05Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: ((p,u) \in E) \land ((p,v) \in E) </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3-его случая на 5ом шаге]]<tex>\exists u_1,v_1 \in G_2: ((u,u_1) \in E) \land ((v,v_1) \in E) \land (u_1 \neq v_1) </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#Если вышеописанные случаи не подходят, то граф <tex>G</tex> является <tex>k</tex>-связным. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30154Теорема Брукса2013-01-17T19:27:59Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: (pu \in E) \land (pv \in E) </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3-его случая на 5ом шаге]]<tex>\exists u_1,v_1 \in G_2: (uu_1 \in E) \land (vv_1 \in E) \land (u_1 \neq v_1) </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#Если вышеописанные случаи не подходят, то граф <tex>G</tex> является <tex>k</tex>-связным. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30153Теорема Брукса2013-01-17T19:25:46Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если <tex>G</tex> является вершинно двусвязным графом. Тогда, <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: (pu \in E) \land (pv \in E) </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: (uu_1 \in E) \land (vv_1 \in E) \land (u_1 \neq v_1) </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3-его случая на 5ом шаге]]Если вышеописанные случаи не подходят, то граф <tex>G</tex> является <tex>k</tex>-связным. Тогда, рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30152Теорема Брукса2013-01-17T19:06:21Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: (pu \in E) \land (pv \in E) </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: (uu_1 \in E) \land (vv_1 \in E) \land (u_1 \neq v_1) </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3-его случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30151Теорема Брукса2013-01-17T19:04:39Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: (pu \in E) \land (pv \in E) </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: (uu_1 \in E) \land (vv_1 \in E) \land (u_1 \neq v_1) </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30150Теорема Брукса2013-01-17T19:02:19Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:(G_1 \cap G_2 = \{v,u\}) \land (G_1 \cup G_2 = G)</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: (pu \in E) \land (pv \in E) </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: (uu_1 \in E) \land (vv_1 \in E) \land (u_1 \neq v_1) </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30149Теорема Брукса2013-01-17T18:56:12Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u \le \Delta - 2 </tex> или <tex> deg\ v \le \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30148Теорема Брукса2013-01-17T18:44:26Z<p>Danek g30: /* Теорема */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в не более чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30147Теорема Брукса2013-01-17T18:38:34Z<p>Danek g30: /* Вспомогательная Лемма */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей (т.к <tex> deg(v_{n - i+1}) \le \Delta(G)</tex> и предок данной вершины в дереве bfs еще не покрашен, а если предка нет, то это вершина и есть <tex>w</tex>), следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=30146Теорема Брукса2013-01-17T18:26:11Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>w</tex> степени <tex> deg\ w < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|400px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|400px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B5_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D1%85%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B0&diff=29780Верхние и нижние оценки хроматического числа2013-01-14T07:44:02Z<p>Danek g30: /* Полезные материалы */</p>
<hr />
<div>== Верхняя оценка длиной максимального нечетного цикла ==<br />
{{Лемма <br />
|about = оценка хроматического числа длиной максимального нечётного цикла<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - длина максимального простого цикла графа <tex>G</tex>, <tex>\Delta \ge 3</tex>. Тогда, <tex>\chi(G) \le \Delta(G) + 1</tex>. <br />
|proof=<br />
Опишем на графе следующий алгоритм раскраски:<br />
*Из произвольной вершины <tex>v</tex> запусти алгоритм поиска в глубину. Пусть <tex>T</tex> {{---}} дерево обхода глубина графа <tex>G</tex> с корнем в вершине <tex>v</tex>.<br />
*Произвольную вершину <tex>u</tex>, покрасим в цвет <tex>dist(v,u)</tex> <tex> \mod </tex> <tex> (\Delta + 1)</tex>, где <tex>dist(v,u)</tex>{{---}} расстояние между вершинами <tex>u,v</tex> в графe <tex>T</tex>.<br />
Докажем от противного, что после выполнения описанного алгоритма граф <tex>G</tex> будет правильно раскрашен.<br />
Предположим, что после выполнения алгоритма покраски в графе существует ребро, соединяющее вершины <tex> a,b </tex> одного цвета.Пусть <tex>color(v)</tex> {{---}} цвет вершины после выполнения алгоритма раскраски.Заметим, что для произвольной вершины графа <tex>p</tex>, <tex>dist(v,p) = color(p) + n(\Delta + 1)</tex> , <tex>n \ge 0 </tex>.Тогда, <tex>dist(v,a) - dist(v,b) = k(\Delta + 1)</tex>.Поскольку в дереве dfs между вершинами находящимися на одинаковом расстоянии от корня нет перекрестных ребер, то <tex> k \ge 1</tex>. То есть, вершины <tex>a,b</tex> лежат на простом цикле длины по крайней мере <tex>\Delta + 2</tex>. Получается противоречие с условием потому, что длина максимального простого цикла получается больше чем <tex>\Delta</tex>.<br />
Таким образом в графе <tex>G</tex> после выполнения алгоритма раскраски нет вершин одного цвета соединенных ребром и при этом каждая вершина покрашена в один из <tex>\Delta + 1</tex>, то есть <tex>G</tex> правильно раскрашен в <tex>\Delta + 1</tex> цвет, следовательно <tex>\chi(G) \le \Delta(G) + 1</tex><br />
<br />
<br />
}}<br />
==Нижняя оценка числом внутренней устойчивости ==<br />
{{Определение<br />
<br />
|definition=<br />
Подмножество <tex>S</tex> вершин графа <tex>G</tex> называется '''внутренне устойчивым''', если любые две вершины из <tex>S</tex> не смежны в <tex>G</tex> <br />
}}<br />
<br />
{{Определение<br />
<br />
|definition=<br />
'''Число внутренней устойчивости''' <tex>\alpha(G)</tex> графа <tex>G(V,E)</tex> {{---}} <tex>max \{|S|:S \in V</tex> и S внутренне устойчиво в G<tex>\}</tex><br />
}}<br />
{{Лемма <br />
|about = нижняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами .Тогда, <tex>n/\alpha \le \chi(G)</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.Каждое из <tex>V_i</tex> {{---}} внутренне устойчивое множество (поскольку вершины множества покрашены в один цвет при правильной покраски графа <tex>G</tex>, следовательно, они попарно не смежны внутри множества ).<br />
Заметим, что для произвольного <tex>i</tex>, <tex>|V_i| \le \alpha</tex> (т.к <tex>V_i</tex> внутренне устойчиво). То есть, <tex>\sum\limits^{\chi}_{i = 1}|V_i| = n \le \chi \alpha </tex>, следовательно <tex>n / \alpha \le \chi</tex>.<br />
}}<br />
== Верхняя оценка количеством ребер ==<br />
{{Лемма <br />
|about = верхняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>m</tex> ребрами.Тогда, <tex>\chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}}</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>. Заметим, что между любыми двумя различными множествами существует хотя бы одно ребро (в противном случаи эти множества можно было бы покрасить в один цвет).<br />
Тогда, <tex>\frac{1}{2}\chi(\chi-1) \le m \Rightarrow (\chi - \frac{1}{2})^2 \le 2m + \frac{1}{4} \Rightarrow \chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}} </tex>.<br />
}}<br />
== Нижняя оценка количеством ребер и количеством вершин ==<br />
{{Лемма <br />
|about = нижняя оценка Геллера<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами и <tex>m</tex> ребрами .Тогда, <tex>\frac{n^2}{n^2 - 2m} \le \chi(G) </tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.<br />
<tex>m \le \frac{1}{2}n(n - 1) - \frac{1}{2}\sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1) \Rightarrow \frac{n^2}{n^2 - 2m} \le \frac{n^2}{n^2 -n(n - 1) + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{n + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i| + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} = \frac{(\sum\limits^{\chi}_{i = 1}|V_i|)^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} \le \chi</tex>.<br />
}}<br />
== Полезные материалы ==<br />
* [http://www.ucdenver.edu/academics/colleges/CLAS/Departments/math/students/alumni/Documents/Student%20Theses/Mitchell_MSThesis.pdf Множество разных оценок для хроматических чисел]<br />
* [http://geometr.freehostia.com/sravnenie_summ.html Сравнение квадрата суммы и суммы квадратов действительных чисел]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&diff=29713Дискретная математика, алгоритмы и структуры данных2013-01-14T00:33:20Z<p>Danek g30: /* Раскраски графов */</p>
<hr />
<div>[[Категория:Дискретная математика и алгоритмы]]<br />
[[Категория: Алгоритмы и структуры данных]]<br />
<br />
Убедительная просьба читать [[Обсуждение:Дискретная_математика_и_алгоритмы | правила оформления вики-конспектов]].<br />
<br />
= Первый семестр =<br />
<br />
== Отношения ==<br />
*[[Определение отношения]]<br />
*[[Степень отношений]]<br />
*[[Композиция отношений|Композиция отношений. Обратное отношение]]<br />
*[[Рефлексивное отношение|Рефлексивное отношение. Антирефлексивное отношение.]]<br />
*[[Симметричное отношение]]<br />
*[[Антисимметричное отношение]]<br />
*[[Транзитивное отношение]]<br />
*[[Транзитивное замыкание|Транзитивное замыкание отношения]]<br />
*[[Алгоритм Флойда — Уоршелла|Алгоритм Флойда-Уоршалла построения транзитивного замыкания отношения]]<br />
*[[Транзитивный остов]]<br />
*[[Отношение порядка]]<br />
*[[Отношение эквивалентности]]<br />
<br />
== Булевы функции ==<br />
*[[Определение булевой функции]]<br />
*[[Суперпозиции]]<br />
*[[ДНФ]]<br />
*[[КНФ]]<br />
*[[Полином Жегалкина]]<br />
*[[Полные системы функций. Теорема Поста о полной системе функций]]<br />
*[[Сокращенная и минимальная ДНФ]]<br />
*[[Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно]]<br />
*[[Специальные формы КНФ|Специальные формы КНФ: КНФ в форме Хорна и КНФ в форме Крома]]<br />
*[[Преобразование Мёбиуса для получения коэффициентов полинома Жегалкина]]<br />
*[[Представление функции класса DM с помощью медианы]]<br />
*[[Пороговая функция]]<br />
<br />
== Схемы из функциональных элементов ==<br />
*[[Реализация булевой функции схемой из функциональных элементов]]<br />
*[[Cумматор]]<br />
*[[Каскадный сумматор]]<br />
*[[Двоичный каскадный сумматор]]<br />
*[[Реализация вычитания сумматором]]<br />
*[[Матричный умножитель]]<br />
*[[Дерево Уоллеса]]<br />
<br />
== Представление информации ==<br />
*[[Кодирование информации]]<br />
*[[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]<br />
*[[Представление вещественных чисел]]<br />
*[[Представление символов, таблицы кодировок]]<br />
<br />
== Алгоритмы сжатия ==<br />
*[[Алгоритм Хаффмана]]<br />
*[[Алгоритм LZW]]<br />
*[[Алгоритмы LZ77 и LZ78]]<br />
*[[Преобразование Барроуза-Уиллера]]<br />
*[[Обратное преобразование Барроуза-Уиллера]]<br />
*[[Преобразование MTF]]<br />
*[[Расстояние Хэмминга]]<br />
*[[Избыточное кодирование, код Хэмминга]]<br />
*[[Неравенство Крафта]]<br />
*[[Неравенство Макмиллана]]<br />
*[[Алгоритм Ху-Таккера]]<br />
<br />
== Комбинаторика ==<br />
*[[Комбинаторные объекты]]<br />
*[[Лексикографический порядок]]<br />
*[[Формула включения-исключения]]<br />
*[[Генерация комбинаторных объектов в лексикографическом порядке]]<br />
*[[Получение номера по объекту]]<br />
*[[Получение объекта по номеру]]<br />
*[[Получение следующего объекта]]<br />
*[[Коды Грея]]<br />
*[[Коды Грея для перестановок]]<br />
*[[Коды антигрея]]<br />
*[[Цепные коды]]<br />
*[[Правильные скобочные последовательности]]<br />
*[[Действие перестановки на набор из элементов, представление в виде циклов]]<br />
*[[Метод генерации случайной перестановки, алгоритм Фишера-Йетса]]<br />
*[[Методы генерации случайного сочетания]]<br />
*[[Таблица инверсий]]<br />
*[[Умножение перестановок, обратная перестановка, группа перестановок]]<br />
*[[Теорема Кэли]]<br />
*[[Матричное представление перестановок]]<br />
*[[Задача о минимуме/максимуме скалярного произведения]]<br />
*[[Задача о монотонных подпоследовательностях, теорема о связи длины НВП и НУП]]<br />
*[[Нахождение количества разбиений числа на слагаемые | Нахождение количества разбиений числа на слагаемые. Пентагональная теорема Эйлера]]<br />
*[[Производящая функция]]<br />
*[[Задача об ожерельях]]<br />
<br />
== [[Динамическое программирование]] ==<br />
*[[Кратчайший путь в ациклическом графе]]<br />
*[[Задача о расстановке знаков в выражении]]<br />
*[[Задача о наибольшей общей подпоследовательности]]<br />
*[[Задача о порядке перемножения матриц]]<br />
*[[Задача о наибольшей возрастающей подпоследовательности]]<br />
*[[Задача о паросочетании максимального веса в дереве, амортизированные оценки для ДП на дереве]]<br />
*[[Метод четырех русских для умножения матриц]]<br />
*[[Применение метода четырех русских в задачах ДП на примере задачи о НОП]]<br />
*[[Задача коммивояжера, ДП по подмножествам]]<br />
*[[Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами]]<br />
*[[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера]]<br />
*[[Задача о расстоянии Дамерау-Левенштейна]]<br />
*[[Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза]]<br />
*[[Задача о наибольшей подпоследовательности-палиндроме]]<br />
*[[Meet-in-the-middle]]<br />
*[[Динамическое программирование по профилю]]<br />
*[[Задача о рюкзаке]]<br />
*[[Динамика по поддеревьям]]<br />
<br />
== Теория вероятностей ==<br />
*[[Вероятностное пространство, элементарный исход, событие]]<br />
*[[Независимые события]]<br />
*[[Условная вероятность]]<br />
*[[Формула Байеса]]<br />
*[[Формула полной вероятности]]<br />
*[[Дискретная случайная величина]]<br />
*[[Независимые случайные величины]]<br />
*[[Математическое ожидание случайной величины]]<br />
*[[Дисперсия случайной величины]]<br />
*[[Ковариация случайных величин]]<br />
*[[Корреляция случайных величин]]<br />
*[[Энтропия случайного источника]]<br />
*[[Симуляция одним распределением другого]]<br />
*[[Арифметическое кодирование]]<br />
*[[Парадоксы теории вероятностей]]<br />
*[[Схема Бернулли]]<br />
<br />
== Марковские цепи ==<br />
<br />
* [[Марковская цепь]]<br />
* [[Теорема о поглощении]]<br />
* [[Фундаментальная матрица]]<br />
* [[Математическое ожидание времени поглощения]]<br />
* [[Расчет вероятности поглощения в состоянии]]<br />
* [[Эргодическая марковская цепь]]<br />
* [[Регулярная марковская цепь]]<br />
* [[Примеры использования Марковских цепей]]<br />
* [[Алгоритм Витерби]]<br />
<br />
= Второй семестр =<br />
<br />
== Амортизационный анализ ==<br />
* [[Амортизационный анализ]]<br />
* [[Саморасширяющийся массив]]<br />
* [[Массив с увеличением/уменьшением размера]]<br />
* [[Список]]<br />
* [[Стек]]<br />
* [[Очередь]]<br />
* [[Персистентный стек]]<br />
* [[Персистентный дек]]<br />
<br />
== Приоритетные очереди ==<br />
<br />
* [[Двоичная куча]]<br />
* [[Биномиальная куча]]<br />
* [[Фибоначчиева куча]]<br />
<br />
== Система непересекающихся множеств ==<br />
* [[СНМ (наивные реализации) | Наивные реализации]]<br />
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]<br />
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]<br />
<br />
== Поисковые структуры данных ==<br />
* [[Упорядоченное множество]]<br />
* [[Дерево поиска, наивная реализация]]<br />
* [[АВЛ-дерево]]<br />
* [[2-3 дерево]]<br />
* [[B-дерево]]<br />
* [[Красно-черное дерево]]<br />
* [[Декартово дерево]]<br />
* [[Декартово дерево по неявному ключу]]<br />
* [[Splay-дерево]]<br />
* [[Рандомизированное бинарное дерево поиска]]<br />
* [[Дерево ван Эмде Боаса]]<br />
* [[Список с пропусками]]<br />
<br />
== Дерево отрезков ==<br />
<br />
* [[Статистики на отрезках. Корневая эвристика]]<br />
* [[Дерево отрезков. Построение]]<br />
* [[Реализация запроса в дереве отрезков сверху]]<br />
* [[Реализация запроса в дереве отрезков снизу]]<br />
* [[Несогласованные поддеревья. Реализация массового обновления]]<br />
* [[Многомерное дерево отрезков]]<br />
* [[Сжатое многомерное дерево отрезков]]<br />
<br />
== Дерево Фенвика ==<br />
* [[Дерево Фенвика]]<br />
* [[Встречное дерево Фенвика]]<br />
* [[Дерево Фенвика для некоммутативных операций]]<br />
* [[Многомерное дерево Фенвика]]<br />
<br />
== Хеширование ==<br />
* [[Хеш-таблица]]<br />
* [[Разрешение коллизий]]<br />
* [[Хеширование кукушки]]<br />
* [[Идеальное хеширование]]<br />
* [[Перехеширование. Амортизационный анализ]]<br />
* [[Фильтр Блума]]<br />
* [[Универсальное семейство хеш-функций]]<br />
<br />
== [[Сортировка]] ==<br />
* [[Сортировка выбором]]<br />
* [[Сортировка пузырьком]]<br />
* [[Сортировка вставками]]<br />
* [[Сортировка кучей]]<br />
* [[Быстрая сортировка]]<br />
* [[Сортировка слиянием]]<br />
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]<br />
* [[Теорема о нижней оценке для сортировки сравнениями]]<br />
* [[Сортировка подсчетом]]<br />
* [[Сортировка подсчетом сложных объектов]]<br />
* [[Цифровая сортировка]]<br />
* [[Карманная сортировка]]<br />
* [[Поиск k-ой порядковой статистики]]<br />
* [[Поиск k-ой порядковой статистики за линейное время]]<br />
* [[Сортировка Хана]]<br />
<br />
== Сортирующие сети ==<br />
* [[Сортирующие сети]]<br />
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]<br />
* [[Сортирующие сети для квадратичных сортировок]]<br />
* [[Сеть Бетчера]]<br />
<br />
== Алгоритмы поиска ==<br />
* [[Целочисленный двоичный поиск]]<br />
* [[Вещественный двоичный поиск]]<br />
* [[Троичный поиск]]<br />
* [[Поиск с помощью золотого сечения]]<br />
* [[Интерполяционный поиск]]<br />
<br />
== Связь между структурами данных ==<br />
* [[Связь между структурами данных]]<br />
<br />
= Третий семестр =<br />
<br />
== Основные определения теории графов ==<br />
* [[Основные определения теории графов|Основные определения: граф, ребро, вершина, степень, петля, путь, цикл]]<br />
* [[Лемма о рукопожатиях]]<br />
* [[Теорема о существовании простого пути в случае существования пути]]<br />
* [[Теорема о существовании простого цикла в случае существования цикла]]<br />
* [[Матрица смежности графа]]<br />
* [[Связь степени матрицы смежности и количества путей]]<br />
* [[Матрица инцидентности графа]]<br />
* [[Циклическое пространство графа]]<br />
* [[Фундаментальные циклы графа]]<br />
* [[Дерево, эквивалентные определения]]<br />
* [[Дополнительный, самодополнительный граф]]<br />
<br />
== Связность в графах ==<br />
* [[Отношение связности, компоненты связности]]<br />
* [[Отношение реберной двусвязности]]<br />
* [[Отношение вершинной двусвязности]]<br />
* [[Граф компонент реберной двусвязности]]<br />
* [[Граф блоков-точек сочленения]]<br />
* [[Точка сочленения, эквивалентные определения]]<br />
* [[Мост, эквивалентные определения]]<br />
* [[k-связность]]<br />
* [[Теорема Менгера]]<br />
* [[Теорема Менгера, альтернативное доказательство]]<br />
* [[Вершинная, реберная связность, связь между ними и минимальной степенью вершины]]<br />
<br />
== Остовные деревья ==<br />
* [[Матрица Кирхгофа]]<br />
* [[Связь матрицы Кирхгофа и матрицы инцидентности]]<br />
* [[Подсчет числа остовных деревьев с помощью матрицы Кирхгофа]]<br />
* [[Количество помеченных деревьев]]<br />
* [[Коды Прюфера]]<br />
<br />
== Обходы графов ==<br />
* [[Эйлеров цикл, Эйлеров путь, Эйлеровы графы, Эйлеровость орграфов]]<br />
* [[Покрытие ребер графа путями]]<br />
* [[Алгоритм построения Эйлерова цикла]]<br />
* [[Произвольно вычерчиваемые из заданной вершины графы]]<br />
* [[Гамильтоновы графы]]<br />
* [[Теорема Хватала]]<br />
* [[Теорема Дирака]]<br />
* [[Теорема Оре]]<br />
* [[Турниры]]<br />
* [[Теорема Редеи-Камиона]]<br />
<br />
== Укладки графов ==<br />
* [[Укладка графа на плоскости]]<br />
* [[Формула Эйлера]]<br />
* [[Непланарность K5 и K3,3|Непланарность <tex>K_5</tex> и <tex>K_{3,3}</tex>]]<br />
* [[Укладка дерева]]<br />
* [[Укладка графа с планарными компонентами реберной двусвязности]]<br />
* [[Укладка графа с планарными компонентами вершинной двусвязности]]<br />
* [[Теорема Понтрягина-Куратовского]]<br />
* [[Двойственный граф планарного графа]]<br />
<br />
== Раскраски графов ==<br />
* [[Раскраска графа]]<br />
* [[Двудольные графы и раскраска в 2 цвета]]<br />
* [[Хроматический многочлен]]<br />
** [[Хроматический многочлен#Хроматический многочлен полного графа|Хроматический многочлен полного графа]]<br />
** [[Хроматический многочлен#Хроматический многочлен пустого графа|Хроматический многочлен пустого графа]]<br />
** [[Хроматический многочлен#Хроматический многочлен дерева|Хроматический многочлен дерева]]<br />
** [[Хроматический многочлен#Рекуррентные формулы для хроматических многочленов|Рекуррентные формулы для хроматических многочленов]]<br />
** [[Хроматический многочлен#Коэффициенты хроматического многочлена|Коэффициенты хроматического многочлена: старший, второй коэффициенты, знакопеременность]]<br />
* [[Формула Зыкова]]<br />
* [[Формула Уитни]]<br />
* [[Теорема Брукса]]<br />
* [[Верхние и нижние оценки хроматического числа]]<br />
<br />
== Обход в глубину ==<br />
* [[Обход в глубину, цвета вершин]]<br />
* [[Лемма о белых путях]]<br />
* [[Использование обхода в глубину для проверки связности]]<br />
* [[Использование обхода в глубину для поиска цикла в ориентированном графе]]<br />
* [[Использование обхода в глубину для топологической сортировки]]<br />
* [[Использование обхода в глубину для поиска компонент сильной связности]]<br />
* [[Использование обхода в глубину для поиска точек сочленения]]<br />
* [[Построение компонент вершинной двусвязности]]<br />
* [[Использование обхода в глубину для поиска мостов]]<br />
* [[Построение компонент реберной двусвязности]]<br />
<br />
== Кратчайшие пути в графах ==<br />
* [[Обход в ширину]]<br />
* [[Алгоритм Форда-Беллмана]]<br />
* [[Алгоритм Дейкстры]]<br />
* [[Алгоритм Флойда]]<br />
* [[Алгоритм A*]]<br />
* [[Алгоритм Джонсона]]<br />
<br />
== Построение остовных деревьев ==<br />
* [[Лемма о безопасном ребре]]<br />
* [[Алгоритм Прима]]<br />
* [[Алгоритм Краскала]]<br />
* [[Алгоритм Борувки]]<br />
* [[Критерий Тарьяна минимальности остовного дерева|Теорема Тарьяна (критерий минимальности остовного дерева)]]<br />
* [[Алгоритм двух китайцев]]<br />
<br />
== Задача о паросочетании ==<br />
* [[Теорема о максимальном паросочетании и дополняющих цепях]]<br />
* [[Алгоритм Форда-Фалкерсона для поиска максимального паросочетания]]<br />
* [[Алгоритм Куна для поиска максимального паросочетания]]<br />
* [[Теорема Холла]]<br />
* [[Связь максимального паросочетания и минимального вершинного покрытия в двудольных графах]]<br />
* [[Связь вершинного покрытия и независимого множества]]<br />
* [[Матрица Татта и связь с размером максимального паросочетания в двудольном графе]]<br />
* [[Алгоритм вырезания соцветий|Паросочетания в недвудольных графах. Алгоритм вырезания соцветий]]<br />
<br />
== Задача о максимальном потоке ==<br />
* [[Определение сети, потока]]<br />
* [[Разрез, лемма о потоке через разрез]]<br />
* [[Дополняющая сеть, дополняющий путь]]<br />
* [[Лемма о сложении потоков]]<br />
* [[Теорема Форда-Фалкерсона]]<br />
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]<br />
* [[Алоритм Эдмондса-Карпа]]<br />
* [[Алгоритм масштабирования потока]]<br />
* [[Блокирующий поток]]<br />
* [[Схема алгоритма Диница]]<br />
* [[Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями]]<br />
* [[Алгоритм поиска блокирующего потока в ациклической сети]]<br />
* [[Метод проталкивания предпотока]]<br />
* [[Алгоритм "поднять-в-начало"]]<br />
* [[Теорема о декомпозиции]]<br />
* [[Теорема о декомпозиционном барьере]]<br />
* [[Циркуляция потока]]<br />
<br />
== Задача о потоке минимальной стоимости ==<br />
* [[Поток минимальной стоимости]]<br />
* [[Теорема Форда-Фалкерсона о потоке минимальной стоимости]]<br />
* [[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]<br />
* [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]<br />
* [[Использование потенциалов Джонсона при поиске потока минимальной стоимости]]<br />
* [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]<br />
* [[Венгерский алгоритм решения задачи о назначениях]]<br />
<br />
= Четвертый семестр =<br />
<br />
== Основные определения. Простые комбинаторные свойства слов ==<br />
* [[Основные определения, связанные со строками]]<br />
* [[Период и бордер, их связь]]<br />
* [[Слово Фибоначчи]]<br />
* [[Слово Туэ-Морса]]<br />
<br />
== Поиск подстроки в строке ==<br />
* [[Наивный алгоритм поиска подстроки в строке]]<br />
* [[Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]]<br />
* [[Поиск наибольшей общей подстроки двух строк с использованием хеширования]]<br />
* [[Префикс-функция]]<br />
* [[Алгоритм Кнута-Морриса-Пратта]]<br />
* [[Z-функция]]<br />
* [[Автомат для поиска образца в тексте]]<br />
* [[Бор]]<br />
* [[Алгоритм Ахо-Корасик]]<br />
<br />
== Суффиксное дерево ==<br />
* [[Суффиксный бор]]<br />
* [[Сжатое суффиксное дерево]]<br />
* [[Алгоритм Укконена]]<br />
<br />
== Суффиксный массив ==<br />
* [[Суффиксный массив]]<br />
* [[Построение суффиксного массива с помощью стандартных методов сортировки]]<br />
* [[Цифровая сортировка]]<br />
* [[Алгоритм цифровой сортировки суффиксов циклической строки]]<br />
* [[Алгоритм Касаи и др.]]<br />
* [[Алгоритм Карккайнена-Сандерса]]<br />
* [[Алгоритм поиска подстроки в строке с помощью суффиксного массива]]<br />
<br />
== Задача о наименьшем общем предке ==<br />
* [[Метод двоичного подъема]]<br />
* [[Сведение задачи LCA к задаче RMQ]]<br />
* [[Решение RMQ с помощью разреженной таблицы]]<br />
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четырех русских)<br />
* [[Алгоритм Шибера-Вишкина]]<br />
* [[Сведение задачи RMQ к задаче LCA]]<br />
<br />
== Матроиды ==<br />
* [[Определение матроида]]<br />
* [[Примеры матроидов]]<br />
* [[Прямая сумма матроидов]]<br />
* [[Теорема Радо-Эдмондса (жадный алгоритм)]]<br />
* [[Жадный алгоритм поиска базы минимального веса]]<br />
* [[Теорема о базах]]<br />
* [[Аксиоматизация матроида базами]]<br />
* [[Теорема о циклах]]<br />
* [[Аксиоматизация матроида циклами]]<br />
* [[Ранговая функция, полумодулярность]]<br />
* [[Двойственный матроид]]<br />
* [[Оператор замыкания для матроидов]]<br />
=== Пересечение матроидов ===<br />
* [[Пересечение матроидов, определение, примеры]]<br />
* [[Лемма о паросочетании в графе замен]]<br />
* [[Лемма о единственном паросочетании в графе замен]]<br />
* [[Граф замен для двух матроидов]]<br />
* [[Лемма о единственном паросочетании в подграфе замен, индуцированном кратчайшим путем]]<br />
* [[Алгоритм построения базы в пересечении матроидов]]<br />
* [[Теорема Эдмондса-Лоулера]]<br />
=== Объединение матроидов ===<br />
* [[Объединение матроидов, проверка множества на независимость]]<br />
* [[Объединение матроидов, доказательство того, что объединение является матроидом]]<br />
* [[Алгоритм построения базы в объединении матроидов]]<br />
<br />
== Теория расписаний ==<br />
* [[Классификация задач]]<br />
* [[Методы решения задач теории расписаний]]<br />
* [[Правило Лаулера]]<br />
* [[Flow shop]]<br />
* [[1precpmtnrifmax|<tex>1 \mid prec, pmtn, r_i \mid f_{\max}</tex>]]<br />
* [[QpmtnCmax|<tex>Q \mid pmtn \mid C_{max}</tex>]]<br />
* [[QpmtnriLmax|<tex>Q \mid pmtn, r_{i} \mid L_{max}</tex>]]<br />
* [[P2precpi1Lmax|<tex>P2 \mid prec, p_i = 1 \mid L_{\max}</tex>]]<br />
* [[R2Cmax|<tex>R2 \mid \mid C_{max}</tex>]]<br />
* [[O2Cmax|<tex>O2 \mid \mid C_{max}</tex>]]<br />
* [[PpmtnriLmax|<tex>P \mid pmtn, r_i \mid L_{max}</tex>]]<br />
* [[Opi1sumu|<tex>O \mid p_{ij} = 1 \mid \sum U_i</tex>]]<br />
* [[Fpij1sumwu|<tex>F \mid p_{ij} = 1 \mid \sum w_i U_i</tex>]]<br />
* [[1ripi1sumwc|<tex>1 \mid r_{i}, p_i=1\mid \sum w_{i}C_{i}</tex>]]<br />
* [[1ridipi1|<tex>1 \mid r_{i}, d_{i}, p_{i} = 1 \mid -</tex>]]<br />
* [[1outtreesumwc | <tex>1 \mid outtree \mid \sum w_i C_i</tex>]]<br />
* [[1pi1sumwu|<tex>1 \mid p_{i} = 1 \mid \sum w_{i}U_{i}</tex>]]<br />
* [[QSumCi|<tex>Q\mid\mid\sum{C_i}</tex>]]<br />
* [[J2pij1Lmax| <tex>J2\mid p_{ij} = 1\mid L_{max}</tex>]]<br />
* [[P1sumu|<tex>1 \mid \mid \sum U_{i}</tex>]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B5_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D1%85%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B0&diff=29712Верхние и нижние оценки хроматического числа2013-01-14T00:32:25Z<p>Danek g30: </p>
<hr />
<div>== Верхняя оценка длиной максимального нечетного цикла ==<br />
{{Лемма <br />
|about = оценка хроматического числа длиной максимального нечётного цикла<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - длина максимального простого цикла графа <tex>G</tex>, <tex>\Delta \ge 3</tex>. Тогда, <tex>\chi(G) \le \Delta(G) + 1</tex>. <br />
|proof=<br />
Опишем на графе следующий алгоритм раскраски:<br />
*Из произвольной вершины <tex>v</tex> запусти алгоритм поиска в глубину. Пусть <tex>T</tex> {{---}} дерево обхода глубина графа <tex>G</tex> с корнем в вершине <tex>v</tex>.<br />
*Произвольную вершину <tex>u</tex>, покрасим в цвет <tex>dist(v,u)</tex> <tex> \mod </tex> <tex> (\Delta + 1)</tex>, где <tex>dist(v,u)</tex>{{---}} расстояние между вершинами <tex>u,v</tex> в графe <tex>T</tex>.<br />
Докажем от противного, что после выполнения описанного алгоритма граф <tex>G</tex> будет правильно раскрашен.<br />
Предположим, что после выполнения алгоритма покраски в графе существует ребро, соединяющее вершины <tex> a,b </tex> одного цвета.Пусть <tex>color(v)</tex> {{---}} цвет вершины после выполнения алгоритма раскраски.Заметим, что для произвольной вершины графа <tex>p</tex>, <tex>dist(v,p) = color(p) + n(\Delta + 1)</tex> , <tex>n \ge 0 </tex>.Тогда, <tex>dist(v,a) - dist(v,b) = k(\Delta + 1)</tex>.Поскольку в дереве dfs между вершинами находящимися на одинаковом расстоянии от корня нет перекрестных ребер, то <tex> k \ge 1</tex>. То есть, вершины <tex>a,b</tex> лежат на простом цикле длины по крайней мере <tex>\Delta + 2</tex>. Получается противоречие с условием потому, что длина максимального простого цикла получается больше чем <tex>\Delta</tex>.<br />
Таким образом в графе <tex>G</tex> после выполнения алгоритма раскраски нет вершин одного цвета соединенных ребром и при этом каждая вершина покрашена в один из <tex>\Delta + 1</tex>, то есть <tex>G</tex> правильно раскрашен в <tex>\Delta + 1</tex> цвет, следовательно <tex>\chi(G) \le \Delta(G) + 1</tex><br />
<br />
<br />
}}<br />
==Нижняя оценка числом внутренней устойчивости ==<br />
{{Определение<br />
<br />
|definition=<br />
Подмножество <tex>S</tex> вершин графа <tex>G</tex> называется '''внутренне устойчивым''', если любые две вершины из <tex>S</tex> не смежны в <tex>G</tex> <br />
}}<br />
<br />
{{Определение<br />
<br />
|definition=<br />
'''Число внутренней устойчивости''' <tex>\alpha(G)</tex> графа <tex>G(V,E)</tex> {{---}} <tex>max \{|S|:S \in V</tex> и S внутренне устойчиво в G<tex>\}</tex><br />
}}<br />
{{Лемма <br />
|about = нижняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами .Тогда, <tex>n/\alpha \le \chi(G)</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.Каждое из <tex>V_i</tex> {{---}} внутренне устойчивое множество (поскольку вершины множества покрашены в один цвет при правильной покраски графа <tex>G</tex>, следовательно, они попарно не смежны внутри множества ).<br />
Заметим, что для произвольного <tex>i</tex>, <tex>|V_i| \le \alpha</tex> (т.к <tex>V_i</tex> внутренне устойчиво). То есть, <tex>\sum\limits^{\chi}_{i = 1}|V_i| = n \le \chi \alpha </tex>, следовательно <tex>n / \alpha \le \chi</tex>.<br />
}}<br />
== Верхняя оценка количеством ребер ==<br />
{{Лемма <br />
|about = верхняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>m</tex> ребрами.Тогда, <tex>\chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}}</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>. Заметим, что между любыми двумя различными множествами существует хотя бы одно ребро (в противном случаи эти множества можно было бы покрасить в один цвет).<br />
Тогда, <tex>\frac{1}{2}\chi(\chi-1) \le m \Rightarrow (\chi - \frac{1}{2})^2 \le 2m + \frac{1}{4} \Rightarrow \chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}} </tex>.<br />
}}<br />
== Нижняя оценка количеством ребер и количеством вершин ==<br />
{{Лемма <br />
|about = нижняя оценка Геллера<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами и <tex>m</tex> ребрами .Тогда, <tex>\frac{n^2}{n^2 - 2m} \le \chi(G) </tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующие цвета при правильно покраски графа <tex>G</tex>.<br />
<tex>m \le \frac{1}{2}n(n - 1) - \frac{1}{2}\sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1) \Rightarrow \frac{n^2}{n^2 - 2m} \le \frac{n^2}{n^2 -n(n - 1) + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{n + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i| + \sum\limits^{\chi}_{i = 1}|V_i|(|V_i| - 1)} = \frac{n^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} = \frac{(\sum\limits^{\chi}_{i = 1}|V_i|)^2}{\sum\limits^{\chi}_{i = 1}|V_i|^2} \le \chi</tex>.<br />
}}<br />
== Полезные материалы ==<br />
* [http://www.ucdenver.edu/academics/colleges/CLAS/Departments/math/students/alumni/Documents/Student%20Theses/Mitchell_MSThesis.pdf Множество разных оценок для хроматических чисел]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem <br />
Сравнение квадрата суммы и суммы квадратов действительных чисел]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B5_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D1%85%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B0&diff=29704Верхние и нижние оценки хроматического числа2013-01-13T23:48:30Z<p>Danek g30: Новая страница: «== Верхняя оценка длиной максимального нечетного цикла == {{Лемма |about = оценка хроматичес...»</p>
<hr />
<div>== Верхняя оценка длиной максимального нечетного цикла ==<br />
{{Лемма <br />
|about = оценка хроматического числа длиной максимального нечётного цикла<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - длина максимального простого цикла графа <tex>G</tex>, <tex>\Delta \ge 3</tex>. Тогда, <tex>\chi(G) \le \Delta(G) + 1</tex>. <br />
|proof=<br />
Опишем на графе следующий алгоритм раскраски:<br />
*Из произвольной вершины <tex>v</tex> запусти алгоритм поиска в глубину. Пусть <tex>T</tex> {{---}} дерево обхода глубина графа <tex>G</tex> с корнем в вершине <tex>v</tex>.<br />
*Произвольную вершину <tex>u</tex>, покрасим в цвет <tex>dist(v,u)</tex> <tex> \mod </tex> <tex> (\Delta + 1)</tex>, где <tex>dist(v,u)</tex>{{---}} расстояние между вершинами <tex>u,v</tex> в графe <tex>T</tex>.<br />
Докажем от противного, что после выполнения описанного алгоритма граф <tex>G</tex> будет правильно раскрашен.<br />
Предположим, что после выполнения алгоритма покраски в графе существует ребро, соединяющее вершины <tex> a,b </tex> одного цвета.Пусть <tex>color(v)</tex> {{---}} цвет вершины после выполнения алгоритма раскраски.Заметим, что для произвольной вершины графа <tex>p</tex>, <tex>dist(v,p) = color(p) + n(\Delta + 1)</tex> , <tex>n \ge 0 </tex>.Тогда, <tex>dist(v,a) - dist(v,b) = k(\Delta + 1)</tex>.Поскольку в дереве dfs между вершинами находящимися на одинаковом расстоянии от корня нет перекрестных ребер, то <tex> k \ge 1</tex>. То есть, вершины <tex>a,b</tex> лежат на простом цикле длины по крайней мере <tex>\Delta + 2</tex>. Получается противоречие с условием потому, что длина максимального простого цикла получается больше чем <tex>\Delta</tex>.<br />
Таким образом в графе <tex>G</tex> после выполнения алгоритма раскраски нет вершин одного цвета соединенных ребром и при этом каждая вершина покрашена в один из <tex>\Delta + 1</tex>, то есть <tex>G</tex> правильно раскрашен в <tex>\Delta + 1</tex> цвет, следовательно <tex>\chi(G) \le \Delta(G) + 1</tex><br />
<br />
<br />
}}<br />
==Оценка связанная с внутренним устойчивым множеством ==<br />
{{Определение<br />
<br />
|definition=<br />
Подмножество <tex>S</tex> вершин графа <tex>G</tex> называется '''внутренне устойчивым''', если любые две вершины из <tex>S</tex> не смежны в <tex>G</tex> <br />
}}<br />
<br />
{{Определение<br />
<br />
|definition=<br />
'''Число внутренней устойчивости''' <tex>\alpha(G)</tex> графа <tex>G(V,E)</tex> {{---}} <tex>max \{|S|:S \in V</tex> и S внутренне устойчиво в G<tex>\}</tex><br />
}}<br />
{{Лемма <br />
|about = нижняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>n</tex> вершинами и <tex>m</tex> ребрами.Тогда, <tex>n/\alpha \le \chi(G)</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующей цвет при правильно покраски графа <tex>G</tex>.Каждое из <tex>V_i</tex> {{---}} внутренне устойчивое множество (поскольку вершины множества покрашены в один цвет при правильной покраски графа <tex>G</tex>, следовательно они не смежны ).<br />
Заметим, что для произвольного <tex>i</tex>, <tex>|V_i| \le \alpha</tex> (т.к <tex>V_i</tex> внутренне устойчиво). То есть, <tex>\sum\limits^{\chi}_{i = 1}|V_i| = n \le \chi \alpha </tex>, следовательно <tex>n / \alpha \le \chi</tex>.<br />
}}<br />
== Верхняя оценка количеством ребром ==<br />
{{Лемма <br />
|about = верхняя оценка<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф с <tex>m</tex> ребрами.Тогда, <tex>\chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}}</tex>. <br />
|proof=<br />
Пусть, <tex>V_1,V_2...V_\chi</tex> множеств вершин окрашенных в соответствующей цвет при правильно покраски графа <tex>G</tex>. Заметим, что между любыми двумя такими различными множествами существует хотя бы одно ребро (в противном случаи эти множества можно было бы покрасить в один цвет).<br />
Тогда, <tex>\frac{1}{2}\chi(\chi-1) \le m \Rightarrow (\chi - \frac{1}{2})^2 \le 2m + \frac{1}{4} \Rightarrow \chi(G) \le \frac{1}{2} +\sqrt{2m + \frac{1}{4}} </tex>.<br />
}}</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&diff=29640Дискретная математика, алгоритмы и структуры данных2013-01-13T20:03:03Z<p>Danek g30: /* Раскраски графов */</p>
<hr />
<div>[[Категория:Дискретная математика и алгоритмы]]<br />
[[Категория: Алгоритмы и структуры данных]]<br />
<br />
Убедительная просьба читать [[Обсуждение:Дискретная_математика_и_алгоритмы | правила оформления вики-конспектов]].<br />
<br />
= Первый семестр =<br />
<br />
== Отношения ==<br />
*[[Определение отношения]]<br />
*[[Степень отношений]]<br />
*[[Композиция отношений|Композиция отношений. Обратное отношение]]<br />
*[[Рефлексивное отношение|Рефлексивное отношение. Антирефлексивное отношение.]]<br />
*[[Симметричное отношение]]<br />
*[[Антисимметричное отношение]]<br />
*[[Транзитивное отношение]]<br />
*[[Транзитивное замыкание|Транзитивное замыкание отношения]]<br />
*[[Алгоритм Флойда — Уоршелла|Алгоритм Флойда-Уоршалла построения транзитивного замыкания отношения]]<br />
*[[Транзитивный остов]]<br />
*[[Отношение порядка]]<br />
*[[Отношение эквивалентности]]<br />
<br />
== Булевы функции ==<br />
*[[Определение булевой функции]]<br />
*[[Суперпозиции]]<br />
*[[ДНФ]]<br />
*[[КНФ]]<br />
*[[Полином Жегалкина]]<br />
*[[Полные системы функций. Теорема Поста о полной системе функций]]<br />
*[[Сокращенная и минимальная ДНФ]]<br />
*[[Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно]]<br />
*[[Специальные формы КНФ|Специальные формы КНФ: КНФ в форме Хорна и КНФ в форме Крома]]<br />
*[[Преобразование Мёбиуса для получения коэффициентов полинома Жегалкина]]<br />
*[[Представление функции класса DM с помощью медианы]]<br />
*[[Пороговая функция]]<br />
<br />
== Схемы из функциональных элементов ==<br />
*[[Реализация булевой функции схемой из функциональных элементов]]<br />
*[[Cумматор]]<br />
*[[Каскадный сумматор]]<br />
*[[Двоичный каскадный сумматор]]<br />
*[[Реализация вычитания сумматором]]<br />
*[[Матричный умножитель]]<br />
*[[Дерево Уоллеса]]<br />
<br />
== Представление информации ==<br />
*[[Кодирование информации]]<br />
*[[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]<br />
*[[Представление вещественных чисел]]<br />
*[[Представление символов, таблицы кодировок]]<br />
<br />
== Алгоритмы сжатия ==<br />
*[[Алгоритм Хаффмана]]<br />
*[[Алгоритм LZW]]<br />
*[[Алгоритмы LZ77 и LZ78]]<br />
*[[Преобразование Барроуза-Уиллера]]<br />
*[[Обратное преобразование Барроуза-Уиллера]]<br />
*[[Преобразование MTF]]<br />
*[[Расстояние Хэмминга]]<br />
*[[Избыточное кодирование, код Хэмминга]]<br />
*[[Неравенство Крафта]]<br />
*[[Неравенство Макмиллана]]<br />
*[[Алгоритм Ху-Таккера]]<br />
<br />
== Комбинаторика ==<br />
*[[Комбинаторные объекты]]<br />
*[[Лексикографический порядок]]<br />
*[[Формула включения-исключения]]<br />
*[[Генерация комбинаторных объектов в лексикографическом порядке]]<br />
*[[Получение номера по объекту]]<br />
*[[Получение объекта по номеру]]<br />
*[[Получение следующего объекта]]<br />
*[[Коды Грея]]<br />
*[[Коды Грея для перестановок]]<br />
*[[Коды антигрея]]<br />
*[[Цепные коды]]<br />
*[[Правильные скобочные последовательности]]<br />
*[[Действие перестановки на набор из элементов, представление в виде циклов]]<br />
*[[Метод генерации случайной перестановки, алгоритм Фишера-Йетса]]<br />
*[[Методы генерации случайного сочетания]]<br />
*[[Таблица инверсий]]<br />
*[[Умножение перестановок, обратная перестановка, группа перестановок]]<br />
*[[Теорема Кэли]]<br />
*[[Матричное представление перестановок]]<br />
*[[Задача о минимуме/максимуме скалярного произведения]]<br />
*[[Задача о монотонных подпоследовательностях, теорема о связи длины НВП и НУП]]<br />
*[[Нахождение количества разбиений числа на слагаемые | Нахождение количества разбиений числа на слагаемые. Пентагональная теорема Эйлера]]<br />
*[[Производящая функция]]<br />
*[[Задача об ожерельях]]<br />
<br />
== [[Динамическое программирование]] ==<br />
*[[Кратчайший путь в ациклическом графе]]<br />
*[[Задача о расстановке знаков в выражении]]<br />
*[[Задача о наибольшей общей подпоследовательности]]<br />
*[[Задача о порядке перемножения матриц]]<br />
*[[Задача о наибольшей возрастающей подпоследовательности]]<br />
*[[Задача о паросочетании максимального веса в дереве, амортизированные оценки для ДП на дереве]]<br />
*[[Метод четырех русских для умножения матриц]]<br />
*[[Применение метода четырех русских в задачах ДП на примере задачи о НОП]]<br />
*[[Задача коммивояжера, ДП по подмножествам]]<br />
*[[Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами]]<br />
*[[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера]]<br />
*[[Задача о расстоянии Дамерау-Левенштейна]]<br />
*[[Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза]]<br />
*[[Задача о наибольшей подпоследовательности-палиндроме]]<br />
*[[Meet-in-the-middle]]<br />
*[[Динамическое программирование по профилю]]<br />
*[[Задача о рюкзаке]]<br />
<br />
== Теория вероятностей ==<br />
*[[Вероятностное пространство, элементарный исход, событие]]<br />
*[[Независимые события]]<br />
*[[Условная вероятность]]<br />
*[[Формула Байеса]]<br />
*[[Формула полной вероятности]]<br />
*[[Дискретная случайная величина]]<br />
*[[Независимые случайные величины]]<br />
*[[Математическое ожидание случайной величины]]<br />
*[[Дисперсия случайной величины]]<br />
*[[Ковариация случайных величин]]<br />
*[[Корреляция случайных величин]]<br />
*[[Энтропия случайного источника]]<br />
*[[Симуляция одним распределением другого]]<br />
*[[Арифметическое кодирование]]<br />
*[[Парадоксы теории вероятностей]]<br />
*[[Схема Бернулли]]<br />
<br />
== Марковские цепи ==<br />
<br />
* [[Марковская цепь]]<br />
* [[Теорема о поглощении]]<br />
* [[Фундаментальная матрица]]<br />
* [[Математическое ожидание времени поглощения]]<br />
* [[Расчет вероятности поглощения в состоянии]]<br />
* [[Эргодическая марковская цепь]]<br />
* [[Регулярная марковская цепь]]<br />
* [[Примеры использования Марковских цепей]]<br />
<br />
= Второй семестр =<br />
<br />
== Амортизационный анализ ==<br />
* [[Амортизационный анализ]]<br />
* [[Саморасширяющийся массив]]<br />
* [[Массив с увеличением/уменьшением размера]]<br />
* [[Список]]<br />
* [[Стек]]<br />
* [[Очередь]]<br />
* [[Персистентный стек]]<br />
* [[Персистентный дек]]<br />
<br />
== Приоритетные очереди ==<br />
<br />
* [[Двоичная куча]]<br />
* [[Биномиальная куча]]<br />
* [[Фибоначчиева куча]]<br />
<br />
== Система непересекающихся множеств ==<br />
* [[СНМ (наивные реализации) | Наивные реализации]]<br />
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]<br />
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]<br />
<br />
== Поисковые структуры данных ==<br />
* [[Упорядоченное множество]]<br />
* [[Дерево поиска, наивная реализация]]<br />
* [[АВЛ-дерево]]<br />
* [[2-3 дерево]]<br />
* [[B-дерево]]<br />
* [[Красно-черное дерево]]<br />
* [[Декартово дерево]]<br />
* [[Декартово дерево по неявному ключу]]<br />
* [[Splay-дерево]]<br />
* [[Рандомизированное бинарное дерево поиска]]<br />
* [[Дерево ван Эмде Боаса]]<br />
* [[Список с пропусками]]<br />
<br />
== Дерево отрезков ==<br />
<br />
* [[Статистики на отрезках. Корневая эвристика]]<br />
* [[Дерево отрезков. Построение]]<br />
* [[Реализация запроса в дереве отрезков сверху]]<br />
* [[Реализация запроса в дереве отрезков снизу]]<br />
* [[Несогласованные поддеревья. Реализация массового обновления]]<br />
* [[Многомерное дерево отрезков]]<br />
* [[Сжатое многомерное дерево отрезков]]<br />
<br />
== Дерево Фенвика ==<br />
* [[Дерево Фенвика]]<br />
* [[Встречное дерево Фенвика]]<br />
* [[Дерево Фенвика для некоммутативных операций]]<br />
* [[Многомерное дерево Фенвика]]<br />
<br />
== Хеширование ==<br />
* [[Хеш-таблица]]<br />
* [[Разрешение коллизий]]<br />
* [[Хеширование кукушки]]<br />
* [[Идеальное хеширование]]<br />
* [[Перехеширование. Амортизационный анализ]]<br />
* [[Фильтр Блума]]<br />
* [[Универсальное семейство хеш-функций]]<br />
<br />
== [[Сортировка]] ==<br />
* [[Сортировка выбором]]<br />
* [[Сортировка пузырьком]]<br />
* [[Сортировка вставками]]<br />
* [[Сортировка кучей]]<br />
* [[Быстрая сортировка]]<br />
* [[Сортировка слиянием]]<br />
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]<br />
* [[Теорема о нижней оценке для сортировки сравнениями]]<br />
* [[Сортировка подсчетом]]<br />
* [[Сортировка подсчетом сложных объектов]]<br />
* [[Цифровая сортировка]]<br />
* [[Карманная сортировка]]<br />
* [[Поиск k-ой порядковой статистики]]<br />
* [[Поиск k-ой порядковой статистики за линейное время]]<br />
* [[Сортировка Хана]]<br />
<br />
== Сортирующие сети ==<br />
* [[Сортирующие сети]]<br />
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]<br />
* [[Сортирующие сети для квадратичных сортировок]]<br />
* [[Сеть Бетчера]]<br />
<br />
== Алгоритмы поиска ==<br />
* [[Целочисленный двоичный поиск]]<br />
* [[Вещественный двоичный поиск]]<br />
* [[Троичный поиск]]<br />
* [[Поиск с помощью золотого сечения]]<br />
* [[Интерполяционный поиск]]<br />
<br />
== Связь между структурами данных ==<br />
* [[Связь между структурами данных]]<br />
<br />
= Третий семестр =<br />
<br />
== Основные определения теории графов ==<br />
* [[Основные определения теории графов|Основные определения: граф, ребро, вершина, степень, петля, путь, цикл]]<br />
* [[Лемма о рукопожатиях]]<br />
* [[Теорема о существовании простого пути в случае существования пути]]<br />
* [[Теорема о существовании простого цикла в случае существования цикла]]<br />
* [[Матрица смежности графа]]<br />
* [[Связь степени матрицы смежности и количества путей]]<br />
* [[Матрица инцидентности графа]]<br />
* [[Циклическое пространство графа]]<br />
* [[Фундаментальные циклы графа]]<br />
* [[Дерево, эквивалентные определения]]<br />
* [[Дополнительный, самодополнительный граф]]<br />
<br />
== Связность в графах ==<br />
* [[Отношение связности, компоненты связности]]<br />
* [[Отношение реберной двусвязности]]<br />
* [[Отношение вершинной двусвязности]]<br />
* [[Граф компонент реберной двусвязности]]<br />
* [[Граф блоков-точек сочленения]]<br />
* [[Точка сочленения, эквивалентные определения]]<br />
* [[Мост, эквивалентные определения]]<br />
* [[k-связность]]<br />
* [[Теорема Менгера]]<br />
* [[Теорема Менгера, альтернативное доказательство]]<br />
* [[Вершинная, реберная связность, связь между ними и минимальной степенью вершины]]<br />
<br />
== Остовные деревья ==<br />
* [[Матрица Кирхгофа]]<br />
* [[Связь матрицы Кирхгофа и матрицы инцидентности]]<br />
* [[Подсчет числа остовных деревьев с помощью матрицы Кирхгофа]]<br />
* [[Количество помеченных деревьев]]<br />
* [[Коды Прюфера]]<br />
<br />
== Обходы графов ==<br />
* [[Эйлеров цикл, Эйлеров путь, Эйлеровы графы, Эйлеровость орграфов]]<br />
* [[Покрытие ребер графа путями]]<br />
* [[Алгоритм построения Эйлерова цикла]]<br />
* [[Произвольно вычерчиваемые из заданной вершины графы]]<br />
* [[Гамильтоновы графы]]<br />
* [[Теорема Хватала]]<br />
* [[Теорема Дирака]]<br />
* [[Теорема Оре]]<br />
* [[Турниры]]<br />
* [[Теорема Редеи-Камиона]]<br />
<br />
== Укладки графов ==<br />
* [[Укладка графа на плоскости]]<br />
* [[Формула Эйлера]]<br />
* [[Непланарность K5 и K3,3|Непланарность <tex>K_5</tex> и <tex>K_{3,3}</tex>]]<br />
* [[Укладка дерева]]<br />
* [[Укладка графа с планарными компонентами реберной двусвязности]]<br />
* [[Укладка графа с планарными компонентами вершинной двусвязности]]<br />
* [[Теорема Понтрягина-Куратовского]]<br />
* [[Двойственный граф планарного графа]]<br />
<br />
== Раскраски графов ==<br />
* [[Раскраска графа]]<br />
* [[Двудольные графы и раскраска в 2 цвета]]<br />
* [[Хроматический многочлен]]<br />
** [[Хроматический многочлен#Хроматический многочлен полного графа|Хроматический многочлен полного графа]]<br />
** [[Хроматический многочлен#Хроматический многочлен пустого графа|Хроматический многочлен пустого графа]]<br />
** [[Хроматический многочлен#Хроматический многочлен дерева|Хроматический многочлен дерева]]<br />
** [[Хроматический многочлен#Рекуррентные формулы для хроматических многочленов|Рекуррентные формулы для хроматических многочленов]]<br />
** [[Хроматический многочлен#Коэффициенты хроматического многочлена|Коэффициенты хроматического многочлена: старший, второй коэффициенты, знакопеременность]]<br />
* [[Формула Зыкова]]<br />
* [[Формула Уитни]]<br />
* [[Теорема Брукса]]<br />
* [[Верхняя оценка хроматического числа длиной нечетного цикла]]<br />
* [[Верхние и нижние оценки хроматического числа]]<br />
<br />
== Обход в глубину ==<br />
* [[Обход в глубину, цвета вершин]]<br />
* [[Лемма о белых путях]]<br />
* [[Использование обхода в глубину для проверки связности]]<br />
* [[Использование обхода в глубину для поиска цикла в ориентированном графе]]<br />
* [[Использование обхода в глубину для топологической сортировки]]<br />
* [[Использование обхода в глубину для поиска компонент сильной связности]]<br />
* [[Использование обхода в глубину для поиска точек сочленения]]<br />
* [[Построение компонент вершинной двусвязности]]<br />
* [[Использование обхода в глубину для поиска мостов]]<br />
* [[Построение компонент реберной двусвязности]]<br />
<br />
== Кратчайшие пути в графах ==<br />
* [[Обход в ширину]]<br />
* [[Алгоритм Форда-Беллмана]]<br />
* [[Алгоритм Дейкстры]]<br />
* [[Алгоритм Флойда]]<br />
* [[Алгоритм A*]]<br />
* [[Алгоритм Джонсона]]<br />
<br />
== Построение остовных деревьев ==<br />
* [[Лемма о безопасном ребре]]<br />
* [[Алгоритм Прима]]<br />
* [[Алгоритм Краскала]]<br />
* [[Алгоритм Борувки]]<br />
* [[Критерий Тарьяна минимальности остовного дерева|Теорема Тарьяна (критерий минимальности остовного дерева)]]<br />
* [[Алгоритм двух китайцев]]<br />
<br />
== Задача о паросочетании ==<br />
* [[Теорема о максимальном паросочетании и дополняющих цепях]]<br />
* [[Алгоритм Форда-Фалкерсона для поиска максимального паросочетания]]<br />
* [[Алгоритм Куна для поиска максимального паросочетания]]<br />
* [[Теорема Холла]]<br />
* [[Связь максимального паросочетания и минимального вершинного покрытия в двудольных графах]]<br />
* [[Связь вершинного покрытия и независимого множества]]<br />
* [[Матрица Татта и связь с размером максимального паросочетания в двудольном графе]]<br />
* [[Алгоритм вырезания соцветий|Паросочетания в недвудольных графах. Алгоритм вырезания соцветий]]<br />
<br />
== Задача о максимальном потоке ==<br />
* [[Определение сети, потока]]<br />
* [[Разрез, лемма о потоке через разрез]]<br />
* [[Дополняющая сеть, дополняющий путь]]<br />
* [[Лемма о сложении потоков]]<br />
* [[Теорема Форда-Фалкерсона]]<br />
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]<br />
* [[Алоритм Эдмондса-Карпа]]<br />
* [[Алгоритм масштабирования потока]]<br />
* [[Блокирующий поток]]<br />
* [[Схема алгоритма Диница]]<br />
* [[Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями]]<br />
* [[Алгоритм поиска блокирующего потока в ациклической сети]]<br />
* [[Метод проталкивания предпотока]]<br />
* [[Алгоритм "поднять-в-начало"]]<br />
* [[Теорема о декомпозиции]]<br />
* [[Теорема о декомпозиционном барьере]]<br />
* [[Циркуляция потока]]<br />
<br />
== Задача о потоке минимальной стоимости ==<br />
* [[Поток минимальной стоимости]]<br />
* [[Теорема Форда-Фалкерсона о потоке минимальной стоимости]]<br />
* [[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]<br />
* [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]<br />
* [[Использование потенциалов Джонсона при поиске потока минимальной стоимости]]<br />
* [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]<br />
* [[Венгерский алгоритм решения задачи о назначениях]]<br />
<br />
= Четвертый семестр =<br />
<br />
== Основные определения. Простые комбинаторные свойства слов ==<br />
* [[Основные определения, связанные со строками]]<br />
* [[Период и бордер, их связь]]<br />
* [[Слово Фибоначчи]]<br />
* [[Слово Туэ-Морса]]<br />
<br />
== Поиск подстроки в строке ==<br />
* [[Наивный алгоритм поиска подстроки в строке]]<br />
* [[Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]]<br />
* [[Поиск наибольшей общей подстроки двух строк с использованием хеширования]]<br />
* [[Префикс-функция]]<br />
* [[Алгоритм Кнута-Морриса-Пратта]]<br />
* [[Z-функция]]<br />
* [[Автомат для поиска образца в тексте]]<br />
* [[Бор]]<br />
* [[Алгоритм Ахо-Корасик]]<br />
<br />
== Суффиксное дерево ==<br />
* [[Суффиксный бор]]<br />
* [[Сжатое суффиксное дерево]]<br />
* [[Алгоритм Укконена]]<br />
<br />
== Суффиксный массив ==<br />
* [[Суффиксный массив]]<br />
* [[Построение суффиксного массива с помощью стандартных методов сортировки]]<br />
* [[Цифровая сортировка]]<br />
* [[Алгоритм цифровой сортировки суффиксов циклической строки]]<br />
* [[Алгоритм Касаи и др.]]<br />
* [[Алгоритм Карккайнена-Сандерса]]<br />
* [[Алгоритм поиска подстроки в строке с помощью суффиксного массива]]<br />
<br />
== Задача о наименьшем общем предке ==<br />
* [[Метод двоичного подъема]]<br />
* [[Сведение задачи LCA к задаче RMQ]]<br />
* [[Решение RMQ с помощью разреженной таблицы]]<br />
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четырех русских)<br />
* [[Алгоритм Шибера-Вишкина]]<br />
* [[Сведение задачи RMQ к задаче LCA]]<br />
<br />
== Матроиды ==<br />
* [[Определение матроида]]<br />
* [[Примеры матроидов]]<br />
* [[Прямая сумма матроидов]]<br />
* [[Теорема Радо-Эдмондса (жадный алгоритм)]]<br />
* [[Жадный алгоритм поиска базы минимального веса]]<br />
* [[Теорема о базах]]<br />
* [[Аксиоматизация матроида базами]]<br />
* [[Теорема о циклах]]<br />
* [[Аксиоматизация матроида циклами]]<br />
* [[Ранговая функция, полумодулярность]]<br />
* [[Двойственный матроид]]<br />
* [[Оператор замыкания для матроидов]]<br />
=== Пересечение матроидов ===<br />
* [[Пересечение матроидов, определение, примеры]]<br />
* [[Лемма о паросочетании в графе замен]]<br />
* [[Лемма о единственном паросочетании в графе замен]]<br />
* [[Граф замен для двух матроидов]]<br />
* [[Лемма о единственном паросочетании в подграфе замен, индуцированном кратчайшим путем]]<br />
* [[Алгоритм построения базы в пересечении матроидов]]<br />
* [[Теорема Эдмондса-Лоулера]]<br />
=== Объединение матроидов ===<br />
* [[Объединение матроидов, проверка множества на независимость]]<br />
* [[Объединение матроидов, доказательство того, что объединение является матроидом]]<br />
* [[Алгоритм построения базы в объединении матроидов]]<br />
<br />
== Теория расписаний ==<br />
* [[Классификация задач]]<br />
* [[Методы решения задач теории расписаний]]<br />
* [[Правило Лаулера]]<br />
* [[Flow shop]]<br />
* [[1precpmtnrifmax|<tex>1 \mid prec, pmtn, r_i \mid f_{\max}</tex>]]<br />
* [[QpmtnCmax|<tex>Q \mid pmtn \mid C_{max}</tex>]]<br />
* [[QpmtnriLmax|<tex>Q \mid pmtn, r_{i} \mid L_{max}</tex>]]<br />
* [[P2precpi1Lmax|<tex>P2 \mid prec, p_i = 1 \mid L_{\max}</tex>]]<br />
* [[R2Cmax|<tex>R2 \mid \mid C_{max}</tex>]]<br />
* [[O2Cmax|<tex>O2 \mid \mid C_{max}</tex>]]<br />
* [[PpmtnriLmax|<tex>P \mid pmtn, r_i \mid L_{max}</tex>]]<br />
* [[Opi1sumu|<tex>O \mid p_{ij} = 1 \mid \sum U_i</tex>]]<br />
* [[Fpij1sumwu|<tex>F \mid p_{ij} = 1 \mid \sum w_i U_i</tex>]]<br />
* [[1ripi1sumwc|<tex>1 \mid r_{i}, p_i=1\mid \sum w_{i}C_{i}</tex>]]<br />
* [[1ridipi1|<tex>1 \mid r_{i}, d_{i}, p_{i} = 1 \mid -</tex>]]<br />
* [[1outtreesumwc | <tex>1 \mid outtree \mid \sum w_i C_i</tex>]]<br />
* [[1pi1sumwu|<tex>1 \mid p_{i} = 1 \mid \sum w_{i}U_{i}</tex>]]<br />
* [[QSumCi|<tex>Q\mid\mid\sum{C_i}</tex>]]<br />
* [[J2pij1Lmax| <tex>J2\mid p_{ij} = 1\mid L_{max}</tex>]]<br />
* [[P1sumu|<tex>1 \mid \mid \sum U_{i}</tex>]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&diff=29639Дискретная математика, алгоритмы и структуры данных2013-01-13T20:02:08Z<p>Danek g30: /* Раскраски графов */</p>
<hr />
<div>[[Категория:Дискретная математика и алгоритмы]]<br />
[[Категория: Алгоритмы и структуры данных]]<br />
<br />
Убедительная просьба читать [[Обсуждение:Дискретная_математика_и_алгоритмы | правила оформления вики-конспектов]].<br />
<br />
= Первый семестр =<br />
<br />
== Отношения ==<br />
*[[Определение отношения]]<br />
*[[Степень отношений]]<br />
*[[Композиция отношений|Композиция отношений. Обратное отношение]]<br />
*[[Рефлексивное отношение|Рефлексивное отношение. Антирефлексивное отношение.]]<br />
*[[Симметричное отношение]]<br />
*[[Антисимметричное отношение]]<br />
*[[Транзитивное отношение]]<br />
*[[Транзитивное замыкание|Транзитивное замыкание отношения]]<br />
*[[Алгоритм Флойда — Уоршелла|Алгоритм Флойда-Уоршалла построения транзитивного замыкания отношения]]<br />
*[[Транзитивный остов]]<br />
*[[Отношение порядка]]<br />
*[[Отношение эквивалентности]]<br />
<br />
== Булевы функции ==<br />
*[[Определение булевой функции]]<br />
*[[Суперпозиции]]<br />
*[[ДНФ]]<br />
*[[КНФ]]<br />
*[[Полином Жегалкина]]<br />
*[[Полные системы функций. Теорема Поста о полной системе функций]]<br />
*[[Сокращенная и минимальная ДНФ]]<br />
*[[Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно]]<br />
*[[Специальные формы КНФ|Специальные формы КНФ: КНФ в форме Хорна и КНФ в форме Крома]]<br />
*[[Преобразование Мёбиуса для получения коэффициентов полинома Жегалкина]]<br />
*[[Представление функции класса DM с помощью медианы]]<br />
*[[Пороговая функция]]<br />
<br />
== Схемы из функциональных элементов ==<br />
*[[Реализация булевой функции схемой из функциональных элементов]]<br />
*[[Cумматор]]<br />
*[[Каскадный сумматор]]<br />
*[[Двоичный каскадный сумматор]]<br />
*[[Реализация вычитания сумматором]]<br />
*[[Матричный умножитель]]<br />
*[[Дерево Уоллеса]]<br />
<br />
== Представление информации ==<br />
*[[Кодирование информации]]<br />
*[[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]<br />
*[[Представление вещественных чисел]]<br />
*[[Представление символов, таблицы кодировок]]<br />
<br />
== Алгоритмы сжатия ==<br />
*[[Алгоритм Хаффмана]]<br />
*[[Алгоритм LZW]]<br />
*[[Алгоритмы LZ77 и LZ78]]<br />
*[[Преобразование Барроуза-Уиллера]]<br />
*[[Обратное преобразование Барроуза-Уиллера]]<br />
*[[Преобразование MTF]]<br />
*[[Расстояние Хэмминга]]<br />
*[[Избыточное кодирование, код Хэмминга]]<br />
*[[Неравенство Крафта]]<br />
*[[Неравенство Макмиллана]]<br />
*[[Алгоритм Ху-Таккера]]<br />
<br />
== Комбинаторика ==<br />
*[[Комбинаторные объекты]]<br />
*[[Лексикографический порядок]]<br />
*[[Формула включения-исключения]]<br />
*[[Генерация комбинаторных объектов в лексикографическом порядке]]<br />
*[[Получение номера по объекту]]<br />
*[[Получение объекта по номеру]]<br />
*[[Получение следующего объекта]]<br />
*[[Коды Грея]]<br />
*[[Коды Грея для перестановок]]<br />
*[[Коды антигрея]]<br />
*[[Цепные коды]]<br />
*[[Правильные скобочные последовательности]]<br />
*[[Действие перестановки на набор из элементов, представление в виде циклов]]<br />
*[[Метод генерации случайной перестановки, алгоритм Фишера-Йетса]]<br />
*[[Методы генерации случайного сочетания]]<br />
*[[Таблица инверсий]]<br />
*[[Умножение перестановок, обратная перестановка, группа перестановок]]<br />
*[[Теорема Кэли]]<br />
*[[Матричное представление перестановок]]<br />
*[[Задача о минимуме/максимуме скалярного произведения]]<br />
*[[Задача о монотонных подпоследовательностях, теорема о связи длины НВП и НУП]]<br />
*[[Нахождение количества разбиений числа на слагаемые | Нахождение количества разбиений числа на слагаемые. Пентагональная теорема Эйлера]]<br />
*[[Производящая функция]]<br />
*[[Задача об ожерельях]]<br />
<br />
== [[Динамическое программирование]] ==<br />
*[[Кратчайший путь в ациклическом графе]]<br />
*[[Задача о расстановке знаков в выражении]]<br />
*[[Задача о наибольшей общей подпоследовательности]]<br />
*[[Задача о порядке перемножения матриц]]<br />
*[[Задача о наибольшей возрастающей подпоследовательности]]<br />
*[[Задача о паросочетании максимального веса в дереве, амортизированные оценки для ДП на дереве]]<br />
*[[Метод четырех русских для умножения матриц]]<br />
*[[Применение метода четырех русских в задачах ДП на примере задачи о НОП]]<br />
*[[Задача коммивояжера, ДП по подмножествам]]<br />
*[[Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами]]<br />
*[[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера]]<br />
*[[Задача о расстоянии Дамерау-Левенштейна]]<br />
*[[Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза]]<br />
*[[Задача о наибольшей подпоследовательности-палиндроме]]<br />
*[[Meet-in-the-middle]]<br />
*[[Динамическое программирование по профилю]]<br />
*[[Задача о рюкзаке]]<br />
<br />
== Теория вероятностей ==<br />
*[[Вероятностное пространство, элементарный исход, событие]]<br />
*[[Независимые события]]<br />
*[[Условная вероятность]]<br />
*[[Формула Байеса]]<br />
*[[Формула полной вероятности]]<br />
*[[Дискретная случайная величина]]<br />
*[[Независимые случайные величины]]<br />
*[[Математическое ожидание случайной величины]]<br />
*[[Дисперсия случайной величины]]<br />
*[[Ковариация случайных величин]]<br />
*[[Корреляция случайных величин]]<br />
*[[Энтропия случайного источника]]<br />
*[[Симуляция одним распределением другого]]<br />
*[[Арифметическое кодирование]]<br />
*[[Парадоксы теории вероятностей]]<br />
*[[Схема Бернулли]]<br />
<br />
== Марковские цепи ==<br />
<br />
* [[Марковская цепь]]<br />
* [[Теорема о поглощении]]<br />
* [[Фундаментальная матрица]]<br />
* [[Математическое ожидание времени поглощения]]<br />
* [[Расчет вероятности поглощения в состоянии]]<br />
* [[Эргодическая марковская цепь]]<br />
* [[Регулярная марковская цепь]]<br />
* [[Примеры использования Марковских цепей]]<br />
<br />
= Второй семестр =<br />
<br />
== Амортизационный анализ ==<br />
* [[Амортизационный анализ]]<br />
* [[Саморасширяющийся массив]]<br />
* [[Массив с увеличением/уменьшением размера]]<br />
* [[Список]]<br />
* [[Стек]]<br />
* [[Очередь]]<br />
* [[Персистентный стек]]<br />
* [[Персистентный дек]]<br />
<br />
== Приоритетные очереди ==<br />
<br />
* [[Двоичная куча]]<br />
* [[Биномиальная куча]]<br />
* [[Фибоначчиева куча]]<br />
<br />
== Система непересекающихся множеств ==<br />
* [[СНМ (наивные реализации) | Наивные реализации]]<br />
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]<br />
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]<br />
<br />
== Поисковые структуры данных ==<br />
* [[Упорядоченное множество]]<br />
* [[Дерево поиска, наивная реализация]]<br />
* [[АВЛ-дерево]]<br />
* [[2-3 дерево]]<br />
* [[B-дерево]]<br />
* [[Красно-черное дерево]]<br />
* [[Декартово дерево]]<br />
* [[Декартово дерево по неявному ключу]]<br />
* [[Splay-дерево]]<br />
* [[Рандомизированное бинарное дерево поиска]]<br />
* [[Дерево ван Эмде Боаса]]<br />
* [[Список с пропусками]]<br />
<br />
== Дерево отрезков ==<br />
<br />
* [[Статистики на отрезках. Корневая эвристика]]<br />
* [[Дерево отрезков. Построение]]<br />
* [[Реализация запроса в дереве отрезков сверху]]<br />
* [[Реализация запроса в дереве отрезков снизу]]<br />
* [[Несогласованные поддеревья. Реализация массового обновления]]<br />
* [[Многомерное дерево отрезков]]<br />
* [[Сжатое многомерное дерево отрезков]]<br />
<br />
== Дерево Фенвика ==<br />
* [[Дерево Фенвика]]<br />
* [[Встречное дерево Фенвика]]<br />
* [[Дерево Фенвика для некоммутативных операций]]<br />
* [[Многомерное дерево Фенвика]]<br />
<br />
== Хеширование ==<br />
* [[Хеш-таблица]]<br />
* [[Разрешение коллизий]]<br />
* [[Хеширование кукушки]]<br />
* [[Идеальное хеширование]]<br />
* [[Перехеширование. Амортизационный анализ]]<br />
* [[Фильтр Блума]]<br />
* [[Универсальное семейство хеш-функций]]<br />
<br />
== [[Сортировка]] ==<br />
* [[Сортировка выбором]]<br />
* [[Сортировка пузырьком]]<br />
* [[Сортировка вставками]]<br />
* [[Сортировка кучей]]<br />
* [[Быстрая сортировка]]<br />
* [[Сортировка слиянием]]<br />
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]<br />
* [[Теорема о нижней оценке для сортировки сравнениями]]<br />
* [[Сортировка подсчетом]]<br />
* [[Сортировка подсчетом сложных объектов]]<br />
* [[Цифровая сортировка]]<br />
* [[Карманная сортировка]]<br />
* [[Поиск k-ой порядковой статистики]]<br />
* [[Поиск k-ой порядковой статистики за линейное время]]<br />
* [[Сортировка Хана]]<br />
<br />
== Сортирующие сети ==<br />
* [[Сортирующие сети]]<br />
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]<br />
* [[Сортирующие сети для квадратичных сортировок]]<br />
* [[Сеть Бетчера]]<br />
<br />
== Алгоритмы поиска ==<br />
* [[Целочисленный двоичный поиск]]<br />
* [[Вещественный двоичный поиск]]<br />
* [[Троичный поиск]]<br />
* [[Поиск с помощью золотого сечения]]<br />
* [[Интерполяционный поиск]]<br />
<br />
== Связь между структурами данных ==<br />
* [[Связь между структурами данных]]<br />
<br />
= Третий семестр =<br />
<br />
== Основные определения теории графов ==<br />
* [[Основные определения теории графов|Основные определения: граф, ребро, вершина, степень, петля, путь, цикл]]<br />
* [[Лемма о рукопожатиях]]<br />
* [[Теорема о существовании простого пути в случае существования пути]]<br />
* [[Теорема о существовании простого цикла в случае существования цикла]]<br />
* [[Матрица смежности графа]]<br />
* [[Связь степени матрицы смежности и количества путей]]<br />
* [[Матрица инцидентности графа]]<br />
* [[Циклическое пространство графа]]<br />
* [[Фундаментальные циклы графа]]<br />
* [[Дерево, эквивалентные определения]]<br />
* [[Дополнительный, самодополнительный граф]]<br />
<br />
== Связность в графах ==<br />
* [[Отношение связности, компоненты связности]]<br />
* [[Отношение реберной двусвязности]]<br />
* [[Отношение вершинной двусвязности]]<br />
* [[Граф компонент реберной двусвязности]]<br />
* [[Граф блоков-точек сочленения]]<br />
* [[Точка сочленения, эквивалентные определения]]<br />
* [[Мост, эквивалентные определения]]<br />
* [[k-связность]]<br />
* [[Теорема Менгера]]<br />
* [[Теорема Менгера, альтернативное доказательство]]<br />
* [[Вершинная, реберная связность, связь между ними и минимальной степенью вершины]]<br />
<br />
== Остовные деревья ==<br />
* [[Матрица Кирхгофа]]<br />
* [[Связь матрицы Кирхгофа и матрицы инцидентности]]<br />
* [[Подсчет числа остовных деревьев с помощью матрицы Кирхгофа]]<br />
* [[Количество помеченных деревьев]]<br />
* [[Коды Прюфера]]<br />
<br />
== Обходы графов ==<br />
* [[Эйлеров цикл, Эйлеров путь, Эйлеровы графы, Эйлеровость орграфов]]<br />
* [[Покрытие ребер графа путями]]<br />
* [[Алгоритм построения Эйлерова цикла]]<br />
* [[Произвольно вычерчиваемые из заданной вершины графы]]<br />
* [[Гамильтоновы графы]]<br />
* [[Теорема Хватала]]<br />
* [[Теорема Дирака]]<br />
* [[Теорема Оре]]<br />
* [[Турниры]]<br />
* [[Теорема Редеи-Камиона]]<br />
<br />
== Укладки графов ==<br />
* [[Укладка графа на плоскости]]<br />
* [[Формула Эйлера]]<br />
* [[Непланарность K5 и K3,3|Непланарность <tex>K_5</tex> и <tex>K_{3,3}</tex>]]<br />
* [[Укладка дерева]]<br />
* [[Укладка графа с планарными компонентами реберной двусвязности]]<br />
* [[Укладка графа с планарными компонентами вершинной двусвязности]]<br />
* [[Теорема Понтрягина-Куратовского]]<br />
* [[Двойственный граф планарного графа]]<br />
<br />
== Раскраски графов ==<br />
* [[Раскраска графа]]<br />
* [[Двудольные графы и раскраска в 2 цвета]]<br />
* [[Хроматический многочлен]]<br />
** [[Хроматический многочлен#Хроматический многочлен полного графа|Хроматический многочлен полного графа]]<br />
** [[Хроматический многочлен#Хроматический многочлен пустого графа|Хроматический многочлен пустого графа]]<br />
** [[Хроматический многочлен#Хроматический многочлен дерева|Хроматический многочлен дерева]]<br />
** [[Хроматический многочлен#Рекуррентные формулы для хроматических многочленов|Рекуррентные формулы для хроматических многочленов]]<br />
** [[Хроматический многочлен#Коэффициенты хроматического многочлена|Коэффициенты хроматического многочлена: старший, второй коэффициенты, знакопеременность]]<br />
* [[Формула Зыкова]]<br />
* [[Формула Уитни]]<br />
* [[Теорема Брукса]]<br />
* [[Верхняя оценка хроматического числа длиной нечетного цикла]]<br />
* [[Нижняя оценка хроматического числа]]<br />
<br />
== Обход в глубину ==<br />
* [[Обход в глубину, цвета вершин]]<br />
* [[Лемма о белых путях]]<br />
* [[Использование обхода в глубину для проверки связности]]<br />
* [[Использование обхода в глубину для поиска цикла в ориентированном графе]]<br />
* [[Использование обхода в глубину для топологической сортировки]]<br />
* [[Использование обхода в глубину для поиска компонент сильной связности]]<br />
* [[Использование обхода в глубину для поиска точек сочленения]]<br />
* [[Построение компонент вершинной двусвязности]]<br />
* [[Использование обхода в глубину для поиска мостов]]<br />
* [[Построение компонент реберной двусвязности]]<br />
<br />
== Кратчайшие пути в графах ==<br />
* [[Обход в ширину]]<br />
* [[Алгоритм Форда-Беллмана]]<br />
* [[Алгоритм Дейкстры]]<br />
* [[Алгоритм Флойда]]<br />
* [[Алгоритм A*]]<br />
* [[Алгоритм Джонсона]]<br />
<br />
== Построение остовных деревьев ==<br />
* [[Лемма о безопасном ребре]]<br />
* [[Алгоритм Прима]]<br />
* [[Алгоритм Краскала]]<br />
* [[Алгоритм Борувки]]<br />
* [[Критерий Тарьяна минимальности остовного дерева|Теорема Тарьяна (критерий минимальности остовного дерева)]]<br />
* [[Алгоритм двух китайцев]]<br />
<br />
== Задача о паросочетании ==<br />
* [[Теорема о максимальном паросочетании и дополняющих цепях]]<br />
* [[Алгоритм Форда-Фалкерсона для поиска максимального паросочетания]]<br />
* [[Алгоритм Куна для поиска максимального паросочетания]]<br />
* [[Теорема Холла]]<br />
* [[Связь максимального паросочетания и минимального вершинного покрытия в двудольных графах]]<br />
* [[Связь вершинного покрытия и независимого множества]]<br />
* [[Матрица Татта и связь с размером максимального паросочетания в двудольном графе]]<br />
* [[Алгоритм вырезания соцветий|Паросочетания в недвудольных графах. Алгоритм вырезания соцветий]]<br />
<br />
== Задача о максимальном потоке ==<br />
* [[Определение сети, потока]]<br />
* [[Разрез, лемма о потоке через разрез]]<br />
* [[Дополняющая сеть, дополняющий путь]]<br />
* [[Лемма о сложении потоков]]<br />
* [[Теорема Форда-Фалкерсона]]<br />
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]<br />
* [[Алоритм Эдмондса-Карпа]]<br />
* [[Алгоритм масштабирования потока]]<br />
* [[Блокирующий поток]]<br />
* [[Схема алгоритма Диница]]<br />
* [[Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями]]<br />
* [[Алгоритм поиска блокирующего потока в ациклической сети]]<br />
* [[Метод проталкивания предпотока]]<br />
* [[Алгоритм "поднять-в-начало"]]<br />
* [[Теорема о декомпозиции]]<br />
* [[Теорема о декомпозиционном барьере]]<br />
* [[Циркуляция потока]]<br />
<br />
== Задача о потоке минимальной стоимости ==<br />
* [[Поток минимальной стоимости]]<br />
* [[Теорема Форда-Фалкерсона о потоке минимальной стоимости]]<br />
* [[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]<br />
* [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]<br />
* [[Использование потенциалов Джонсона при поиске потока минимальной стоимости]]<br />
* [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]<br />
* [[Венгерский алгоритм решения задачи о назначениях]]<br />
<br />
= Четвертый семестр =<br />
<br />
== Основные определения. Простые комбинаторные свойства слов ==<br />
* [[Основные определения, связанные со строками]]<br />
* [[Период и бордер, их связь]]<br />
* [[Слово Фибоначчи]]<br />
* [[Слово Туэ-Морса]]<br />
<br />
== Поиск подстроки в строке ==<br />
* [[Наивный алгоритм поиска подстроки в строке]]<br />
* [[Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]]<br />
* [[Поиск наибольшей общей подстроки двух строк с использованием хеширования]]<br />
* [[Префикс-функция]]<br />
* [[Алгоритм Кнута-Морриса-Пратта]]<br />
* [[Z-функция]]<br />
* [[Автомат для поиска образца в тексте]]<br />
* [[Бор]]<br />
* [[Алгоритм Ахо-Корасик]]<br />
<br />
== Суффиксное дерево ==<br />
* [[Суффиксный бор]]<br />
* [[Сжатое суффиксное дерево]]<br />
* [[Алгоритм Укконена]]<br />
<br />
== Суффиксный массив ==<br />
* [[Суффиксный массив]]<br />
* [[Построение суффиксного массива с помощью стандартных методов сортировки]]<br />
* [[Цифровая сортировка]]<br />
* [[Алгоритм цифровой сортировки суффиксов циклической строки]]<br />
* [[Алгоритм Касаи и др.]]<br />
* [[Алгоритм Карккайнена-Сандерса]]<br />
* [[Алгоритм поиска подстроки в строке с помощью суффиксного массива]]<br />
<br />
== Задача о наименьшем общем предке ==<br />
* [[Метод двоичного подъема]]<br />
* [[Сведение задачи LCA к задаче RMQ]]<br />
* [[Решение RMQ с помощью разреженной таблицы]]<br />
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четырех русских)<br />
* [[Алгоритм Шибера-Вишкина]]<br />
* [[Сведение задачи RMQ к задаче LCA]]<br />
<br />
== Матроиды ==<br />
* [[Определение матроида]]<br />
* [[Примеры матроидов]]<br />
* [[Прямая сумма матроидов]]<br />
* [[Теорема Радо-Эдмондса (жадный алгоритм)]]<br />
* [[Жадный алгоритм поиска базы минимального веса]]<br />
* [[Теорема о базах]]<br />
* [[Аксиоматизация матроида базами]]<br />
* [[Теорема о циклах]]<br />
* [[Аксиоматизация матроида циклами]]<br />
* [[Ранговая функция, полумодулярность]]<br />
* [[Двойственный матроид]]<br />
* [[Оператор замыкания для матроидов]]<br />
=== Пересечение матроидов ===<br />
* [[Пересечение матроидов, определение, примеры]]<br />
* [[Лемма о паросочетании в графе замен]]<br />
* [[Лемма о единственном паросочетании в графе замен]]<br />
* [[Граф замен для двух матроидов]]<br />
* [[Лемма о единственном паросочетании в подграфе замен, индуцированном кратчайшим путем]]<br />
* [[Алгоритм построения базы в пересечении матроидов]]<br />
* [[Теорема Эдмондса-Лоулера]]<br />
=== Объединение матроидов ===<br />
* [[Объединение матроидов, проверка множества на независимость]]<br />
* [[Объединение матроидов, доказательство того, что объединение является матроидом]]<br />
* [[Алгоритм построения базы в объединении матроидов]]<br />
<br />
== Теория расписаний ==<br />
* [[Классификация задач]]<br />
* [[Методы решения задач теории расписаний]]<br />
* [[Правило Лаулера]]<br />
* [[Flow shop]]<br />
* [[1precpmtnrifmax|<tex>1 \mid prec, pmtn, r_i \mid f_{\max}</tex>]]<br />
* [[QpmtnCmax|<tex>Q \mid pmtn \mid C_{max}</tex>]]<br />
* [[QpmtnriLmax|<tex>Q \mid pmtn, r_{i} \mid L_{max}</tex>]]<br />
* [[P2precpi1Lmax|<tex>P2 \mid prec, p_i = 1 \mid L_{\max}</tex>]]<br />
* [[R2Cmax|<tex>R2 \mid \mid C_{max}</tex>]]<br />
* [[O2Cmax|<tex>O2 \mid \mid C_{max}</tex>]]<br />
* [[PpmtnriLmax|<tex>P \mid pmtn, r_i \mid L_{max}</tex>]]<br />
* [[Opi1sumu|<tex>O \mid p_{ij} = 1 \mid \sum U_i</tex>]]<br />
* [[Fpij1sumwu|<tex>F \mid p_{ij} = 1 \mid \sum w_i U_i</tex>]]<br />
* [[1ripi1sumwc|<tex>1 \mid r_{i}, p_i=1\mid \sum w_{i}C_{i}</tex>]]<br />
* [[1ridipi1|<tex>1 \mid r_{i}, d_{i}, p_{i} = 1 \mid -</tex>]]<br />
* [[1outtreesumwc | <tex>1 \mid outtree \mid \sum w_i C_i</tex>]]<br />
* [[1pi1sumwu|<tex>1 \mid p_{i} = 1 \mid \sum w_{i}U_{i}</tex>]]<br />
* [[QSumCi|<tex>Q\mid\mid\sum{C_i}</tex>]]<br />
* [[J2pij1Lmax| <tex>J2\mid p_{ij} = 1\mid L_{max}</tex>]]<br />
* [[P1sumu|<tex>1 \mid \mid \sum U_{i}</tex>]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D1%8F%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B0_%D1%85%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%B0_%D0%B4%D0%BB%D0%B8%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D1%87%D1%91%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&diff=29618Верхняя оценка хроматического числа длиной нечётного цикла2013-01-13T18:18:27Z<p>Danek g30: </p>
<hr />
<div>{{Лемма <br />
|about = оценка хроматического числа длиной максимального нечётного цикла<br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - длина максимального простого цикла графа <tex>G</tex>, <tex>\Delta \ge 3</tex>. Тогда, <tex>\chi(G) \le \Delta(G) + 1</tex>. <br />
|proof=<br />
Опишем на графе следующий алгоритм раскраски:<br />
*Из произвольной вершины <tex>v</tex> запусти алгоритм поиска в глубину. Пусть <tex>T</tex> {{---}} дерево обхода глубина графа <tex>G</tex> с корнем в вершине <tex>v</tex>.<br />
*Произвольную вершину <tex>u</tex>, покрасим в цвет <tex>dist(v,u)</tex> <tex> \mod </tex> <tex> (\Delta + 1)</tex>, где <tex>dist(v,u)</tex>{{---}} расстояние между вершинами <tex>u,v</tex> в графe <tex>T</tex>.<br />
Докажем от противного, что после выполнения описанного алгоритма граф <tex>G</tex> будет правильно раскрашен.<br />
Предположим, что после выполнения алгоритма покраски в графе существует ребро, соединяющее вершины <tex> a,b </tex> одного цвета.Пусть <tex>color(v)</tex> {{---}} цвет вершины после выполнения алгоритма раскраски.Заметим, что для произвольной вершины графа <tex>p</tex>, <tex>dist(v,p) = color(p) + n(\Delta + 1)</tex> , <tex>n \ge 0 </tex>.Тогда, <tex>dist(v,a) - dist(v,b) = k(\Delta + 1)</tex>.Поскольку в дереве dfs между вершинами находящимися на одинаковом расстоянии от корня нет перекрестных ребер, то <tex> k \ge 1</tex>. То есть, вершины <tex>a,b</tex> лежат на простом цикле длины по крайней мере <tex>\Delta + 2</tex>. Получается противоречие с условием потому, что длина максимального простого цикла получается больше чем <tex>\Delta</tex>.<br />
Таким образом в графе <tex>G</tex> после выполнения алгоритма раскраски нет вершин одного цвета соединенных ребром и при этом каждая вершина покрашена в один из <tex>\Delta + 1</tex>, то есть <tex>G</tex> правильно раскрашен в <tex>\Delta + 1</tex> цвет, следовательно <tex>\chi(G) \le \Delta(G) + 1</tex><br />
<br />
<br />
}}</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=29610Теорема Брукса2013-01-13T17:59:52Z<p>Danek g30: /* Теорема */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|300px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является вершинно двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|300px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=29608Теорема Брукса2013-01-13T17:56:19Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|300px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|300px|thumb|Алгоритм расскраски для 3ого случая на 5ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=29607Теорема Брукса2013-01-13T17:55:19Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|300px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|300px|thumb|Алгоритм расскраски для 3ого случая на 6ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм обхода в ширину из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=29606Теорема Брукса2013-01-13T17:51:27Z<p>Danek g30: </p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|300px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#[[Файл:Brooks_2.png|300px|thumb|Алгоритм расскраски для 3ого случая на 6ом шаге]]Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм [[Обхода в ширину| обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Brooks_2.png&diff=29604Файл:Brooks 2.png2013-01-13T17:48:01Z<p>Danek g30: загружена новая версия «Файл:Brooks 2.png»</p>
<hr />
<div></div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Brooks_2.png&diff=28631Файл:Brooks 2.png2012-12-31T17:55:02Z<p>Danek g30: </p>
<hr />
<div></div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=28563Теорема Брукса2012-12-29T14:05:18Z<p>Danek g30: /* Вспомогательная Лемма */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|300px|thumb|Алгоритм расскраски на 5ом шаге]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм [[Обхода в ширину| обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=28562Теорема Брукса2012-12-29T14:04:24Z<p>Danek g30: /* Вспомогательная Лемма */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|300px|thumb|]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм [[Обхода в ширину| обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%91%D1%80%D1%83%D0%BA%D1%81%D0%B0&diff=28561Теорема Брукса2012-12-29T14:03:50Z<p>Danek g30: /* Вспомогательная Лемма */</p>
<hr />
<div>== Вспомогательная Лемма ==<br />
{{Лемма <br />
|statement= Пусть <tex>G(V,E)</tex> - произвольный связный неориентированный граф и <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex>. Если в таком графе существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то <tex>\chi(G) \le \Delta(G)</tex>.<br />
|proof=<br />
[[Файл:Brooks_1.png|200px|thumb|]]<br />
Запустим алгоритм [[Обход в ширину|обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_n,</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs. Далее начнем красить вершины в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета. На <tex> i</tex>ом шаге покраски, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов. Поскольку на каждом шаге алгоритм отработает корректно, следовательно граф можно правильно раскрасить в не более чем <tex> \Delta</tex> цветов, то есть <tex> \chi(G) \le \Delta(G)</tex>.<br />
<br />
}}<br />
<br />
== Теорема ==<br />
{{Теорема<br />
|about= Брукса<br />
|statement=Пусть <tex>G(V,E)</tex> {{---}} связный неориентированный граф и <tex>G</tex> не является <tex>K_m</tex> или <tex>C_{2m+1}</tex>, ни для кого <tex> m</tex>, тогда <tex>\chi(G) \le \Delta(G)</tex>, где <tex>\Delta(G)</tex> - максимальная степень вершин <tex>G</tex> <br />
<br />
<br />
|proof=<br />
#Если <tex> \Delta = 0</tex>, <tex> G = K_1</tex><br />
#Если <tex> \Delta = 1</tex>, <tex> G = K_2</tex><br />
#Если <tex> \Delta = 2</tex>, то:<br />
## <tex> G </tex>{{---}} либо дерево либо четный цикл и тогда <tex> \chi(G) = 2</tex><br />
##<tex> G</tex> нечетный цикл<br />
Поэтому мы будем считать до конца доказательства, что <tex> \Delta(G) \ge 3</tex>.<br />
Если в <tex>G</tex> существует вершина <tex>v</tex> степени <tex> deg\ v < \Delta(G)</tex>, то по выше доказанной лемме <tex> \chi(G) \le \Delta(G)</tex>. То есть осталось рассмотреть случай, когда <tex>G</tex> {{---}} регулярный граф степени <tex>\Delta</tex>.<br />
<br />
#Если <tex>G</tex> не является двусвязным графом, тогда в графе <tex> G</tex> <tex> \exists</tex> <tex> v \in V</tex>, где v {{---}} точка сочленения. Пусть <tex>G_1,G_2</tex> две компоненты связности полученный при удалении вершины <tex>v</tex>.Тогда, по выше доказанной лемме <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.Поскольку количество соседей вершины <tex> v </tex> в каждой из компонент не более <tex> \Delta - 1</tex>, то <tex>G</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
#Если в графе <tex> G</tex> <tex> \exists</tex> <tex> v,u \in V :(u,v) \notin E</tex> и при удалении вершин <tex>v,u</tex> граф теряет связность .Пусть <tex>G_1,G_2</tex> два подграфа <tex> G:G_1 \cap G_2 = \{v,u\} \land G_1 \cup G_2 = G</tex>. Рассмотрим два случая:<br />
## Если в одном из подграфов <tex> G_1,G_2</tex> <tex> deg\ u < \Delta - 2 </tex> или <tex> deg\ v < \Delta - 2 </tex> то, подграфы <tex>G_1,G_2</tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.А из этого следует что, граф <tex>G</tex> тоже можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов.<br />
## Если степени обоих вершин в одном из подграфов равны <tex> \Delta - 1</tex> например в подграфе <tex>G_1</tex>:<br />
##* <tex> G_1,G_2 </tex> можно правильно раскрасить в неболее чем <tex>\Delta</tex> цветов так, чтобы вершины <tex> u,v </tex> были бы разных цветов.Тогда очевидно, что оценка теоремы выполнена. <br />
##* <tex>\exists p \in G_2: pu \in E \land pv \in E </tex>, тогда мы можем правильно раскрасить <tex>G_2</tex>, где <tex>deg\ u = deg\ v = 1</tex>, в не более чем <tex> \Delta </tex> цветов так, чтобы вершины <tex>u,v</tex> были одного цвета.Следовательно,можно покрасить граф <tex>G</tex> в не более чем <tex>\Delta</tex> цветов.<br />
##*<tex>\exists u_1,v_1 \in G_2: uu_1 \in E \land vv_1 \in E \land u_1 \neq v_1 </tex>, тогда вместо вершин <tex>\{u,v\}</tex> рассмотрим вершины <tex>\{u,v_1\}</tex>.Заметим, что при удалении этих вершин граф потеряет связность и между ними нет ребра,то есть для этой пары вершин можно провести рассуждения аналогичные тем которые проводились для вершин <tex> v,u</tex>.Из чего, прямым образом вытекает, что граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta </tex> цветов.<br />
#Если вышеописанные случаи не подходят, тогда рассмотрим <tex>w \in V : deg\ w = \Delta</tex>. У вершины <tex>w</tex> должны существовать две соседние вершины <tex>u,v : uv \notin E </tex>, в противном случаи <tex>G = K_n</tex>.Пусть <tex>G_- = G - u - v </tex>. Заметим, что <tex>G_-</tex> связный граф, запустим для <tex>G_-</tex> алгоритм [[Обхода в ширину| обхода в ширину]] из вершины <tex>w</tex>. Пронумеруем вершины <tex>v_1,...,v_{n-2},</tex> где <tex>v_i</tex> вершина рассмотренная на <tex>i</tex>ом шаге алгоритма bfs.Теперь пусть <tex> v_{n-1} = v</tex>,и <tex>v_n = u</tex>. Покрасим <tex>v_n,v_{n-1}</tex> в один цвет, далее начнем красить вершины в обратном порядке начиная с <tex>v_{n-2}</tex> в обратном порядке в один из <tex>\Delta</tex> цветов так, чтобы никакое ребро графа не соединяло вершины одного цвета.Заметим, что так всегда можно сделать, поскольку на <tex> i</tex>ом шаге покраски,где <tex>i \neq n</tex>, для вершины <tex> v_{n - i+1}</tex> есть не более <tex>\Delta(G) - 1</tex> уже покрашенных соседей, следовательно вершину <tex> v_{n-i+1}</tex> можно покрасить по крайней мере в один из свободных цветов.Вершину <tex>w</tex>,мы тоже сможем правильно раскрасить в не более чем один из <tex>\Delta</tex> цветов потому, что ее <tex>\Delta</tex> соседей покрашено в не более чем <tex>\Delta - 1</tex> цветов. Таким образом граф <tex> G</tex> можно правильно раскрасить в не более чем не более чем <tex>\Delta</tex> цветов.<br />
}}<br />
<br />
== Источники ==<br />
<br />
* [http://myweb.facstaff.wwu.edu/sarkara/brooks.pdf Доказательство на английском]<br />
* [http://en.wikipedia.org/wiki/Brooks'_theorem Теорема Брукса на вики]<br />
<br />
<br />
[[Категория: Алгоритмы и структуры данных]]<br />
[[Категория: Раскраски графов]]</div>Danek g30