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

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=71121</id>
		<title>Теорема о рекурсии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8&amp;diff=71121"/>
				<updated>2019-04-26T01:35:04Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Пример использования теоремы о рекурсии в доказательстве о неразрешимости языка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теорема о рекурсии== &lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольную вычислимую функцию от двух аргументов — &amp;lt;tex&amp;gt;V(x, y)&amp;lt;/tex&amp;gt;. Теорема о рекурсии утверждает, что всегда можно найти эквивалентную ей &amp;lt;tex&amp;gt;p(y) = V(p, y)&amp;lt;/tex&amp;gt;, которая будет использовать саму себя для вычисления значения. Сформулируем теорему более формально.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1&lt;br /&gt;
|author=Клини&lt;br /&gt;
|about=о рекурсии / ''Kleene's recursion theorem''&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;V(n, x)&amp;lt;/tex&amp;gt; {{---}} [[Вычислимые функции|вычислимая функция]]. Тогда найдётся такая вычислимая &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;\forall y:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p(y) = V(p, y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Приведем конструктивное доказательство теоремы.&lt;br /&gt;
&lt;br /&gt;
Введем новые обозначения для псевдокода. Внутри блока '''program''' располагаются функции, среди которых есть функция &amp;lt;tex&amp;gt;\mathrm{main}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
 '''program int''' p('''int''' x):&lt;br /&gt;
   ...&lt;br /&gt;
 &lt;br /&gt;
   '''int''' main():&lt;br /&gt;
     ...&lt;br /&gt;
  &lt;br /&gt;
  ...&lt;br /&gt;
Тогда вызов &amp;lt;tex&amp;gt;\mathrm{p(x)}&amp;lt;/tex&amp;gt; — вызов функции &amp;lt;tex&amp;gt;\mathrm{main}&amp;lt;/tex&amp;gt; от соответствующего аргумента.&lt;br /&gt;
&lt;br /&gt;
Все входные данные далее можно интерпретировать как строки, поэтому все типы аргументов и возвращаемых значений будут иметь тип '''string'''. Пусть есть вычислимая &amp;lt;tex&amp;gt;V(x,y)&amp;lt;/tex&amp;gt;. Будем поэтапно строить функцию &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt; Предположим, что у нас в распоряжении есть функция &amp;lt;tex&amp;gt;\mathrm{getSrc()}&amp;lt;/tex&amp;gt;, которая вернет код &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt;. Тогда саму &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt; можно переписать так:&lt;br /&gt;
 '''program string''' p('''string''' y): &lt;br /&gt;
    '''string''' V('''string''' x, '''string''' y):&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    '''string''' main():&lt;br /&gt;
       '''return''' V(getSrc(), y)&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getSrc():&lt;br /&gt;
       ...&lt;br /&gt;
Теперь нужно определить функцию &amp;lt;tex&amp;gt;\mathrm{getSrc()}&amp;lt;/tex&amp;gt;. Предположим, что внутри &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt; мы можем определить функцию &amp;lt;tex&amp;gt;\mathrm{getOtherSrc()}&amp;lt;/tex&amp;gt;, состоящую из одного оператора &amp;lt;tex&amp;gt;\mathrm{return}&amp;lt;/tex&amp;gt;, которая вернет весь предшествующий ей код. Тогда &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt; перепишется так.&lt;br /&gt;
&lt;br /&gt;
 '''program string''' p('''string''' y): &lt;br /&gt;
    '''string''' V('''string''' x, '''string''' y):&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    '''string''' main():&lt;br /&gt;
       '''return''' V(getSrc(), y)&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getSrc():&lt;br /&gt;
       '''string''' src = getOtherSrc()&lt;br /&gt;
       '''return''' ```$src                    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// символ $ перед названием переменной  используется для подстановки значения этой переменной в строку&amp;lt;/font&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;string getOtherSrc():   &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// многострочные строки заключаются в ``` и используют &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; в качестве разделителя&amp;lt;/font&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return $src```&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getOtherSrc():&lt;br /&gt;
     ...&lt;br /&gt;
&lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;\mathrm{getOtherSrc()}&amp;lt;/tex&amp;gt; определяется очевидным образом, и мы получаем '''итоговую версию''' функции &amp;lt;tex&amp;gt;p(y)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''program string''' p('''string''' y): &lt;br /&gt;
    '''string''' V('''string''' x, '''string''' y):&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    '''string''' main():&lt;br /&gt;
       '''return''' V(getSrc(), y)&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getSrc():&lt;br /&gt;
       '''string''' src = getOtherSrc()&lt;br /&gt;
       '''return''' ```$src &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;string getOtherSrc(): &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return $src```&lt;br /&gt;
 &lt;br /&gt;
    '''string''' getOtherSrc():&lt;br /&gt;
       '''return''' ```function  p(int y):       &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;  int V(string x, int y):&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    ...&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;  int main():&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return V(getSrc(), y)&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;  string getSrc():&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    string src = getOtherSrc()&lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;    return \```$src &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;              &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;string getOtherSrc(): &lt;br /&gt;
                &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;              &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;   return \$src\```&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
Иначе говоря, если рассмотреть &amp;lt;tex&amp;gt;V(x, y)&amp;lt;/tex&amp;gt;, как программу, использующую &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в качестве исходного кода и выполняющую действие над &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;, то теорема о рекурсии показывает, что мы можем написать эквивалентную ей программу &amp;lt;tex&amp;gt;p(y) = V(p, y)&amp;lt;/tex&amp;gt;, которая будет использовать собственный исходный код.&lt;br /&gt;
&lt;br /&gt;
Приведем так же альтернативую формулировку теоремы и альтернативное (неконструктивное) доказательство.&lt;br /&gt;
&lt;br /&gt;
==Теорема о неподвижной точке==&lt;br /&gt;
Введем на множестве натуральных чисел следующее отношение: &amp;lt;tex&amp;gt;x \equiv y \Leftrightarrow U_x = U_y&amp;lt;/tex&amp;gt; и докажем вспомогательную лемму.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Функция &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением (&amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} continuation)''' функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;, если для всех таких &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; определено, &amp;lt;tex&amp;gt;g(x) \equiv f(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Для всякой вычислимой функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; существует вычислимая и всюду определенная функция &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt;, являющаяся ее &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением.&lt;br /&gt;
|proof= Рассмотрим вычислимую функцию от двух аргументов &amp;lt;tex&amp;gt; V(n, x) = U(f(n), x)&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — вычислимая, то существует вычислимая и всюду определенная функция &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; такая, что: &amp;lt;tex&amp;gt;V(n, x) = U(s(n), x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; будет являться &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением функции &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt; определено, то &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; вернет другой номер той же вычислимой функции. Если же &amp;lt;tex&amp;gt;f(n)&amp;lt;/tex&amp;gt; не определено, то &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; вернет номер нигде не определенной функции.&lt;br /&gt;
Таким образом, мы нашли &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжение для произвольно взятой вычислимой функции &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th2&lt;br /&gt;
|author=Роджерс&lt;br /&gt;
|about=о неподвижной точке / ''Rogers' fixed-point theorem''&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; {{---}} [[Диагональный_метод|универсальная функция]] для класса вычислимых функций одного аргумента, &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; {{---}} всюду определённая [[Вычислимые_функции|вычислимая функция]] одного аргумента. Тогда найдется такое &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;U_n=U_{h(n)}&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h(n)&amp;lt;/tex&amp;gt; — номера одной функции.&lt;br /&gt;
|proof=&lt;br /&gt;
Будем доказывать теорему от противного: предположим, что существует всюду определенная вычислимая функция &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, такая, что &amp;lt;tex&amp;gt;U_n \neq U_{h(n)}&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. В терминах введенного нами отношения, это значит, что &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; не имеет &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} неподвижных точек. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим некоторую вычислимую функцию, от которой никакая вычислимая функция не может отличаться всюду. Такой будет, например &amp;lt;tex&amp;gt;f(x) = U(x, x)&amp;lt;/tex&amp;gt; (действительно, если предположить, что существует вычислимая функция &amp;lt;tex&amp;gt;g(n)&amp;lt;/tex&amp;gt;, всюду отличная от &amp;lt;tex&amp;gt;f(n) = U(n, n)&amp;lt;/tex&amp;gt;, то нарушается определение универсальной функции.)&lt;br /&gt;
&lt;br /&gt;
Согласно доказанной нами лемме, существует вычислимая и всюду определенная функция &amp;lt;tex&amp;gt;g(x)&amp;lt;/tex&amp;gt;, являющаяся &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} продолжением функции &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt;. Давайте зададим функцию &amp;lt;tex&amp;gt;t(x)&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;t(x) = h(g(x))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;h(x)&amp;lt;/tex&amp;gt; — искомая всюду определенная, вычислимая функция, не имеющая &amp;lt;tex&amp;gt;\equiv&amp;lt;/tex&amp;gt; {{---}} неподвижных точек. Тогда &amp;lt;tex&amp;gt;t(x)&amp;lt;/tex&amp;gt; всюду отличается от &amp;lt;tex&amp;gt;f(x)&amp;lt;/tex&amp;gt; (в силу того, что &amp;lt;tex&amp;gt;h(x)&amp;lt;/tex&amp;gt; не имеет неподвижных точек.) Получили противоречие, из чего следует, что такой функции &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; не существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=идентификатор (необязательно), пример: proposalF. &lt;br /&gt;
|statement = &amp;lt;tex&amp;gt; \exists n : W_n = \{n\} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; W_n &amp;lt;/tex&amp;gt; {{---}} множество слов, допускаемых программой с номером &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По [[Теорема о рекурсии | теореме о рекурсии]], программа может знать свой исходный код. Значит, в неё можно написать функцию &amp;lt;tex&amp;gt; \mathrm{getSrc()} &amp;lt;/tex&amp;gt;, которая вернёт строку {{---}} исходный код программы. &lt;br /&gt;
Напишем такую программу:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;tex&amp;gt;p(q){:}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''if''' &amp;lt;tex&amp;gt;p. \mathrm{getSrc()}&amp;lt;/tex&amp;gt; == &amp;lt;tex&amp;gt;q. \mathrm{getSrc()}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''return''' 1&lt;br /&gt;
    '''else'''&lt;br /&gt;
      '''while''' ''true''&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Программа &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; знает свой код, что то же самое, что и знает свой номер. Как видно из её кода, она допускает только одно число {{---}} свой номер.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Пример использования теоремы о рекурсии в доказательстве о неразрешимости языка==&lt;br /&gt;
Используя теорему о рекурсии, приведём простое доказательство неразрешимости языка &amp;lt;tex&amp;gt;L=\{p \mid p(\varepsilon)=\perp\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=st2&lt;br /&gt;
|statement= Язык &amp;lt;tex&amp;gt;L=\{p \mid p(\varepsilon)=\perp\}&amp;lt;/tex&amp;gt; неразрешим. &lt;br /&gt;
|proof=&lt;br /&gt;
Предположим обратное, тогда существует программа &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; разрещающая &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим следущую программу:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;p(x){:}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''if''' r(getSrc())&lt;br /&gt;
      '''return''' 1&lt;br /&gt;
   '''while''' ''true''&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p(\epsilon)=\perp&amp;lt;/tex&amp;gt;. Тогда условие &amp;lt;tex&amp;gt;r(p)&amp;lt;/tex&amp;gt; выполняется и &amp;lt;tex&amp;gt;p(\epsilon)=1&amp;lt;/tex&amp;gt;. Противоречие. Если &amp;lt;tex&amp;gt;p(\epsilon) \ne \perp&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;r(p)&amp;lt;/tex&amp;gt; не выполняется и &amp;lt;tex&amp;gt;p(\epsilon)=\perp&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Участник:Shersh/Теорема_о_рекурсии]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [[wikipedia:Kleene's_recursion_theorem | Wikipedia {{---}} Kleene's recursion theorem]]&lt;br /&gt;
* ''Верещагин Н. К., Шень А.'' '''Лекции по математической логике и теории алгоритмов. Часть 3. Вычислимые функции''' — М.: МЦНМО, 1999 - С. 176&lt;br /&gt;
* ''Kleene, Stephen'' '''On notation for ordinal numbers''' - The Journal of Symbolic Logic, 1938 - С. 150-155&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Теория вычислимости]]&lt;br /&gt;
[[Категория:Разрешимые и перечислимые языки]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66697</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66697"/>
				<updated>2018-11-08T14:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
[[Image: Graph-BFS.gif|thumb|240px|Алгоритм BFS&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#3c9eff&amp;gt;посещенные&amp;lt;/font&amp;gt; вершины&amp;lt;br&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
ш-&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага алгоритма элементы в очереди неубывают. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: &lt;br /&gt;
&lt;br /&gt;
Вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque). Если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то будем добавлять вершину в начало, а иначе в конец. После этого добавления, дополнительный введенный инвариант в доказательстве [[#Корректность | расположения элементов в деке в порядке неубывания]] продолжает выполняться, поэтому порядок в деке сохраняется. И, соответственно, релаксируем расстояние до всех смежных вершин и, при успешной релаксации, добавляем их в дек. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1 \ldots k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2 \ldots u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1 \ldots u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Обход в глубину, цвета вершин]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Теория графов]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66696</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66696"/>
				<updated>2018-11-08T14:16:56Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
[[Image: Graph-BFS.gif|thumb|240px|Алгоритм BFS&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=#3c9eff&amp;gt;посещенные&amp;lt;/font&amp;gt; вершины&amp;lt;br&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;/tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага алгоритма элементы в очереди неубывают. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: &lt;br /&gt;
&lt;br /&gt;
Вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque). Если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то будем добавлять вершину в начало, а иначе в конец. После этого добавления, дополнительный введенный инвариант в доказательстве [[#Корректность | расположения элементов в деке в порядке неубывания]] продолжает выполняться, поэтому порядок в деке сохраняется. И, соответственно, релаксируем расстояние до всех смежных вершин и, при успешной релаксации, добавляем их в дек. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1 \ldots k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2 \ldots u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1 \ldots u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Обход в глубину, цвета вершин]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Теория графов]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graph-BFS.gif&amp;diff=66695</id>
		<title>Файл:Graph-BFS.gif</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graph-BFS.gif&amp;diff=66695"/>
				<updated>2018-11-08T14:10:48Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Визуализация BFS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Визуализация BFS&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66694</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66694"/>
				<updated>2018-11-08T14:02:02Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;/tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага алгоритма элементы в очереди неубывают. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: &lt;br /&gt;
&lt;br /&gt;
Вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque). Если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то будем добавлять вершину в начало, а иначе в конец. После этого добавления, дополнительный введенный инвариант в доказательстве [[#Корректность | расположения элементов в деке в порядке неубывания]] продолжает выполняться, поэтому порядок в деке сохраняется. И, соответственно, релаксируем расстояние до всех смежных вершин и, при успешной релаксации, добавляем их в дек. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1 \ldots k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2 \ldots u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1 \ldots u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Обход в глубину, цвета вершин]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Теория графов]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66653</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66653"/>
				<updated>2018-11-06T16:15:54Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;/tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага алгоритма элементы в очереди неубывают. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: &lt;br /&gt;
&lt;br /&gt;
Вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque). Если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то будем добавлять вершину в начало, а иначе в конец. И, соответственно, релаксируем расстояние до всех смежных вершин и, при успешной релаксации, добавляем их в дек. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1 \ldots k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2 \ldots u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1 \ldots u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Обход в глубину, цвета вершин]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Теория графов]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66652</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66652"/>
				<updated>2018-11-06T16:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Добавлено см. также&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;/tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага алгоритма элементы в очереди неубывают. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: &lt;br /&gt;
&lt;br /&gt;
Вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque). Если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то будем добавлять вершину в начало, а иначе в конец. И, соответственно, релаксируем расстояние до всех смежных вершин и, при успешной релаксации, добавляем их в дек. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1 \ldots k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2 \ldots u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1 \ldots u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Обход в глубину]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Теория графов]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66651</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66651"/>
				<updated>2018-11-06T16:11:07Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Исправления, переформулировка 0-1 BFS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;/tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага алгоритма элементы в очереди неубывают. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: &lt;br /&gt;
&lt;br /&gt;
Вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque). Если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то будем добавлять вершину в начало, а иначе в конец. И, соответственно, релаксируем расстояние до всех смежных вершин и, при успешной релаксации, добавляем их в дек. &lt;br /&gt;
&lt;br /&gt;
Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1 \ldots k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2 \ldots u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1 \ldots u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66650</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66650"/>
				<updated>2018-11-06T15:58:38Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: переформулировано доказательство ут. 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
Введем дополнительный инвариант: у любых двух вершин из очереди, расстояние до &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; отличается не более чем на &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; i-й &amp;lt;/tex&amp;gt; итерации в очереди &amp;lt;tex&amp;gt; a + 1 &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; i-ю &amp;lt;/tex&amp;gt; итерацию. Из очереди достаем вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;. Пусть у v есть &amp;lt;tex&amp;gt;r  &amp;lt;/tex&amp;gt; непосещенных смежных вершин. Тогда, после их добавления, в очереди находится &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt; и, после них, &amp;lt;tex&amp;gt; b + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; x + 1 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Оба инварианта сохранились, &amp;lt;tex&amp;gt;  \Rightarrow &amp;lt;/tex&amp;gt; после любого шага в очереди элементы неубывают &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (u, v) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque), а вместо добавления вершины в конец будем добавлять вершину в начало, если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, а иначе в конец. Соответственно релаксируем расстояние до вершины. Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1..k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2..u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1..u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66649</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66649"/>
				<updated>2018-11-06T15:24:30Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Реализация */  немного поправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; с расстоянием &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, утверждение верно. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;-ого шага алгоритма очередь содержит &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Тогда на &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;-ом шаге мы извлечем из очереди одну вершину и добавим в нее все непосещенные(&amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; вершин), связанные с ней; расстояние до них, очевидно, будет равно &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. У нас останется &amp;lt;tex&amp;gt; p - 1 &amp;lt;/tex&amp;gt; (возможно, &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;) вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;, что соответствует нашему инварианту.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' v: (v, u) '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque), а вместо добавления вершины в конец будем добавлять вершину в начало, если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, а иначе в конец. Соответственно релаксируем расстояние до вершины. Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1..k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2..u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1..u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66648</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=66648"/>
				<updated>2018-11-06T15:19:35Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Переформатировано описание&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Обход в ширину''' (Поиск в ширину, англ. ''BFS'', ''Breadth-first search'') — один из простейших алгоритмов обхода [[Основные определения теории графов|графа]], являющийся основой для многих важных алгоритмов для работы с графами.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть задан невзвешенный ориентированный граф &amp;lt;tex&amp;gt; G = (V, E) &amp;lt;/tex&amp;gt;, в котором выделена исходная вершина &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Требуется найти длину кратчайшего пути (если таковой имеется) от одной заданной вершины до другой. Частным случаем указанного графа является невзвешенный неориентированный граф, т.е. граф, в котором для каждого ребра найдется обратное, соединяющее те же вершины в другом направлении.&lt;br /&gt;
&lt;br /&gt;
Для алгоритма нам потребуются [[Очередь|очередь]] и множество посещенных вершин &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt;, которые изначально содержат одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шагу алгоритм берет из начала очереди вершину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и добавляет все непосещенные смежные с &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; вершины в &amp;lt;tex&amp;gt; was &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Анализ времени работы ==&lt;br /&gt;
&lt;br /&gt;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где множество ребер &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; представлено списком смежности. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; \mathrm{deg}(v) &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum\limits_{v \in V} \mathrm{deg}(v) = 2|E| &amp;lt;/tex&amp;gt;, то время, используемое на работу с ребрами, составляет &amp;lt;tex&amp;gt; O(|E|) &amp;lt;/tex&amp;gt;. Поэтому общее время работы алгоритма поиска в ширину — &amp;lt;tex&amp;gt; O(|V| + |E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В очереди поиска в ширину расстояние вершин до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; монотонно неубывает.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
'''База''': изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; с расстоянием &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, утверждение верно. &lt;br /&gt;
&lt;br /&gt;
'''Переход''': пусть после &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;-ого шага алгоритма очередь содержит &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Тогда на &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;-ом шаге мы извлечем из очереди одну вершину и добавим в нее все непосещенные(&amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; вершин), связанные с ней; расстояние до них, очевидно, будет равно &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. У нас останется &amp;lt;tex&amp;gt; p - 1 &amp;lt;/tex&amp;gt; (возможно, &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;) вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q + r &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;, что соответствует нашему инварианту.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит длины кратчайших путей до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&gt;
Допустим, что это не так. Выберем из вершин, для которых кратчайшие пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; найдены некорректно, ту, настоящее расстояние до которой минимально. Пусть это вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, и она имеет своим предком в дереве обхода в ширину &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;, а предок в кратчайшем пути до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в кратчайшем пути, то &amp;lt;tex&amp;gt; \rho(s, u) = \rho(s, w) + 1 &amp;gt; \rho(s, w) &amp;lt;/tex&amp;gt;, и расстояние до w найдено верно, &amp;lt;tex&amp;gt; \rho(s, w) = d[w] &amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt; \rho(s, u) = d[w] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, то &amp;lt;tex&amp;gt; d[u] = d[v] + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расстояние до &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; найдено некорректно, поэтому &amp;lt;tex&amp;gt; \rho(s, u) &amp;lt; d[u] &amp;lt;/tex&amp;gt;. Подставляя сюда два последних равенства, получаем &amp;lt;tex&amp;gt; d[w] + 1 &amp;lt; d[v] + 1 &amp;lt;/tex&amp;gt;, то есть, &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Но она соединена с &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не может быть предком &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в дереве обхода в ширину, мы пришли к противоречию, следовательно, найденные расстояния до всех вершин являются кратчайшими.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Дерево обхода в ширину == &lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить [[Дерево, эквивалентные определения|дерево]] поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. Когда мы добавляем непосещенную вершину в очередь, то добавляем ее и ребро, по которому мы до нее дошли, в дерево. Поскольку каждая вершина может быть посещена не более одного раза, она имеет не более одного родителя. После окончания работы алгоритма для каждой достижимой из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; вершины &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; путь в дереве поиска в ширину соответствует кратчайшему пути от &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
&lt;br /&gt;
Предложенная ниже функция возвращает кратчайшее расстояние между двумя вершинами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; — исходная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{destination} &amp;lt;/tex&amp;gt; — конечная вершина&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{G} &amp;lt;/tex&amp;gt; — граф, состоящий из списка вершин &amp;lt;tex&amp;gt; \mathtt{V} &amp;lt;/tex&amp;gt; и списка смежности &amp;lt;tex&amp;gt; \mathtt{E} &amp;lt;/tex&amp;gt;. Вершины нумеруются целыми числами.&lt;br /&gt;
*&amp;lt;tex&amp;gt; \mathtt{Q} &amp;lt;/tex&amp;gt; — очередь.&lt;br /&gt;
*В поле &amp;lt;tex&amp;gt; \mathtt{d[u]} &amp;lt;/tex&amp;gt; хранится расстояние от &amp;lt;tex&amp;gt; \mathtt{source} &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; \mathtt{u} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int''' '''BFS'''(G: (V, E), source: '''int''', destination: '''int'''):&lt;br /&gt;
     d = '''int'''[|V|]&lt;br /&gt;
     '''fill'''(d, &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;)&lt;br /&gt;
     d[source] = 0&lt;br /&gt;
     Q = &amp;lt;tex&amp;gt; \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
     Q.push(source)&lt;br /&gt;
     '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
         u = Q.pop()&lt;br /&gt;
         '''for''' vu '''in''' E&lt;br /&gt;
             '''if''' d[v] == &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
                 d[v] = d[u] + 1&lt;br /&gt;
                 Q.push(v)&lt;br /&gt;
     '''return''' d[destination]&lt;br /&gt;
&lt;br /&gt;
Если требуется найти расстояние лишь между двумя вершинами, из функции можно выйти, как только будет установлено значение &amp;lt;tex&amp;gt; \mathtt{d[destination]} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Еще одна оптимизация может быть проведена при помощи метода [[Meet-in-the-middle#Задача о нахождении кратчайшего расстояния между двумя вершинами в графе|meet-in-the-middle]].&lt;br /&gt;
&lt;br /&gt;
== Вариации алгоритма ==&lt;br /&gt;
=== 0-1 BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра веса &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Для решения данной задачи модифицируем приведенный выше алгоритм следующим образом: вместо очереди будем использовать [[Персистентный_дек|дек]] (или можно даже steque), а вместо добавления вершины в конец будем добавлять вершину в начало, если рассматриваемое ее ребро имеет вес &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, а иначе в конец. Соответственно релаксируем расстояние до вершины. Таким образом, в начале дека всегда будет вершина, расстояние до которой меньше либо равно расстоянию до остальных вершин дека, и инвариант [[#Корректность | расположения элементов в деке в порядке неубывания]] сохраняется. Значит, алгоритм корректен на том же основании, что и обычный BFS. Очевидно, что каждая вершина войдет в дек не более двух раз, значит, асимптотика у данного алгоритма та же, что и у обычного BFS.&lt;br /&gt;
&lt;br /&gt;
=== 1-k BFS ===&lt;br /&gt;
Пусть в графе разрешены ребра целочисленного веса из отрезка &amp;lt;tex&amp;gt;1..k&amp;lt;/tex&amp;gt;, необходимо найти кратчайший путь между двумя вершинами. Представим ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; веса &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; как последовательность ребер &amp;lt;tex&amp;gt;uu_1u_2..u_{m - 1}v&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;u_1..u_{m - 1}&amp;lt;/tex&amp;gt; — новые вершины). Применим данную операцию ко всем ребрам графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Получим граф, состоящий (в худшем случае) из &amp;lt;tex&amp;gt;k|E|&amp;lt;/tex&amp;gt; ребер и &amp;lt;tex&amp;gt;|V| + (k - 1)|E|&amp;lt;/tex&amp;gt; вершин. Для нахождения кратчайшего пути следует запустить BFS на новом графе. Данный алгоритм будет иметь асимптотику &amp;lt;tex&amp;gt; O(|V| + k|E|) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
* [http://e-maxx.ru/algo/bfs MAXimal :: algo :: Поиск в ширину]&lt;br /&gt;
* [[wikipedia:en:Breadth-first_search| Wikipedia {{---}} Breadth-first search]]&lt;br /&gt;
* [[wikipedia:ru:Поиск_в_ширину| Wikipedia {{---}} Поиск в ширину]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A5%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD&amp;diff=66628</id>
		<title>Хроматический многочлен</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A5%D1%80%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD&amp;diff=66628"/>
				<updated>2018-10-31T16:50:23Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Хроматический многочлен колеса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=Пусть дан фиксированный граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и фиксированное число красок &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Количество способов правильной &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; — [[Раскраска графа|раскраски графа]] &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется '''хроматическим многочленом''' (англ. ''chromatic polynomial''). Обозначение: &amp;lt;tex&amp;gt;P(G,x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Рекуррентные формулы для хроматических многочленов ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Стягивание ребра''' (англ. ''edge contraction'') — замена концов ребра одной вершиной, соседями новой вершины становятся соседи этих концов. Будем обозначать за &amp;lt;tex&amp;gt;G/uv&amp;lt;/tex&amp;gt; граф, полученный из графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; стягиванием ребра &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;.}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; — несмежные вершины графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;G_1=G\cup uv&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;G_2=G/uv&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P(G,x)=P(G_1,x)+P(G_2,x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим все произвольные раскраски графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Рассмотрим те из них, при которых вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; окрашены в разные цвета. Если добавить к графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, то они не изменятся, то есть останутся правильными. Рассмотрим раскраски, при которых &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; одного цвета. Все эти раскраски останутся правильными и для графа, полученного из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; слиянием вершин &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
'''Замечание:'''&lt;br /&gt;
Если к некоторому произвольному графу добавлять ребра последовательно, не меняя его вершин, то на каком-то шаге мы получим полный граф. Аналогично мы получим полный граф, если в произвольном графе уменьшим число вершин, путем их отождествления, не меняя числа ребер. &lt;br /&gt;
&lt;br /&gt;
'''Следствие:'''&lt;br /&gt;
Хроматический многочлен любого графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равен сумме хроматических многочленов некоторого числа полных графов, число вершин в которых не больше, чем в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; — смежные вершины графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;G_1=G\backslash uv&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_2=G/uv&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P(G,x)=P(G_1,x)-P(G_2,x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Следует из предыдущей теоремы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры хроматических многочленов ==&lt;br /&gt;
=== Хроматический многочлен полного графа ===&lt;br /&gt;
&amp;lt;tex&amp;gt;P(K_{n},x)=x(x-1)...(x-n+1)=x^{\underline{n}}&amp;lt;/tex&amp;gt;, так как первую вершину полного графа &amp;lt;tex&amp;gt;K_{n}&amp;lt;/tex&amp;gt; можно окрасить в любой из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; цветов, вторую — в любой из оставшихся &amp;lt;tex&amp;gt;x-1&amp;lt;/tex&amp;gt; цветов и т. д. Очевидно, что если &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; меньше &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, то и многочлен равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, так как один из его множителей &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Хроматический многочлен нуль-графа ===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Нуль-граф''' (пустой граф, вполне несвязный граф; англ. ''null graph'', ''empty graph'', ''edgeless graph'') — регулярный граф степени &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, т.е. граф без рёбер.}}&lt;br /&gt;
&amp;lt;tex&amp;gt;P(O_{n},x)=x^{n}&amp;lt;/tex&amp;gt;, так как каждую из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин нулевого графа &amp;lt;tex&amp;gt;O_{n}&amp;lt;/tex&amp;gt; можно независимо окрасить в любой из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; цветов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Примечание:''' Нулевой граф &amp;lt;tex&amp;gt;O_{n}&amp;lt;/tex&amp;gt; также можно обозначать &amp;lt;tex&amp;gt;\overline{K_{n}}&amp;lt;/tex&amp;gt; (дополнительный граф для полного графа &amp;lt;tex&amp;gt;K_{n}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Хроматический многочлен простой цепи ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; — простая цепь, состоящая из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин. Рассмотрим процесс раскраски простой цепи: первую вершину можно покрасить в один из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; цветов, вторую и последующие в один из &amp;lt;tex&amp;gt;x - 1&amp;lt;/tex&amp;gt; цветов (т.е. так, чтобы цвет не совпадал с предыдущей вершиной). Тогда &amp;lt;tex&amp;gt;P(T_n, x) = x(x - 1) ^ {n - 1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Хроматический многочлен цикла ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
хроматический многочлен цикла&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C_n&amp;lt;/tex&amp;gt; — цикл длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Тогда хроматический многочлен цикла &amp;lt;tex&amp;gt;P(C_n, x) = (x - 1)^n + (-1)^n(x - 1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем по индукции по количеству вершин.&amp;lt;br&amp;gt;&lt;br /&gt;
'''База индукции''': рассмотрим случай &amp;lt;tex&amp;gt;n = 3&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;P(C_3, x) = x(x - 1)(x - 2) = (x^3 - 3x^2 + 3x - 1) - (x - 1) = (x - 1)^3 + (-1)^3(x - 1)&amp;lt;/tex&amp;gt;, что удовлетворяет формулировке теоремы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Индукционный переход''': пусть &amp;lt;tex&amp;gt;P(C_k, x) = (x - 1)^k + (-1)^k(x - 1)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Рассмотрим случай &amp;lt;tex&amp;gt;n = k + 1&amp;lt;/tex&amp;gt;. По теореме о [[#Рекуррентные_формулы_для_хроматических_многочленов|рекуррентной формуле для хроматических многочленов]]: &amp;lt;tex&amp;gt;P(C_{k + 1}, x ) = P(C_{k + 1} \setminus e, x) - P(C_{k + 1} / e, x)&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; — любое ребро &amp;lt;tex&amp;gt;C_{k + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
Заметим, что граф &amp;lt;tex&amp;gt;C_{k + 1} / e&amp;lt;/tex&amp;gt; изоморфен &amp;lt;tex&amp;gt;C_k&amp;lt;/tex&amp;gt;, а граф &amp;lt;tex&amp;gt;C_{k + 1} \setminus e&amp;lt;/tex&amp;gt; является [[#Хроматический_многочлен_простой_цепи|простой цепью]].&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;P(C_{k + 1}, x)=P(T_{k + 1}, x)-P(C_k, x)=x(x-1)^k-(x-1)^k-(-1)^k(x-1)=&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(x-1)^{k+1}+(-1)^{k+1}(x-1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Хроматический многочлен колеса ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;W_n&amp;lt;/tex&amp;gt; — [[Двойственный_граф_планарного_графа|колесо]] с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами. Выбрав и зафиксировав один из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; цветов на вершине, связнной со всеми остальными, имеем &amp;lt;tex&amp;gt; P(C_{n - 1}, x - 1) &amp;lt;/tex&amp;gt; вариантов раскраски оставшегося графа. Тогда хроматический многочлен колеса &amp;lt;tex&amp;gt;P_{W_n}(x) = x \cdot P_{C_{n - 1}}(x - 1) = x((x - 2)^{(n - 1)} - (-1)^{(n - 1)}(x - 2))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Хроматический многочлен дерева ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
хроматический многочлен дерева&lt;br /&gt;
|statement=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами является деревом тогда и только тогда, когда &amp;lt;tex&amp;gt;P(G,x)=x(x-1)^{n-1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Сначала покажем, что хроматический многочлен любого дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами есть &amp;lt;tex&amp;gt;x(x-1)^{n-1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Доказательство индукцией по числу &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Для &amp;lt;tex&amp;gt;n=1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n=2&amp;lt;/tex&amp;gt; результат очевиден. Предположим, что &amp;lt;tex&amp;gt;P(T',x)=x(x-1)^{n-2}&amp;lt;/tex&amp;gt; для любого дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; с количеством вершин равным &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; — ребро дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, такое что &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является висячей вершиной. Хроматический многочлен дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; без ребра &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;P(T/uv,x)=x(x-1)^{n-2}&amp;lt;/tex&amp;gt; по нашему предположению. Вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; можно окрасить &amp;lt;tex&amp;gt;x-1&amp;lt;/tex&amp;gt; способом, так как её цвет должен только лишь отличаться от цвета вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Итого: &amp;lt;tex&amp;gt;P(T,x)=(x-1)P(T/uv,x)=x(x-1)^{n-1}&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Обратно, пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — граф, у которого &amp;lt;tex&amp;gt;P(G,x)=x(x-1)^{n-1}&amp;lt;/tex&amp;gt;. Тогда верны два следующих утверждения:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; связен, потому что если было бы две компоненты связности (или больше), то &amp;lt;tex&amp;gt;P(G,x)&amp;lt;/tex&amp;gt; делился бы на &amp;lt;tex&amp;gt;x^2&amp;lt;/tex&amp;gt; без остатка.&amp;lt;br /&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;В графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; количество рёбер равно &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt;, так как по одной из теорем о коэффициентах хроматического многочлена ([[Хроматический многочлен#Коэффициенты хроматического многочлена|Коэффициенты хроматического многочлена]], теорема 4), количество рёбер в графе соответствует коэффициенту при &amp;lt;tex&amp;gt;x^{n-1}&amp;lt;/tex&amp;gt;, взятому со знаком минус. В нашем случае, этот коэффициент удобно искать, используя бином Ньютона:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;{P(G,x)=x(x-1)^{n-1}=x\left(x^{n-1}-{n-1 \choose 1}x^{n-2}+{n-1 \choose 2}x^{n-3}-...+(-1)^{n-1}\right)=x^{n}-(n-1)x^{n-1}+...+(-1)^{n-1}x}&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Из этих двух утверждений (связность и &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; ребро) следует, что граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; является деревом (см. [[Дерево, эквивалентные определения]], утверждения 1 и 3).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Коэффициенты хроматического многочлена ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
1&lt;br /&gt;
|statement=&lt;br /&gt;
Свободный член хроматического многочлена равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
По определению хроматического многочлена графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, его значение в точке &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; равно количеству способов раскрасить вершины &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; правильным образом в &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; цветов. Количество способов раскрасить граф в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; цветов равно &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;P(G,0)=0&amp;lt;/tex&amp;gt;. Из этого следует, что &amp;lt;tex&amp;gt;P(G,x)&amp;lt;/tex&amp;gt; кратен &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, следовательно его свободный член равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
2&lt;br /&gt;
|statement=&lt;br /&gt;
Старший коэффициент хроматического многочлена равен &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Воспользуемся рекуррентной формулой:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;P(G,x) = P(G_{1},x) + P(G_{2},x)&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;G_{1}&amp;lt;/tex&amp;gt; — граф, полученный из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; добавлением отсутствующего в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ребра &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;G_{2}&amp;lt;/tex&amp;gt; — граф, полученный из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; слиянием вершин &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в одну и удалением возникших при этом кратных ребер.&lt;br /&gt;
Применяя рекуррентную формулу повторно, хроматический полином можно представить в виде суммы хроматических полиномов полных графов, то есть:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;P(G,x) = {P(K_{n},x) + a_{1}P(K_{n-1},x) + a_{2}P(K_{n-2},x) + \ldots = x^{\underline{n}} + a_{1}x^{\underline{n-1}}+a_{2}x^{\underline{n-2}}+\ldots}&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Из этой формулы видно, что хроматический многочлен имеет старший коэффициент, равный  &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
3&lt;br /&gt;
|statement=&lt;br /&gt;
Коэффициенты хроматического многочлена составляют знакопеременную последовательность.&lt;br /&gt;
|proof=&lt;br /&gt;
Индукция по количеству вершин.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''База индукции:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Теорема верна для графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; из одной вершины, потому что &amp;lt;tex&amp;gt;P(G,x)=x&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Индукционный переход''' (&amp;lt;tex&amp;gt;n \to n+1)&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
Предположим, что теорема верна для всех графов на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинах. Рассмотрим графы на &amp;lt;tex&amp;gt;n+1&amp;lt;/tex&amp;gt; вершине.&lt;br /&gt;
Индукционный переход будем доказывать индукцией по количеству ребер графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; не содержит ребер, то есть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;O_{n+1}&amp;lt;/tex&amp;gt;, то его хроматический многочлен &amp;lt;tex&amp;gt;P(G,x)=x^{n+1}&amp;lt;/tex&amp;gt; обладает доказываемым свойством. Теперь предположим, что для всех &amp;lt;tex&amp;gt;(n+1,m)&amp;lt;/tex&amp;gt;-графов теорема верна. Возьмем &amp;lt;tex&amp;gt;(n+1,m+1)&amp;lt;/tex&amp;gt;-граф &amp;lt;tex&amp;gt;G_{1}&amp;lt;/tex&amp;gt; и его ребро &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt;. Обозначим за &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; граф, полученный из &amp;lt;tex&amp;gt;G_{1}&amp;lt;/tex&amp;gt; удалением ребра &amp;lt;tex&amp;gt;uv&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;G=G_{1}-uv&amp;lt;/tex&amp;gt;), а за &amp;lt;tex&amp;gt;G_{2}&amp;lt;/tex&amp;gt; — граф, полученный из &amp;lt;tex&amp;gt;G_{1}&amp;lt;/tex&amp;gt; слиянием вершин &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда из рекуррентной формулы следует:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;P(G_{1},x)=P(G,x)-P(G_{2},x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;(n+1,m)&amp;lt;/tex&amp;gt;-граф, а в &amp;lt;tex&amp;gt;G_{2}&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, то для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_{2}&amp;lt;/tex&amp;gt; теорема верна:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;{P(G,x)=x^{n+1}-a_{1}x^{n}+a_{2}x^{n-1}-a_{3}x^{n-2}+\ldots}&amp;lt;/tex&amp;gt; ,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;{P(G_{2},x)=x^{n}-b_{1}x^{n-1}+b_{2}x^{n-2}+\ldots}&amp;lt;/tex&amp;gt; ,&amp;lt;br/&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;a_{1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;a_{2}&amp;lt;/tex&amp;gt; … &amp;lt;tex&amp;gt;a_{n+1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b_{1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b_{2}&amp;lt;/tex&amp;gt; … &amp;lt;tex&amp;gt;b_{n}&amp;lt;/tex&amp;gt; — некоторые неотрицательные целые числа. Из этих равенств получаем:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;P(G_{1},x)=x^{n+1}-(a_{1}+1)x^{n}+(a_{2}+b_{1})x^{n-1}+\ldots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Видно, что в этом полученном полиноме коэффициенты составляют знакопеременную последовательность.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
4&lt;br /&gt;
|statement=&lt;br /&gt;
Второй коэффициент хроматического многочлена равен по модулю количеству ребер графа.&lt;br /&gt;
|proof=&lt;br /&gt;
Из доказательства '''Теоремы (3)''' видно, что при увеличении количества ребер графа на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, второй коэффициент также увеличивается на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Так как для пустого графа второй коэффициент равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, то утверждение верно для любого графа.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. - 368 с.: ил. - (Учебники для вузов. Специальная литература). ISBN 978-5-8114-1068-2&lt;br /&gt;
* Харари Ф. — Теория графов: Изд. 4-е. - М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. - 296 с. ISBN 978-5-397-00622-4&lt;br /&gt;
* [[wikipedia:en:Chromatic_polynomial| Wikipedia {{---}} Chromatic polynomial]]&lt;br /&gt;
* [[wikipedia:ru:Хроматическое_число#Хроматический_многочлен| Wikipedia {{---}} Хроматический многочлен]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Раскраски графов]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D1%81%D0%BE%D1%87%D0%BB%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=66543</id>
		<title>Использование обхода в глубину для поиска точек сочленения</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D1%81%D0%BE%D1%87%D0%BB%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=66543"/>
				<updated>2018-10-19T21:07:17Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Задача&lt;br /&gt;
|definition=Дан [[Отношение связности, компоненты связности|связный]] [[Основные определения теории графов|неориентированный граф]] &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;. Найти все [[Точка сочленения, эквивалентные определения|точки сочленения]] в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt; O(|V| + |E|).&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
Запустим [[Обход в глубину, цвета вершин|обход в глубину]] из произвольной вершины графа; обозначим её через &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt;. Заметим следующий факт:&lt;br /&gt;
&lt;br /&gt;
* Пусть мы находимся в обходе в глубину, просматривая сейчас все рёбра из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Тогда, если текущее ребро (&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&amp;lt;tex&amp;gt;to&amp;lt;/tex&amp;gt;) таково, что из вершины &amp;lt;tex&amp;gt;to&amp;lt;/tex&amp;gt; и из любого её потомка в дереве обхода в глубину нет обратного ребра в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; или какого-либо её предка, то это ребро является мостом. В противном случае оно мостом не является. (В самом деле, мы этим условием проверяем, нет ли другого пути из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;to&amp;lt;/tex&amp;gt;, кроме как спуск по ребру (&amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;,&amp;lt;tex&amp;gt;to&amp;lt;/tex&amp;gt;) дерева обхода в глубину.)&lt;br /&gt;
&lt;br /&gt;
Теперь осталось научиться проверять этот факт для каждой вершины эффективно. Для этого воспользуемся &amp;quot;временами входа в вершину&amp;quot;, вычисляемыми алгоритмом поиска в глубину.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Joint_point_2_rsz.png‎|280px|thumb|left| &amp;lt;font color=red&amp;gt;Красным&amp;lt;/font&amp;gt; цветом обозначены точки сочленения&amp;lt;br&amp;gt;&amp;lt;font color=blue&amp;gt;Синим&amp;lt;/font&amp;gt; — ребра по которым идет DFS]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;tin[u]&amp;lt;/tex&amp;gt; — время входа поиска в глубину в вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Через &amp;lt;tex&amp;gt;up[u]&amp;lt;/tex&amp;gt; обозначим минимум из времени захода в саму вершину &amp;lt;tex&amp;gt;tin[u]&amp;lt;/tex&amp;gt;, времен захода в каждую из вершин &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, являющуюся концом некоторого обратного ребра &amp;lt;tex&amp;gt;(u,p)&amp;lt;/tex&amp;gt;, а также из всех значений &amp;lt;tex&amp;gt;up[v]&amp;lt;/tex&amp;gt; для каждой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, являющейся непосредственным сыном &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в дереве поиска.&lt;br /&gt;
&lt;br /&gt;
Тогда из вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; или её потомка есть обратное ребро в её предка &amp;lt;tex&amp;gt;\Leftrightarrow \exists&amp;lt;/tex&amp;gt; такой сын &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;up[v] \geqslant tin[u]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если для текущей вершины &amp;lt;tex&amp;gt;u \ne root &amp;lt;/tex&amp;gt; существует непосредственный сын &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;up[v] \geqslant tin[u]&amp;lt;/tex&amp;gt;, то вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; является точкой сочленения, в противном случае она точкой сочленения не является.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
 &lt;br /&gt;
 '''function''' findCutPoints(G[n]: '''Graph'''):&amp;lt;font color=darkgreen&amp;gt; // функция принимает граф G с количеством вершин n и выполняет поиск точек сочленения во всем графе &amp;lt;/font&amp;gt;&lt;br /&gt;
     visited = array[n, ''false'']&lt;br /&gt;
                    &lt;br /&gt;
    '''function''' dfs(v: '''int''', p: '''int'''):&lt;br /&gt;
       time = time + 1&lt;br /&gt;
       up[v] = tin[v] = time &lt;br /&gt;
       visited[v] = ''true''&lt;br /&gt;
       count = 0             &lt;br /&gt;
       '''for''' u: (v, u) '''in''' G   &lt;br /&gt;
          '''if''' u == p&lt;br /&gt;
             '''continue'''&lt;br /&gt;
          '''if''' visited[u]&lt;br /&gt;
             up[v] = min(up[v], tin[u])&lt;br /&gt;
          '''else'''&lt;br /&gt;
             dfs(u, v) &lt;br /&gt;
             count = count + 1&lt;br /&gt;
             up[v] = min(up[v], up[u])&lt;br /&gt;
             '''if''' p != -1 '''and''' up[u] &amp;gt;= tin[v]&lt;br /&gt;
                  v — cutpoint &lt;br /&gt;
       '''if''' p == -1 '''and''' count &amp;gt;= 2&lt;br /&gt;
             v — cutpoint &lt;br /&gt;
                    	   &lt;br /&gt;
    '''for''' i = 1 '''to''' n             &lt;br /&gt;
       '''if''' '''not''' visited[i]              &lt;br /&gt;
          dfs(i, -1)&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; — дерево [[Обход в глубину, цвета вершин|обхода в глубину]], &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; — корень &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;. &lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt;u \ne root&amp;lt;/tex&amp;gt; — точка сочленения &amp;lt;tex&amp;gt;\Leftrightarrow \exists v \in T&amp;lt;/tex&amp;gt; — сын &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; : из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; или любого потомка вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; нет обратного ребра в предка вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. &lt;br /&gt;
* &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; — точка сочленения &amp;lt;tex&amp;gt;\Leftrightarrow root&amp;lt;/tex&amp;gt; имеет хотя бы двух сыновей в дереве поиска в глубину.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Joint_point_1.png|48px |thumb|‎ | Рисунок к &amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Удалим &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Докажем, что не существует пути из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в любого предка вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Пусть это не так. Тогда &amp;lt;tex&amp;gt;\exists x \in T&amp;lt;/tex&amp;gt; — предок &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;\exists&amp;lt;/tex&amp;gt; путь из &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G \backslash u&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; — предпоследняя вершина на этом пути, &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; — потомок &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(w, x)&amp;lt;/tex&amp;gt; — не ребро дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;(в силу единственности пути в дереве) &amp;lt;tex&amp;gt;\Rightarrow (w, x)&amp;lt;/tex&amp;gt; — обратное ребро, что противоречит условию.&lt;br /&gt;
#Пусть у &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; хотя бы два сына. Тогда при удалении &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; не существует пути между его поддеревьями, так как не существует перекрестных ребер &amp;lt;tex&amp;gt;\Rightarrow root&amp;lt;/tex&amp;gt; — точка сочленения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
#Докажем что из отрицания второго утверждения следует отрицание первого. Обозначим через &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; граф, состоящий из вершин, не являющихся потомками &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Удалим вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Очевидно, что граф &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; и все поддеревья вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; останутся связными, кроме того из каждого поддерева есть ребро в &amp;lt;tex&amp;gt;G' \Rightarrow G \backslash u&amp;lt;/tex&amp;gt; — связный &amp;lt;tex&amp;gt;\Rightarrow u&amp;lt;/tex&amp;gt; — не точка сочленения.&lt;br /&gt;
#Пусть &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; — точка сочленения и у него есть только один сын. Тогда при удалении &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; остается дерево с корнем в его сыне, содержащее все остальные вершины графа, то есть оставшийся граф связен — противоречие с тем, что &amp;lt;tex&amp;gt;root&amp;lt;/tex&amp;gt; — точка сочленения.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Асимптотика ===&lt;br /&gt;
Оценим время работы алгоритма. Процедура &amp;lt;tex&amp;gt;\mathrm{dfs}&amp;lt;/tex&amp;gt; вызывается от каждой вершины не более одного раза, а внутри процедуры рассматриваются все такие [[Основные определения теории графов|ребра]] &amp;lt;tex&amp;gt;\{e\ |\ \mathrm{begin(e)} = v\}&amp;lt;/tex&amp;gt;. Всего таких ребер для всех вершин в графе &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, следовательно, время работы алгоритма оценивается как &amp;lt;tex&amp;gt;O(V+E)&amp;lt;/tex&amp;gt;. Такое же, как у [[Обход в глубину, цвета вершин|обхода в глубину]].&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Использование обхода в глубину для поиска мостов]]&lt;br /&gt;
* [[Обход в глубину, цвета вершин]]&lt;br /&gt;
* [[Обход в ширину]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации==&lt;br /&gt;
* Асанов М., Баранский В., Расин В. — Дискретная математика: Графы, матроиды, алгоритмы — Лань, 2010. — 368 с. — ISBN 978-5-8114-1068-2&lt;br /&gt;
* [http://e-maxx.ru/algo/cutpoints MAXimal :: algo :: Поиск точек сочленения]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обход в глубину]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66169</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66169"/>
				<updated>2018-06-24T13:28:28Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Марковская цепь#Поглощающая цепь| Поглощающее состояние]] — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathtt{G} = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;\mathtt{G} = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=\left(\sum\limits_{k=1}^{n} \mathtt{G}[k][j]+1\right)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{i}]&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability}[\mathtt{i}]&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}]&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n], position: '''int'''[n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
 &lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66168</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66168"/>
				<updated>2018-06-24T13:15:33Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */  добавлена инициализация Q и R&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt;\mathtt{transition}:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' '''jump''' i '''in''' transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''float''' Q[n][n]&lt;br /&gt;
    '''float''' R[n][n]&lt;br /&gt;
    '''int''' position[n]&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' '''jump''' i '''in''' transition&lt;br /&gt;
       '''if''' absorbing[i.to]&lt;br /&gt;
          '''if''' !absorbing[i.from]&lt;br /&gt;
             R[position[i.from]][position[i.to]] = i.prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[i.from]][position[i.to]] = i.prob&lt;br /&gt;
 &lt;br /&gt;
    '''return''' Q&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66167</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66167"/>
				<updated>2018-06-24T12:58:25Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt;\mathtt{transition}:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' '''jump''' i '''in''' transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
 &lt;br /&gt;
    '''return''' Q&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66149</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66149"/>
				<updated>2018-06-23T21:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ косметические изменение&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt;\mathtt{transition}:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' '''jump''' i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
 &lt;br /&gt;
    '''return''' Q&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66148</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66148"/>
				<updated>2018-06-23T21:22:49Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: добавлена ссылка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Марковская цепь#Поглощающая цепь| Поглощающее состояние]] — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathtt{G} = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;\mathtt{G} = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=\left(\sum\limits_{k=1}^{n} \mathtt{G}[k][j]+1\right)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{i}]&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability}[\mathtt{i}]&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}]&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
 &lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66147</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66147"/>
				<updated>2018-06-23T21:00:12Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathtt{G} = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;\mathtt{G} = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=\left(\sum\limits_{k=1}^{n} \mathtt{G}[k][j]+1\right)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{i}]&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability}[\mathtt{i}]&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}]&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
 &lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66146</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66146"/>
				<updated>2018-06-23T20:59:21Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ косметические изменение&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathtt{G} = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;\mathtt{G} = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=\left(\sum\limits_{k=1}^{n} \mathtt{G}[k][j]+1\right)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{i}]&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability}[\mathtt{i}]&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}]&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66145</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66145"/>
				<updated>2018-06-23T20:55:15Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathtt{G} = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;\mathtt{G} = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=((\sum\limits_{k=1}^{n} \mathtt{G}[k][j]+1)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{i}]&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability}[\mathtt{i}]&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}]&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66144</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66144"/>
				<updated>2018-06-23T20:49:29Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Подсчет количества поглощащих состояний */ косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt;\mathtt{transition}:&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' '''jump''' i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
 &lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66143</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66143"/>
				<updated>2018-06-23T20:46:37Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' '''jump''' i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
 &lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66142</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66142"/>
				<updated>2018-06-23T20:45:42Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' jump i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
 &lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66141</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66141"/>
				<updated>2018-06-23T20:42:47Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
 &lt;br /&gt;
    '''for''' jump i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
 &lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
 &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
 &lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66140</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66140"/>
				<updated>2018-06-23T20:41:24Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}], где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
&lt;br /&gt;
    '''for''' jump i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
&lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66139</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66139"/>
				<updated>2018-06-23T20:39:51Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt; jump. &lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}], где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
&lt;br /&gt;
    '''for''' jump i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
&lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66138</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66138"/>
				<updated>2018-06-23T20:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения, введена структура jump, исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Для хранения переходов марковской цепи создадим структуру &amp;lt;tex&amp;gt; \mathtt{jump}&amp;lt;/tex&amp;gt; jump. &lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt; \mathtt{jump}[\mathtt{m}], где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.prob}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.from}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}]\mathtt{.to}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
&lt;br /&gt;
    '''for''' jump i: transition &lt;br /&gt;
       absorbing[i.from] = i.from == i.to '''and''' i.prob == 1&lt;br /&gt;
&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i].to]&lt;br /&gt;
          '''if''' !absorbing[transition[i].from]&lt;br /&gt;
             R[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i].from]][position[transition[i].to]] = transition[i].prob&lt;br /&gt;
&lt;br /&gt;
    '''return Q'''&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66135</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66135"/>
				<updated>2018-06-23T14:21:24Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ изменен тип transition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''float'''[m][3]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       absorbing[transition[i][0]] = transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix(absorbing: '''boolean'''[n]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66134</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66134"/>
				<updated>2018-06-23T14:20:28Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathtt{G} = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;\mathtt{G} = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=((\sum\limits_{k=1}^{n} G[k][j]+1)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{i}]&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability}[\mathtt{i}]&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}]&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66099</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66099"/>
				<updated>2018-06-19T22:15:35Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       absorbing[transition[i][0]] = transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix(absorbing: '''boolean'''[n]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66098</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66098"/>
				<updated>2018-06-19T22:07:07Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Построение матриц переходов */  косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       absorbing[transition[i][0]] = transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix(absorbing: '''boolean'''[]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66097</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66097"/>
				<updated>2018-06-19T22:06:06Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ косметические изменение&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=((\sum\limits_{k=1}^{n} G[k][j]+1)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: '''boolean'''[n], G: '''float'''[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66096</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66096"/>
				<updated>2018-06-19T22:00:42Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Подсчет количества поглощащих состояний */  исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       absorbing[transition[i][0]] = transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix(absorbing: boolean[]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66095</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66095"/>
				<updated>2018-06-19T21:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Подсчет количества поглощащих состояний */ упразднен if&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       absorbing[transition[i][0]] = transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix(absorbing: boolean[]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66094</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66094"/>
				<updated>2018-06-19T21:57:25Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
         absorbing[transition[i][0]] = ''true''&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix(absorbing: boolean[]):&lt;br /&gt;
    '''int''' count_q = 0&lt;br /&gt;
    '''int''' count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66093</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66093"/>
				<updated>2018-06-19T21:44:34Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ косметические&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=((\sum\limits_{k=1}^{n} G[k][j]+1)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: boolean[n], G: float[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66092</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66092"/>
				<updated>2018-06-19T21:40:10Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=((\sum\limits_{k=1}^{n} G[k][j]+1)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли i-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: boolean[n], G: float[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''float''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66091</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66091"/>
				<updated>2018-06-19T21:22:36Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Псевдокод */ исправлен псевдокод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}: boolean[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt; иначе &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = false&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[n] &lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
         absorbing[transition[i][0]] = ''true''&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix():&lt;br /&gt;
    count_q = 0&lt;br /&gt;
    count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66090</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66090"/>
				<updated>2018-06-19T21:12:09Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Подсчет количества поглощащих состояний */ изменен тип absorbing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}: boolean[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[m]&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
         absorbing[transition[i][0]] = ''true''&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix():&lt;br /&gt;
    count_q = 0&lt;br /&gt;
    count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66089</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66089"/>
				<updated>2018-06-19T21:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i}=((\sum\limits_{k=1}^{n} G[k][j]+1)/n&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли i-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: boolean[n], G: float[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''int''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66088</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66088"/>
				<updated>2018-06-19T20:57:23Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Убрано mathtt с констант&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][2]&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][0]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{i}][1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition}[\mathtt{j}][2] = 1&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}: boolean:[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing}[\mathtt{i}] = true&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''boolean[]''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[m]&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
         absorbing[transition[i][0]] = ''true''&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position}[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix():&lt;br /&gt;
    count_q = 0&lt;br /&gt;
    count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66087</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66087"/>
				<updated>2018-06-19T20:43:56Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;\mathtt{0}&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i=((\sum\limits_{k=1}^{n} G[k][j]+1)/n}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;\mathtt{1}&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;\mathtt{1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли i-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''float[]''' getAbsorbingProbability(absorbing: boolean[n], G: float[n][n]):&lt;br /&gt;
    '''float''' probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''int''' prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    '''return''' probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66036</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66036"/>
				<updated>2018-06-16T14:13:47Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Подсчет количества поглощащих состояний */ все переменные в mathtt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition[i][2]}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition[i][0]}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition[i][1]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition[j][2] = 1}&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}: boolean:[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt; — посглощающее состояние &amp;lt;tex&amp;gt;\mathtt{absorbing[i] = true}&amp;lt;/tex&amp;gt;&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''function''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[m]&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
         absorbing[transition[i][0]] = ''true''&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position[n]}&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix()&lt;br /&gt;
    count_q = 0&lt;br /&gt;
    count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66035</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66035"/>
				<updated>2018-06-16T14:08:10Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;\mathtt{0}&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i=((\sum\limits_{k=1}^{n} G[k][j]+1)/n}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;\mathtt{1}&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;\mathtt{1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли i-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''function''' getAbsorbingProbability(absorbing: boolean[n], G: float[n][n])&lt;br /&gt;
    float probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    return probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66034</id>
		<title>Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B0%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BE%D0%B2_%D0%BC%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B9_%D1%86%D0%B5%D0%BF%D0%B8&amp;diff=66034"/>
				<updated>2018-06-16T14:02:36Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Исправлены грамматические ошибки, добавлено см.также&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Подсчет количества поглощащих состояний==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\mathtt{transition}&amp;lt;/tex&amp;gt; — массив переходов марковской цепи, где &amp;lt;tex&amp;gt;\mathtt{transition[i][2]}&amp;lt;/tex&amp;gt; — вероятность перехода из состояния  &amp;lt;tex&amp;gt;\mathtt{transition[i][0]}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathtt{transition[i][1]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, по определению поглощающего состояния, если &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — поглощающее состояние, то &amp;lt;tex&amp;gt;\mathtt{transition[j][2] = 1}&amp;lt;/tex&amp;gt;. По этому признаку можно определить все поглощающие состояния в цепи.&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing}: boolean:[\mathtt{n}]&amp;lt;/tex&amp;gt; — массив состояний. Если i — посглощающее состояние absorbing[i] = true&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; — количество состояний&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{m}&amp;lt;/tex&amp;gt; — количество переходов&lt;br /&gt;
&lt;br /&gt;
 '''function''' findAbsorbings(transition: '''int'''[m][2]):&lt;br /&gt;
    '''boolean''' absorbing[m]&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1&lt;br /&gt;
         absorbing[transition[i][0]] = ''true''&lt;br /&gt;
    '''return''' absorbing&lt;br /&gt;
&lt;br /&gt;
==Построение матриц переходов==&lt;br /&gt;
Cоздадим сначала массив &amp;lt;tex&amp;gt;\mathtt{position}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ый элемент указывает под каким номером будет находиться &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{position[n]}&amp;lt;/tex&amp;gt; — массив нумерации состояний относительно существенной/несущественной матрицы.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{Q}&amp;lt;/tex&amp;gt; — матрица перехода мужду несущественными состояниями.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{R}&amp;lt;/tex&amp;gt; — матрица из несущественных состояний в поглощающие.&lt;br /&gt;
&lt;br /&gt;
 '''procedure''' buildTransitionMatrix()&lt;br /&gt;
    count_q = 0&lt;br /&gt;
    count_r = 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          position[i] = count_r&lt;br /&gt;
          count_r++&lt;br /&gt;
       '''else''' &lt;br /&gt;
          position[i] = count_q&lt;br /&gt;
          count_q++&lt;br /&gt;
    '''for''' i = 0 '''to''' m - 1&lt;br /&gt;
       '''if''' absorbing[transition[i][1]]&lt;br /&gt;
          '''if''' !absorbing[transition[i][0]]&lt;br /&gt;
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
       '''else'''&lt;br /&gt;
          Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
*[[Математическое ожидание времени поглощения]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia — Absorbing Markov chain]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66033</id>
		<title>Расчёт вероятности поглощения в состоянии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D1%87%D1%91%D1%82_%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%BE%D0%B3%D0%BB%D0%BE%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8&amp;diff=66033"/>
				<updated>2018-06-16T13:28:18Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: Поправлены: источники информации, см.также, дефисы, где нужно, заменены на тире&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Поглощающее(существенное) состояние цепи Маркова — состояние с вероятностью перехода в самого себя &amp;lt;tex&amp;gt;p_{ii}=1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Составим матрицу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, элементы которой &amp;lt;tex&amp;gt;g_{ij}&amp;lt;/tex&amp;gt; равны вероятности того, что, выйдя из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, попадём в поглощающее состояние &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt; G = N \cdot R &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; — фундаментальная матрица, и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — матрица перехода из несущественных состояний в существенные.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть этот переход будет осуществлён за &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; шагов:  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;amp;rarr;  &amp;lt;tex&amp;gt;i_{1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{2}&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;\ldots&amp;lt;/tex&amp;gt; &amp;amp;rarr; &amp;lt;tex&amp;gt;i_{r-1}&amp;lt;/tex&amp;gt; &amp;amp;rarr; j, где все &amp;lt;tex&amp;gt;i, i_{1}, \ldots i_{r-1}&amp;lt;/tex&amp;gt; являются несущественными.&lt;br /&gt;
Тогда рассмотрим сумму &amp;lt;tex&amp;gt;\sum\limits_{\forall(i_{1} \ldots i_{r-1})} {p_{i, i_{1}} \cdot p_{i_{1}, i_{2}} \cdot  \ldots  \cdot p_{i_{r-1}, j}} = Q^{r-1} \cdot R&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; — матрица переходов между несущественными состояниями, &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; — из несущественного в существенное. &lt;br /&gt;
Матрица &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется их суммированием по всем длинам пути из i в j: &amp;lt;tex&amp;gt;G = \sum\limits_{r = 1}^{\infty}{Q^{r-1} \cdot R} = (I + Q + Q^{2} + Q^{3} + \ldots) \cdot R = NR&amp;lt;/tex&amp;gt;, т.к. &amp;lt;tex&amp;gt;(I + Q + Q^2 + \ldots) \cdot (I - Q) = I - Q + Q - Q^{2} + \ldots = I&amp;lt;/tex&amp;gt;, а фундаментальная матрица марковской цепи &amp;lt;tex&amp;gt;N = (I - Q)^{-1}&amp;lt;/tex&amp;gt; }}&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Выведем ответ: в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ой строке вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии. Естественно, для несущественного состояния это &amp;lt;tex&amp;gt;\mathtt{0}&amp;lt;/tex&amp;gt;, в ином случае &amp;lt;tex&amp;gt;\mathtt{p_i=((\sum\limits_{k=1}^{n} G[k][j]+1)/n}&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;\mathtt{j}&amp;lt;/tex&amp;gt; — номер соответствующий &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ому состоянию в матрице &amp;lt;tex&amp;gt;\mathtt{G}&amp;lt;/tex&amp;gt; (т.е. под которым оно располагалось в матрице &amp;lt;tex&amp;gt; \mathtt{R} &amp;lt;/tex&amp;gt; т.е. значение &amp;lt;tex&amp;gt;\mathtt{position[i]}&amp;lt;/tex&amp;gt;). Прибавлять &amp;lt;tex&amp;gt;\mathtt{1}&amp;lt;/tex&amp;gt; нужно т.к. вероятность поглотиться в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом поглощающем состоянии, оказавшись изначально в нем же равна &amp;lt;tex&amp;gt;\mathtt{1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{probability[i]}&amp;lt;/tex&amp;gt; — вероятность поглощения в &amp;lt;tex&amp;gt;\mathtt{i}&amp;lt;/tex&amp;gt;-ом состоянии&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{absorbing[i]}&amp;lt;/tex&amp;gt; — является ли i-е состояние поглощающим&lt;br /&gt;
&lt;br /&gt;
 '''function''' getAbsorbingProbability(absorbing: boolean[n], G: float[n][n])&lt;br /&gt;
    float probability[n]&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       prob = 0&lt;br /&gt;
       '''if''' absorbing[i]&lt;br /&gt;
          '''for''' j = 0 '''to''' nonabs - 1&lt;br /&gt;
             prob += G[j][position[i]]&lt;br /&gt;
          prob++&lt;br /&gt;
          prob /= n&lt;br /&gt;
       probability[i] = prob&lt;br /&gt;
    return probability&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Марковская цепь]]&lt;br /&gt;
*[[Подсчет количества поглощающих состояний и построение матриц переходов марковской цепи]]&lt;br /&gt;
*[[Фундаментальная матрица]]&lt;br /&gt;
*[[Теорема о поглощении]]&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%28%D0%BC%D0%B0%D1%82%D0%B5%D0%BC.%29 Википедия — Цепи Маркова]&lt;br /&gt;
* [http://www.studmed.ru/kemeni-dzh-snell-dzh-konechnye-cepi-markova_eb290d9f6f2.html Кемени Дж. и Снелл Дж., &amp;quot;Конечные цепи Маркова&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Марковские цепи ]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=63024</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=63024"/>
				<updated>2017-12-25T22:43:33Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Разбиение на слагаемые */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;(i+1)&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                   &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += &amp;lt;tex&amp;gt;2^{n-i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  j = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Разбиение на слагаемые ==&lt;br /&gt;
Рассмотрим алгоритм получения номера, в лексикографическом порядке, по данному разбиению на слагаемые числа &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Нужно помнить о том, что разбиения, отличающиеся только порядком слагаемых, считаются одинаковыми. Из всех разбиений, получаемых перестановками слагаемых, выберем то, где слагаемые упорядочены лексикографически, и будем строить его.  &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfPart}&amp;lt;/tex&amp;gt; {{---}} искомый номер разбиения&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{last}&amp;lt;/tex&amp;gt; {{---}} последнее поставленное число в разбиении.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{sum}&amp;lt;/tex&amp;gt; {{---}} сумма, которую мы уже поставили.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{part[1 \ldots N]}&amp;lt;/tex&amp;gt; {{---}} данное разбиение&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество разбиений числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; на слагаемые, где каждое слагаемое &amp;lt;tex&amp;gt;\geqslant j&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Пересчитывать &amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; будем по возрастанию &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, а при равенстве &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} по убыванию &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разбиение числа, в котором каждое слагаемое &amp;lt;tex&amp;gt; \geqslant j&amp;lt;/tex&amp;gt; может либо содержать слагаемое &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; (таких разбиений &amp;lt;tex&amp;gt;\mathtt{d[i - j][j]}&amp;lt;/tex&amp;gt;), либо не содержать (таких разбиений &amp;lt;tex&amp;gt;\mathtt{d[i][j + 1]}&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Получаем рекуррентное соотношение для подсчёта &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;d[i][j] = &lt;br /&gt;
\left \{\begin{array}{ll} 1, &amp;amp; i = j, \\ 0, &amp;amp; i &amp;lt; j  \\ d[i][j + 1] + d[i - j][j], &amp;amp; i &amp;gt; j \end{array} \right. &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''int''' part2num(part: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   '''int''' numOfPart = 0, last = 0, sum = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' part.size&lt;br /&gt;
     '''for''' j = last '''to''' part[i] - 1            &amp;lt;font color=green&amp;gt;// перебираем все элементы, лексикографически меньшие нашего, но большие или равные предыдущего&amp;lt;/font&amp;gt;    &lt;br /&gt;
       numOfPart += d[N - sum - j][j]       &amp;lt;font color=green&amp;gt;// прибавляем количество перестановок, которые могли начинаться с &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     sum += part[i]                         &amp;lt;font color=green&amp;gt;// увеличиваем уже поставленную сумму&amp;lt;/font&amp;gt;&lt;br /&gt;
     last = part[i]                         &amp;lt;font color=green&amp;gt;// обновляем последний поставленный элемент &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' numOfPart                         &amp;lt;font color=green&amp;gt;// возвращаем ответ&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что количество итераций вложенного цикла не более, чем &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, так как всего количество возможных слагаемых {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, и ни какое из них цикл не обработает дважды, поскольку каждый раз начинает с &amp;lt;tex&amp;gt;last&amp;lt;/tex&amp;gt;, которое больше чем любое из обработанных чисел. Поэтому асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt; O (N)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(N^2)&amp;lt;/tex&amp;gt; на предподсчёт.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=63023</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=63023"/>
				<updated>2017-12-25T22:39:43Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Разбиение на слагаемые */ поправлен стиль псевдокода&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;(i+1)&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                   &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += &amp;lt;tex&amp;gt;2^{n-i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  j = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Разбиение на слагаемые ==&lt;br /&gt;
Рассмотрим алгоритм получения номера, в лексикографическом порядке, по данному разбиению на слагаемые числа &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Нужно помнить о том, что разбиения, отличающиеся только порядком слагаемых, считаются одинаковыми. Из всех разбиений, получаемых перестановками слагаемых, выберем то, где слагаемые упорядочены лексикографически, и будем строить его.  &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfPart}&amp;lt;/tex&amp;gt; {{---}} искомый номер разбиения&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{last}&amp;lt;/tex&amp;gt; {{---}} последнее поставленное число в разбиении.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{sum}&amp;lt;/tex&amp;gt; {{---}} сумма, которую мы уже поставили.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{part[1 \ldots N]}&amp;lt;/tex&amp;gt; {{---}} данное разбиение&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество разбиений числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; на слагаемые, где каждое слагаемое &amp;lt;tex&amp;gt;\geqslant j&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Пересчитывать &amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; будем по возрастанию &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, а при равенстве &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} по убыванию &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разбиение числа, в котором каждое слагаемое &amp;lt;tex&amp;gt; \geqslant j&amp;lt;/tex&amp;gt; может либо содержать слагаемое &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; (таких разбиений &amp;lt;tex&amp;gt;\mathtt{d[i - j][j]}&amp;lt;/tex&amp;gt;), либо не содержать (таких разбиений &amp;lt;tex&amp;gt;\mathtt{d[i][j + 1]}&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Получаем рекуррентное соотношение для подсчёта &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;d[i][j] = &lt;br /&gt;
\left \{\begin{array}{ll} 1, &amp;amp; i = j, \\ 0, &amp;amp; i &amp;lt; j  \\ d[i][j + 1] + d[i - j][j], &amp;amp; i &amp;gt; j \end{array} \right. &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''int''' part2num('''list&amp;lt;int&amp;gt;''' part):&lt;br /&gt;
   '''int''' numOfPart = 0, last = 0, sum = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' part.size&lt;br /&gt;
     '''for''' j = last '''to''' part[i] - 1            &amp;lt;font color=green&amp;gt;// перебираем все элементы, лексикографически меньшие нашего, но большие или равные предыдущего&amp;lt;/font&amp;gt;    &lt;br /&gt;
       numOfPart += d[N - sum - j][j]       &amp;lt;font color=green&amp;gt;// прибавляем количество перестановок, которые могли начинаться с &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     sum += part[i]                         &amp;lt;font color=green&amp;gt;// увеличиваем уже поставленную сумму&amp;lt;/font&amp;gt;&lt;br /&gt;
     last = part[i]                         &amp;lt;font color=green&amp;gt;// обновляем последний поставленный элемент &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' numOfPart                         &amp;lt;font color=green&amp;gt;// возвращаем ответ&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что количество итераций вложенного цикла не более, чем &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, так как всего количество возможных слагаемых {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, и ни какое из них цикл не обработает дважды, поскольку каждый раз начинает с &amp;lt;tex&amp;gt;last&amp;lt;/tex&amp;gt;, которое больше чем любое из обработанных чисел. Поэтому асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt; O (N)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(N^2)&amp;lt;/tex&amp;gt; на предподсчёт.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=63022</id>
		<title>Получение номера по объекту</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%83&amp;diff=63022"/>
				<updated>2017-12-25T22:30:15Z</updated>
		
		<summary type="html">&lt;p&gt;Arimon: /* Разбиение на слагаемые */ исправлена грамматика и косметические изменения&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
Номер данного [[Комбинаторные объекты|комбинаторного объекта]] равен количеству меньших в [[Лексикографический порядок|лексикографическом порядке]] комбинаторных объектов (нумерацию ведём с &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;). Все объекты меньшие данного можно разбить на непересекающиеся группы по длине совпадающего префикса. Тогда количество меньших объектов можно представить как сумму количеств объектов у которых префикс длины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; совпадает, а &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; элемент лексикографически меньше &amp;lt;tex&amp;gt;(i+1)&amp;lt;/tex&amp;gt;-го в данном объекте (&amp;lt;tex&amp;gt;i = 0..n-1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Следующий алгоритм вычисляет эту сумму:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfObject}&amp;lt;/tex&amp;gt; {{---}} искомый номер комбинаторного объекта,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный комбинаторный обьект, состоящий из числовых представлений лексикографически упорядоченных элементов множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество комбинаторных объектов с префиксом от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным данному и с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м элементом равным &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' object2num(a: '''list&amp;lt;A&amp;gt;'''):&lt;br /&gt;
   numOfObject = 0                          &lt;br /&gt;
   '''for''' i = 1 '''to''' n                   &amp;lt;font color=green&amp;gt;// перебираем элементы комбинаторного объекта&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' j = 1 '''to''' a[i] - 1          &amp;lt;font color=green&amp;gt;// перебираем элементы, в лексикографическом порядке меньшие рассматриваемого&amp;lt;/font&amp;gt;&lt;br /&gt;
       '''if''' элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; можно поставить на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-e место&lt;br /&gt;
         numOfObject += d[i][j]&lt;br /&gt;
   '''return''' numOfObject&lt;br /&gt;
Сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(nk) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество различных элементов, которые могут находиться в данном комбинаторном объекте. Например, для битового вектора &amp;lt;tex&amp;gt;k=2,&amp;lt;/tex&amp;gt; поскольку возможны только &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Количества комбинаторных объектов с заданными префиксами считаются известными, и их подсчет в сложности не учитывается. &lt;br /&gt;
Приведем примеры способов получения номеров некоторых из комбинаторных объектов по данному объекту.&lt;br /&gt;
&lt;br /&gt;
== Битовые вектора ==&lt;br /&gt;
Рассмотрим алгоритм получения номера &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в лексикографическом порядке данного битового вектора размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Всего существует &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; битовых векторов длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
На каждой позиции может стоять один из двух элементов независимо от того, какие элементы находятся в префиксе, поэтому поиск элементов меньше рассматриваемого можно упростить до проверки элемента на равенство &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;: &lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{bitvector[1..n]}&amp;lt;/tex&amp;gt; {{---}} данный вектор,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfBitvector}&amp;lt;/tex&amp;gt; {{---}} искомый номер вектора,&lt;br /&gt;
&lt;br /&gt;
 '''int''' bitvector2num(bitvector: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfBitvector = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                                        &lt;br /&gt;
     '''if''' bitvector[i] == 1  &lt;br /&gt;
       numOfBitvector += &amp;lt;tex&amp;gt;2^{n-i}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' numOfBitvector&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Перестановки ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке по данной перестановке размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{a[1..n]}&amp;lt;/tex&amp;gt; {{---}} данная перестановка,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{P[1..n]}&amp;lt;/tex&amp;gt; {{---}} количество перестановок данного размера,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{was[1..n]}&amp;lt;/tex&amp;gt; {{---}} использовали ли мы уже эту цифру в перестановке,&lt;br /&gt;
&lt;br /&gt;
 '''int''' permutation2num(a: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPermutation = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' n                        &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в перестановке&amp;lt;/font&amp;gt; &lt;br /&gt;
     '''for''' j = 1  '''to''' a[i] - 1              &amp;lt;font color=green&amp;gt;// перебираем элементы, лексикографически меньшие нашего, которые могут стоять на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м месте&amp;lt;/font&amp;gt;  &lt;br /&gt;
       '''if''' was[j] == ''false''                &amp;lt;font color=green&amp;gt;// если элемент &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; ранее не был использован&amp;lt;/font&amp;gt; &lt;br /&gt;
         numOfPermutation += P[n - i]    &amp;lt;font color=green&amp;gt;// все перестановки с префиксом длиной &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; равным нашему, и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент у которых&amp;lt;/font&amp;gt;   &lt;br /&gt;
                                            &amp;lt;font color=green&amp;gt;меньше нашего в лексикографическом порядке, идут раньше данной перестановки&amp;lt;/font&amp;gt;                &lt;br /&gt;
     was[a[i]] = ''true''                    &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й элемент использован&amp;lt;/font&amp;gt;            &lt;br /&gt;
   '''return''' numOfPermutation&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(n ^ 2) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Сочетания ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного сочетания из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Как известно, количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; обозначается как &amp;lt;tex dpi=140&amp;gt;\binom{n}{k}&amp;lt;/tex&amp;gt;. Тогда число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_1&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_1-1}_{i=1} {\binom{n-i}{k-1}}$$&amp;lt;/tex&amp;gt;; число сочетаний, в которых на позиции &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; стоит значение &amp;lt;tex&amp;gt;val_2&amp;lt;/tex&amp;gt;, равно &amp;lt;tex dpi=140&amp;gt;$$\sum\limits^{val_2-1}_{i=val_1+1} {\binom{n-i}{k-2}}$$&amp;lt;/tex&amp;gt;. Аналогично продолжаем по следующим позициям:&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfChoose}&amp;lt;/tex&amp;gt; {{---}} искомый номер сочетания,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{C[n][k]}&amp;lt;/tex&amp;gt; {{---}} количество сочетаний из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathtt{C[n][0] = 1}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{choose[1..K]}&amp;lt;/tex&amp;gt; {{---}} данное сочетание, состоящее из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; чисел от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, из технических соображений припишем ноль в начало сочетания: &amp;lt;tex&amp;gt;\mathtt{choose[0] = 0}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 '''int''' choose2num(choose: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfChoose = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' K                                       &lt;br /&gt;
     '''for'''  j = choose[i - 1] + 1 '''to''' choose[i] - 1&lt;br /&gt;
       numOfChoose += C[N - j][K - i]&lt;br /&gt;
   '''return''' numOfChoose&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(K \cdot N) &amp;lt;/tex&amp;gt; для предподсчёта.&lt;br /&gt;
&lt;br /&gt;
== Разбиение на слагаемые ==&lt;br /&gt;
Рассмотрим алгоритм получения номера в лексикографическом порядке данного разбиения на слагаемые числа &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Нужно помнить о том, что разбиения, отличающиеся только порядком слагаемых, считаются одинаковыми. Из всех разбиений, получаемых перестановками слагаемых, выберем то, где слагаемые упорядочены лексикографически, и будем строить его.  &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{numOfPart}&amp;lt;/tex&amp;gt; {{---}} искомый номер разбиения&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{last}&amp;lt;/tex&amp;gt; {{---}} последнее поставленное число в разбиении.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{sum}&amp;lt;/tex&amp;gt; {{---}} сумма, которую мы уже поставили.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{part[1 \ldots N]}&amp;lt;/tex&amp;gt; {{---}} данное разбиение&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; {{---}} количество разбиений числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; на слагаемые, где каждое слагаемое &amp;lt;tex&amp;gt;\geqslant j&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Пересчитывать &amp;lt;tex&amp;gt;\mathtt{d[i][j]}&amp;lt;/tex&amp;gt; будем по возрастанию &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, а при равенстве &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; {{---}} по убыванию &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Разбиение числа, в котором каждое слагаемое &amp;lt;tex&amp;gt; \geqslant j&amp;lt;/tex&amp;gt; может либо содержать слагаемое &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; (таких разбиений &amp;lt;tex&amp;gt;\mathtt{d[i - j][j]}&amp;lt;/tex&amp;gt;), либо не содержать (таких разбиений &amp;lt;tex&amp;gt;\mathtt{d[i][j + 1]}&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Получаем рекуррентное соотношение для подсчёта &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;145&amp;quot;&amp;gt;d[i][j] = &lt;br /&gt;
\left \{\begin{array}{ll} 1, &amp;amp; i = j, \\ 0, &amp;amp; i &amp;lt; j  \\ d[i][j + 1] + d[i - j][j], &amp;amp; i &amp;gt; j \end{array} \right. &lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 '''int''' part2num(part: '''list&amp;lt;int&amp;gt;'''):&lt;br /&gt;
   numOfPart = 0&lt;br /&gt;
   '''for''' i = 1 '''to''' part.size&lt;br /&gt;
     '''for''' j = last '''to''' part[i] - 1            &amp;lt;font color=green&amp;gt;// перебираем все элементы, лексикографически меньшие нашего, но большие или равные предыдущего&amp;lt;/font&amp;gt;    &lt;br /&gt;
       numOfPart += d[N - sum - j][j]       &amp;lt;font color=green&amp;gt;// прибавляем количество перестановок, которые могли начинаться с &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     sum += part[i]                         &amp;lt;font color=green&amp;gt;// увеличиваем уже поставленную сумму&amp;lt;/font&amp;gt;&lt;br /&gt;
     last = part[i]                         &amp;lt;font color=green&amp;gt;// обновляем последний поставленный элемент &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' numOfPart                         &amp;lt;font color=green&amp;gt;// возвращаем ответ&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что количество итераций вложенного цикла не более, чем &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, так как всего количество возможных слагаемых {{---}} &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, и ни какое из них цикл не обработает дважды, поскольку каждый раз начинает с &amp;lt;tex&amp;gt;last&amp;lt;/tex&amp;gt;, которое больше чем любое из обработанных чисел. Поэтому асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Асимптотика алгоритма {{---}} &amp;lt;tex&amp;gt; O (N)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(N^2)&amp;lt;/tex&amp;gt; на предподсчёт.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Получение объекта по номеру|Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта|Получение следующего объекта]]&lt;br /&gt;
*[[Правильные скобочные последовательности#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.BC.D0.B5.D1.80.D0.B0_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8|Получение номера правильной скобочной последовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*Программирование в алгоритмах / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. стр.31&lt;br /&gt;
*Дискретная математика. Теория и практика решения задач по информатике / С. М. Окулов. — М.: БИНОМ. Лаборатория знаний, 2008.&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>Arimon</name></author>	</entry>

	</feed>