<?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=System29a</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=System29a"/>
		<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/System29a"/>
		<updated>2026-06-11T17:51:51Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=27119</id>
		<title>Участник:System29a</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=27119"/>
				<updated>2012-06-27T12:35:09Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Артём Попов, 2538&lt;br /&gt;
&lt;br /&gt;
[[Участник:System29a/Вычисление погрешностей]]&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Крупина&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt;a\!\not\vdots\: b \Longrightarrow	\not\exists n \in \mathbb{Z}: a = b \cdot n&amp;lt;/tex&amp;gt; (поделить нельзя неделимое)&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%96%D0%BE%D1%80%D0%B4%D0%B0%D0%BD%D0%B0&amp;diff=27082</id>
		<title>Обсуждение:Теорема Жордана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%96%D0%BE%D1%80%D0%B4%D0%B0%D0%BD%D0%B0&amp;diff=27082"/>
				<updated>2012-06-26T17:07:38Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Правда ли, что &amp;lt;tex&amp;gt;\|f\|_c&amp;lt;/tex&amp;gt; {{---}} супремум? --[[Участник:Komarov|Андрей Комаров]] 21:41, 25 июня 2012 (GST)&lt;br /&gt;
: Правда --[[Участник:Komarov|Андрей Комаров]] 21:43, 25 июня 2012 (GST)&lt;br /&gt;
:: Спасибо! --[[Участник:Komarov|Андрей Комаров]] 21:43, 25 июня 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
В первом утверждении бред на бреде и бредом погоняет. В условии — суммы Фейера, а в доказательстве — частичные суммы. Рассматривается норма функции, не являющейся непрерывной, в пространстве непрерывных функций. Полиномом наилучшего приближения &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; C &amp;lt;/tex&amp;gt; является обычный полином, а не тригонометрический, соответственно, теорема Вейерштрасса для него неприменима. Переход от модуля к норме тоже какой-то мутный. Что делать будем? --[[Участник:Sementry|Мейнстер Д.]] 20:03, 26 июня 2012 (GST)&lt;br /&gt;
: \sigma (f) — ряд Фурье, а не суммы Фейера. И Виталя с Артемом говорят, что то, что мы берем норму || ||_C у функции не в C — это нормально.--[[Участник:Dgerasimov|Дмитрий Герасимов]] 20:40, 26 июня 2012 (GST)&lt;br /&gt;
&lt;br /&gt;
Ребят, мне кажется, или доказательство утверждения про равномерную сходимость ряда фурье нифига не расписано? --[[Участник:System29a|System29a]] 21:07, 26 июня 2012 (GST)&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%90%D1%85%D0%BE-%D0%9A%D0%BE%D1%80%D0%B0%D1%81%D0%B8%D0%BA&amp;diff=26418</id>
		<title>Алгоритм Ахо-Корасик</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%90%D1%85%D0%BE-%D0%9A%D0%BE%D1%80%D0%B0%D1%81%D0%B8%D0%BA&amp;diff=26418"/>
				<updated>2012-06-21T19:43:31Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задача алгоритма ==&lt;br /&gt;
Найти для каждого образца из заданного множества образцов (размером &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;) все его вхождения в текст за время &amp;lt;tex&amp;gt;O(m+n+a)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; {{---}} суммарная длина образцов, &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} длина текста, &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; {{---}} размер ответа (количество пар). В худшем случае &amp;lt;tex&amp;gt;a=nk&amp;lt;/tex&amp;gt;, но на практике он встречается редко.&lt;br /&gt;
&lt;br /&gt;
== Шаг 1 ==&lt;br /&gt;
Строим [[Бор|бор]] из образцов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Построение выполняется за время &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; {{---}} суммарная длина образцов.&lt;br /&gt;
&lt;br /&gt;
=== Пример построенного бора ===&lt;br /&gt;
Бор для набора образцов {he, she, his, hers}:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Aho-corasick1.jpg‎]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 2 ==&lt;br /&gt;
Превращаем бор в автомат.&amp;lt;br /&amp;gt;&lt;br /&gt;
Узлы бора становятся состояниями автомата; корень {{---}} начальное состояние.&amp;lt;br /&amp;gt;&lt;br /&gt;
Узлы бора, в которых заканчиваются образцы, становятся терминалами.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Для переходов по автомату заведём в узлах несколько функций:&amp;lt;br /&amp;gt;&lt;br /&gt;
1) &amp;lt;tex&amp;gt;parent(u)&amp;lt;/tex&amp;gt; {{---}} возвращает родителя вершины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
2) &amp;lt;tex&amp;gt;\pi(u) = \delta(\pi(parent(u)), c)&amp;lt;/tex&amp;gt; {{---}} суффиксная ссылка; здесь &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; {{---}} сын &amp;lt;tex&amp;gt;parent(u)&amp;lt;/tex&amp;gt; по символу &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
3) &amp;lt;tex&amp;gt;\delta(u, c) = &lt;br /&gt;
  \begin{cases}&lt;br /&gt;
     v\text{, if $v$ is son by symbol $c$ in trie;}\\&lt;br /&gt;
     \delta(\pi(u), c)\text{, else.}&lt;br /&gt;
   \end{cases}&amp;lt;/tex&amp;gt; {{---}} функция перехода.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Суффиксная ссылка &amp;lt;tex&amp;gt;\pi(u) = 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;, &amp;lt;tex&amp;gt;[v]\neq[u]&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;br /&amp;gt;&lt;br /&gt;
Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину.&lt;br /&gt;
=== Пример автомата Ахо-Корасик ===&lt;br /&gt;
[[Файл:Aho-corasick2.jpg]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Пунктиром обозначены суффиксные ссылки. Из вершин, для которых они не показаны, суффиксные ссылки идут в корень.&lt;br /&gt;
&lt;br /&gt;
== Шаг 3 ==&lt;br /&gt;
Построение сжатых суффиксных ссылок.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;up(u) = &lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \pi(u)\text{, if $\pi(u)$ is terminal;}\\&lt;br /&gt;
    \emptyset\text{, if $\pi(u)$ is root;}\\&lt;br /&gt;
    up(\pi(u))\text{, else.}&lt;br /&gt;
  \end{cases}&amp;lt;/tex&amp;gt; {{---}} сжатая суффиксная ссылка, т.е. ближайшее допускающее состояние (терминал) перехода по суффиксным ссылкам.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Сжатые суффиксные ссылки могут отыскиваться при помощи ленивой рекурсии.&lt;br /&gt;
&lt;br /&gt;
== Использование автомата ==&lt;br /&gt;
По очереди просматриваем символы текста. Для очередного символа &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; переходим из текущего состояния &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в состояние, которое вернёт функция &amp;lt;tex&amp;gt;\delta(u, c)&amp;lt;/tex&amp;gt;. Оказавшись в новом состоянии, отмечаем по сжатым суффиксным ссылкам образцы, которые нам встретились и их позицию (если требуется). Если новое состояние является терминалом, то соответствующие ему образцы тоже отмечаем.&amp;lt;br /&amp;gt;&lt;br /&gt;
''Примечание.'' Если требуется найти только первое вхождение образца в текст, то существенно ускорить работу алгоритма могут пометки о посещённости узла, т.е. если узел посещён, то не переходить по сжатым суффиксным ссылкам. Вместо хранения пометок можно просто сбрасывать сжатую суффиксную ссылку.&lt;br /&gt;
&lt;br /&gt;
== Пример реализации ==&lt;br /&gt;
Ниже представлена реализация на C++ некоторых функций (используется ленивая рекурсия).&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Структура вершины:'''&lt;br /&gt;
 struct Node {&lt;br /&gt;
     Node* son[SZ];        &amp;lt;font color=green&amp;gt;// массив сыновей; SZ - это размер алфавита&amp;lt;/font&amp;gt;&lt;br /&gt;
     Node* go[SZ];         &amp;lt;font color=green&amp;gt;// массив переходов (запоминаем переходы в ленивой рекурсии)&amp;lt;/font&amp;gt;&lt;br /&gt;
     Node* parent;         &amp;lt;font color=green&amp;gt;// вершина родитель&amp;lt;/font&amp;gt;&lt;br /&gt;
     Node* suffLink;       &amp;lt;font color=green&amp;gt;// суффиксная ссылка (вычисляем в ленивой рекурсии)&amp;lt;/font&amp;gt;&lt;br /&gt;
     Node* up;             &amp;lt;font color=green&amp;gt;// сжатая суффиксная ссылка&amp;lt;/font&amp;gt;&lt;br /&gt;
     char charToParent;    &amp;lt;font color=green&amp;gt;// символ, ведущий к родителю&amp;lt;/font&amp;gt;&lt;br /&gt;
     bool leaf;            &amp;lt;font color=green&amp;gt;// флаг, является ли вершина терминалом&amp;lt;/font&amp;gt;&lt;br /&gt;
     std::vector&amp;lt;int&amp;gt; leafPatternNumber;   &amp;lt;font color=green&amp;gt;// номера образцов, за которые отвечает терминал&amp;lt;/font&amp;gt;&lt;br /&gt;
 };&lt;br /&gt;
'''Функция, для вычисления суффиксной ссылки:'''&lt;br /&gt;
 Node* getSuffLink(Node* v) {&lt;br /&gt;
     if (!v-&amp;gt;suffLink) {   &amp;lt;font color=green&amp;gt;// если суффиксная ссылка ещё не вычислена&amp;lt;/font&amp;gt;&lt;br /&gt;
         if (v == root || v-&amp;gt;parent == root) {&lt;br /&gt;
             v-&amp;gt;suffLink = root;&lt;br /&gt;
         } else {&lt;br /&gt;
             v-&amp;gt;suffLink = getGo(getSuffLink(v-&amp;gt;parent), v-&amp;gt;charToParent);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return v-&amp;gt;suffLink;&lt;br /&gt;
 }&lt;br /&gt;
'''Функция, для вычисления перехода:'''&lt;br /&gt;
 Node* getGo(Node* v, char c) {&lt;br /&gt;
     if (!v-&amp;gt;go[c]) {      &amp;lt;font color=green&amp;gt;// если переход по символу c ещё не вычислен&amp;lt;/font&amp;gt;&lt;br /&gt;
         if (v-&amp;gt;son[c]) {&lt;br /&gt;
             v-&amp;gt;go[c] = v-&amp;gt;son[c];&lt;br /&gt;
         } else {&lt;br /&gt;
             v-&amp;gt;go[c] = (v == root) ? root : getGo(getSuffLink(v), c);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return v-&amp;gt;go[c];&lt;br /&gt;
 }&lt;br /&gt;
'''Функция, для вычисления сжатой суффиксной ссылки:'''&lt;br /&gt;
 Node* getUp(Node* v) {&lt;br /&gt;
     if (!v-&amp;gt;up) {         &amp;lt;font color=green&amp;gt;// если сжатая суффиксная ссылка ещё не вычислена&amp;lt;/font&amp;gt;&lt;br /&gt;
         if (getSuffLink(v)-&amp;gt;leaf) {&lt;br /&gt;
             v-&amp;gt;up = getSuffLink(v);&lt;br /&gt;
         } else if (getSuffLink(v) == root) {&lt;br /&gt;
             v-&amp;gt;up = 0;&lt;br /&gt;
         } else {&lt;br /&gt;
             v-&amp;gt;up = getUp(getSuffLink(v));&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return v-&amp;gt;up;&lt;br /&gt;
 }&lt;br /&gt;
'''Функция, для добавление образца в бор:'''&lt;br /&gt;
 void addString(std::string const&amp;amp; s, int patternNumber) {&lt;br /&gt;
     Node* cur = root;&lt;br /&gt;
     for (int i = 0; i &amp;lt; s.length(); ++i) {&lt;br /&gt;
         char c = s[i] - 'a';&lt;br /&gt;
         if (cur-&amp;gt;son[c] == 0) {&lt;br /&gt;
             cur-&amp;gt;son[c] = new Node;&lt;br /&gt;
             &amp;lt;font color=green&amp;gt;/* здесь также нужно обнулить указатели на переходы и сыновей */&amp;lt;/font&amp;gt;&lt;br /&gt;
             cur-&amp;gt;son[c]-&amp;gt;suffLink = 0;&lt;br /&gt;
             cur-&amp;gt;son[c]-&amp;gt;up = 0;&lt;br /&gt;
             cur-&amp;gt;son[c]-&amp;gt;parent = cur;&lt;br /&gt;
             cur-&amp;gt;son[c]-&amp;gt;charToParent = c;&lt;br /&gt;
             cur-&amp;gt;son[c]-&amp;gt;leaf = false;&lt;br /&gt;
         }&lt;br /&gt;
         cur = cur-&amp;gt;son[c];&lt;br /&gt;
     }&lt;br /&gt;
     cur-&amp;gt;leaf = true;&lt;br /&gt;
     cur-&amp;gt;leafPatternNumber.push_back(patternNumber);&lt;br /&gt;
 }&lt;br /&gt;
'''Функция, для процессинга текста (поиск, встречается образец или нет):'''&lt;br /&gt;
 void processText(std::string const&amp;amp; t, std::vector&amp;lt;bool&amp;gt;&amp;amp; found) {   &amp;lt;font color=green&amp;gt;// found - это вектор, длина которого равна количеству образцов&amp;lt;/font&amp;gt;&lt;br /&gt;
     found.assign(w, false);   &amp;lt;font color=green&amp;gt;// w - количество образцов&amp;lt;/font&amp;gt;&lt;br /&gt;
     Node* cur = root;&lt;br /&gt;
     for (int i = 0; i &amp;lt; t.length(); ++i) {&lt;br /&gt;
         char c = t[i] - 'a';&lt;br /&gt;
         cur = getGo(cur, c);&lt;br /&gt;
         for (int j = 0; j &amp;lt; cur-&amp;gt;leafPatternNumber.size(); ++j) {&lt;br /&gt;
             found[cur-&amp;gt;leafPatternNumber[j]] = true;&lt;br /&gt;
         }&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;/* В этом месте кода должен выполняться переход по '''сжатой''' суффиксной ссылке getUp(cur). Для вершины,&lt;br /&gt;
            обнаруженной по ней тоже ставим, что она найдена, затем повторяем для её сжатой суффиксной ссылки&lt;br /&gt;
            и так до корня. Хорошо ускорит программу сброс сжатых суффиксных ссылок для посещённых вершин. */&amp;lt;/font&amp;gt;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
Кроме этих функций требуется инициализация, но она имеет отношение только к кодированию, поэтому здесь приведена не будет.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* http://e-maxx.ru/algo/aho_corasick&lt;br /&gt;
* http://aho-corasick.narod.ru/&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]] &lt;br /&gt;
[[Категория: Поиск подстроки в строке]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%BE%D1%80&amp;diff=26415</id>
		<title>Бор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%BE%D1%80&amp;diff=26415"/>
				<updated>2012-06-21T19:24:58Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Сжатый бор */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Бор''' (trie, луч, нагруженное дерево) — структура данных для хранения набора строк, представляющая из себя подвешенное дерево с символами на ребрах. Строки получаются прохождением из корня по рёбрам, записывая соответствующие им символы, до терминальной вершины. Размер бора линейно&lt;br /&gt;
зависит от суммы длин всех строк, а поиск в бору занимает время, пропорциональное длине образца.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
Бор для набора образцов {he, she, his, hers}:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Файл:Aho-corasick1.jpg‎]]&lt;br /&gt;
&lt;br /&gt;
==Построение==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P = \{P_1,...,P_k\} &amp;lt;/tex&amp;gt; — набор строк, называемый словарем.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;n = \sum_{i=1}^k|P_i|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начинаем с дерева из одной вершины (корня); добавляем шаблоны &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; один за другим:&lt;br /&gt;
Следуем из корня по ребрам, отмеченным буквами из &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt;, пока возможно.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; заканчивается в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, сохраняем идентификатор &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;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;v&amp;lt;/tex&amp;gt; как терминальную.&lt;br /&gt;
&lt;br /&gt;
Если ребра, отмеченного очередной буквой &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; нет, то создаем новые ребра и вершины для всех оставшихся символов &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это занимает, очевидно, &amp;lt;tex&amp;gt;O (|P_1| + ... + |P_k|) = O (n)&amp;lt;/tex&amp;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;, пока возможно.&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; — слово из словаря.&lt;br /&gt;
Если в какой-то момент ребра, отмеченного нужным символом, не находится, то строки S в словаре нет.&lt;br /&gt;
Ясно, что это занимает &amp;lt;tex&amp;gt;O (|S|)&amp;lt;/tex&amp;gt; времени. Таким образом, бор — это эффективный способ хранить словарь и искать в нем слова.&lt;br /&gt;
&lt;br /&gt;
==Сжатый бор==&lt;br /&gt;
Сжатый бор — структура данных для хранения набора строк, отличающаяся от бора&lt;br /&gt;
следующим улучшением: если у некоторой вершины исходящая степень равна 1, то эту&lt;br /&gt;
вершину, ребро, входящее в нее, и ребро, исходящее из нее, можно объединить в одно&lt;br /&gt;
ребро с более чем одним символом.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]] &lt;br /&gt;
[[Категория: Поиск подстроки в строке]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26410</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26410"/>
				<updated>2012-06-21T19:15:03Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Описание решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&gt;
&amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; {{---}} время окончания работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в достижимом расписании &amp;lt;tex&amp;gt;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26409</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26409"/>
				<updated>2012-06-21T19:10:56Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Описание решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26408</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26408"/>
				<updated>2012-06-21T19:01:51Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Описание решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26407</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26407"/>
				<updated>2012-06-21T18:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Условие задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26406</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26406"/>
				<updated>2012-06-21T18:49:53Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26405</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26405"/>
				<updated>2012-06-21T18:48:39Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Условие задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26404</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26404"/>
				<updated>2012-06-21T18:47:37Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Условие задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;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_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=26403</id>
		<title>Дискретная математика, алгоритмы и структуры данных</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=26403"/>
				<updated>2012-06-21T18:46:31Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Теория расписаний */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
*[[Степень отношений]]&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;
*[[Отношение эквивалентности]]&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;
*[[Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно]]&lt;br /&gt;
*[[Специальные формы КНФ|Специальные формы КНФ: КНФ в форме Хорна и КНФ в форме Крома]]&lt;br /&gt;
*[[Преобразование Мёбиуса для получения коэффициентов полинома Жегалкина]]&lt;br /&gt;
*[[Представление функции класса DM с помощью медианы]]&lt;br /&gt;
*[[Пороговая функция]]&lt;br /&gt;
&lt;br /&gt;
== Схемы из функциональных элементов ==&lt;br /&gt;
*[[Реализация булевой функции схемой из функциональных элементов]]&lt;br /&gt;
*[[Cумматор]]&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;
*[[Представление вещественных чисел]]&lt;br /&gt;
*[[Представление символов, таблицы кодировок]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы сжатия ==&lt;br /&gt;
*[[Алгоритм Хаффмана]]&lt;br /&gt;
*[[Алгоритм LZW]]&lt;br /&gt;
*[[Алгоритмы LZ77 и LZ78]]&lt;br /&gt;
*[[Преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Обратное преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Преобразование MTF]]&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;
*[[Генерация комбинаторных объектов в лексикографическом порядке]]&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;
*[[Таблица инверсий]]&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;
*[[Кратчайший путь в ациклическом графе]]&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;
*[[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера]]&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;
*[[Дискретная случайная величина]]&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;
== Марковские цепи ==&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;
= Второй семестр =&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;
* [[Персистентный дек]]&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;
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]&lt;br /&gt;
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]&lt;br /&gt;
&lt;br /&gt;
== Поисковые структуры данных ==&lt;br /&gt;
* [[Упорядоченное множество]]&lt;br /&gt;
* [[Дерево поиска, наивная реализация]]&lt;br /&gt;
* [[АВЛ-дерево]]&lt;br /&gt;
* [[2-3 дерево]]&lt;br /&gt;
* [[B-дерево]]&lt;br /&gt;
* [[Красно-черное дерево]]&lt;br /&gt;
* [[Декартово дерево]]&lt;br /&gt;
* [[Декартово дерево по неявному ключу]]&lt;br /&gt;
* [[Splay-дерево]]&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;
* [[Реализация запроса в дереве отрезков снизу]]&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;
&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;
&lt;br /&gt;
== [[Сортировка]] ==&lt;br /&gt;
* [[Сортировка выбором]]&lt;br /&gt;
* [[Сортировка пузырьком]]&lt;br /&gt;
* [[Сортировка вставками]]&lt;br /&gt;
* [[Сортировка кучей]]&lt;br /&gt;
* [[Быстрая сортировка]]&lt;br /&gt;
* [[Сортировка слиянием]]&lt;br /&gt;
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]&lt;br /&gt;
* [[Теорема о нижней оценке для сортировки сравнениями]]&lt;br /&gt;
* [[Сортировка подсчетом]]&lt;br /&gt;
* [[Сортировка подсчетом сложных объектов]]&lt;br /&gt;
* [[Цифровая сортировка]]&lt;br /&gt;
* [[Карманная сортировка]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики за линейное время]]&lt;br /&gt;
&lt;br /&gt;
== Сортирующие сети ==&lt;br /&gt;
* [[Сортирующие сети]]&lt;br /&gt;
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]&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;
&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;
* [[Теорема о существовании простого цикла в случае существования цикла]]&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;
* [[Отношение реберной двусвязности]]&lt;br /&gt;
* [[Отношение вершинной двусвязности]]&lt;br /&gt;
* [[Граф компонент реберной двусвязности]]&lt;br /&gt;
* [[Граф блоков-точек сочленения]]&lt;br /&gt;
* [[Точка сочленения, эквивалентные определения]]&lt;br /&gt;
* [[Мост, эквивалентные определения]]&lt;br /&gt;
* [[k-связность]]&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;
* [[Коды Прюфера]]&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;
* [[Теорема Оре]]&lt;br /&gt;
* [[Турниры]]&lt;br /&gt;
* [[Теорема Редеи-Камиона]]&lt;br /&gt;
&lt;br /&gt;
== Укладки графов ==&lt;br /&gt;
* [[Укладка графа на плоскости]]&lt;br /&gt;
* [[Формула Эйлера]]&lt;br /&gt;
* [[Непланарность K5 и K3,3|Непланарность &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K_{3,3}&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 цвета]]&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;
== Обход в глубину ==&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;
* [[Построение компонент реберной двусвязности]]&lt;br /&gt;
&lt;br /&gt;
== Кратчайшие пути в графах ==&lt;br /&gt;
* [[Обход в ширину]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [[Алгоритм A*]]&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;
== Задача о паросочетании ==&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;
* [[Определение сети, потока]]&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;
* [[Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями]]&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;
* [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]&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;
* [[Слово Фибоначчи]]&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;
* [[Z-функция]]&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;
== Суффиксный массив ==&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;
* [[Метод двоичного подъема]]&lt;br /&gt;
* [[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
* [[Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четырех русских)&lt;br /&gt;
* [[Алгоритм Шибера-Вишкина]]&lt;br /&gt;
* [[Сведение задачи RMQ к задаче LCA]]&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;
* [[Теорема о циклах]]&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;
* [[Лемма о единственном паросочетании в подграфе замен, индуцированном кратчайшим путем]]&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;
* [[Методы решения задач теории расписаний]]&lt;br /&gt;
* [[Правило Лаулера]]&lt;br /&gt;
* [[Flow shop]]&lt;br /&gt;
* [[1precpmtnrifmax|&amp;lt;tex&amp;gt;1 \mid prec, pmtn, r_i \mid f_{\max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[QpmtnCmax|&amp;lt;tex&amp;gt;Q \mid pmtn \mid C_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[QpmtnriLmax|&amp;lt;tex&amp;gt;Q \mid pmtn, r_{i} \mid L_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[P2precpi1Lmax|&amp;lt;tex&amp;gt;P2 \mid prec, p_i = 1 \mid L_{\max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[R2Cmax|&amp;lt;tex&amp;gt;R2 \mid \mid C_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[O2Cmax|&amp;lt;tex&amp;gt;O2 \mid \mid C_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[PpmtnriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[Opi1sumu|&amp;lt;tex&amp;gt;O \mid p_{ij} = 1 \mid \sum u_i&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[Fpij1sumwu|&amp;lt;tex&amp;gt;F \mid p_{ij} = 1 \mid \sum w_i u_i&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[1ripi1sumwc|&amp;lt;tex&amp;gt;1 \mid r_{i}, p_i=1\mid \sum w_{i}c_{i}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[1ridipi1|&amp;lt;tex&amp;gt;1 \mid r_{i}, d_{i}, p_{i} = 1 \mid -&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[1outtreesumwc | &amp;lt;tex&amp;gt;1 \mid outtree \mid \sum w_i c_i&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[1pi1sumwu|&amp;lt;tex&amp;gt;1 \mid p_{i} = 1 \mid \sum w_{i}U_{i}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[QSumCi|&amp;lt;tex&amp;gt;Q\mid\mid\sum{C_i}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[J2pij1Lmax| &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26402</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26402"/>
				<updated>2012-06-21T18:44:37Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&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;n_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26401</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26401"/>
				<updated>2012-06-21T18:39:36Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&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;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как A и B. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа может характеризоваться двумя значениями: количество операций &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26398</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26398"/>
				<updated>2012-06-21T18:20:08Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как A и B. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,..n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа может характеризоваться двумя значениями: количество операций &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,...,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max{C_i - d_i | i = 1, ..., n}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
  * Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
  * Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
  * Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответсвующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 main()&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\\\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z\\\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 schedule(O_{ij})&lt;br /&gt;
   if \mu_{ij} = A then do&lt;br /&gt;
     if T1 &amp;lt; LAST(i) then do&lt;br /&gt;
       t := LAST(i)&lt;br /&gt;
       A(t) := O_{ij}&lt;br /&gt;
     else&lt;br /&gt;
       t := T1;&lt;br /&gt;
       A(t) := O_{ij};&lt;br /&gt;
       while A(T_1) \ne \emptyset do &lt;br /&gt;
         T1 := T1 + 1;&lt;br /&gt;
   else&lt;br /&gt;
     if T2 &amp;lt; LAST(i) then do&lt;br /&gt;
       t := LAST(i)&lt;br /&gt;
       B(t) := O_{ij}&lt;br /&gt;
     else&lt;br /&gt;
       t := T2;&lt;br /&gt;
       A(t) := O_{ij};&lt;br /&gt;
       while B(T_2) \ne \emptyset do &lt;br /&gt;
         T2 := T2 + 1;&lt;br /&gt;
   LAST(i) := t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26397</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26397"/>
				<updated>2012-06-21T18:16:02Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как A и B. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,..n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа может характеризоваться двумя значениями: количество операций &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,...,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max{C_i - d_i | i = 1, ..., n}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
  * Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
  * Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
  * Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответсвующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 main()&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\{O_{ij}}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z\{i}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 schedule(O_{ij})&lt;br /&gt;
   if \mu_{ij} = A then do&lt;br /&gt;
     if T1 &amp;lt; LAST(i) then do&lt;br /&gt;
       t := LAST(i)&lt;br /&gt;
       A(t) := O_{ij}&lt;br /&gt;
     else&lt;br /&gt;
       t := T1;&lt;br /&gt;
       A(t) := O_{ij};&lt;br /&gt;
       while A(T_1) \ne \emptyset do &lt;br /&gt;
         T1 := T1 + 1;&lt;br /&gt;
   else&lt;br /&gt;
     if T2 &amp;lt; LAST(i) then do&lt;br /&gt;
       t := LAST(i)&lt;br /&gt;
       B(t) := O_{ij}&lt;br /&gt;
     else&lt;br /&gt;
       t := T2;&lt;br /&gt;
       A(t) := O_{ij};&lt;br /&gt;
       while B(T_2) \ne \emptyset do &lt;br /&gt;
         T2 := T2 + 1;&lt;br /&gt;
   LAST(i) := t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26395</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26395"/>
				<updated>2012-06-21T18:05:23Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как A и B. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,..n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа может характеризоваться двумя значениями: количество операций &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,...,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; \emptyset&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max{C_i - d_i | i = 1, ..., n}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
  * Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
  * Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
  * Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответсвующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 main()&lt;br /&gt;
   for k: -r + 1 to r - 1 do&lt;br /&gt;
     L(k) = \emptyset;&lt;br /&gt;
 		Z := (empty);&lt;br /&gt;
 	for i:= 1 to n do&lt;br /&gt;
 		if d_i &amp;lt; r then&lt;br /&gt;
 			for j := 1 to n_i do&lt;br /&gt;
 				добавить O_{ij} в L(d_i - n_i + j)&lt;br /&gt;
 		else&lt;br /&gt;
 			добавить работу i в Z&lt;br /&gt;
 	for i := 1 to n do&lt;br /&gt;
 		LAST(i) := 0;&lt;br /&gt;
 	T1 := 0;&lt;br /&gt;
 	T2 := 0;&lt;br /&gt;
 	for k := -r + 1 to r - 1 do&lt;br /&gt;
 		while L(k) \ne \emptyset do&lt;br /&gt;
 			Выбрать задание O_{ij} из L(k)&lt;br /&gt;
 			L(k) := L(k)\{O_{ij}};&lt;br /&gt;
 			schedule(O_{ij}) &lt;br /&gt;
 	while z \ne \emptyset do&lt;br /&gt;
 		Выбрать работу i из Z&lt;br /&gt;
 			Z := Z\{i};&lt;br /&gt;
 			for j := 1 to n_i&lt;br /&gt;
 				schedule(O_{ij}) 	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 schedule(O_{ij})&lt;br /&gt;
 	if \mu_{ij} = A then do&lt;br /&gt;
 		if T1 &amp;lt; LAST(i) then do&lt;br /&gt;
 			t := LAST(i)&lt;br /&gt;
 			A(t) := O_{ij}&lt;br /&gt;
 		else&lt;br /&gt;
 			t := T1;&lt;br /&gt;
 			A(t) := O_{ij};&lt;br /&gt;
 			while A(T_1) \ne \emptyset do &lt;br /&gt;
 				T1 := T1 + 1;&lt;br /&gt;
 	else&lt;br /&gt;
 		if T2 &amp;lt; LAST(i) then do&lt;br /&gt;
 			t := LAST(i)&lt;br /&gt;
 			B(t) := O_{ij}&lt;br /&gt;
 		else&lt;br /&gt;
 			t := T2;&lt;br /&gt;
 			A(t) := O_{ij};&lt;br /&gt;
 			while B(T_2) \ne \emptyset do &lt;br /&gt;
 				T2 := T2 + 1;&lt;br /&gt;
 	LAST(i) := t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26386</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26386"/>
				<updated>2012-06-21T17:48:10Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как A и B. &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа состоит из &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij} (j = 1,..n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt;операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая работа может характеризоваться двумя значениями: количество операций &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt; и машина, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \Sum(i=1..n) N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два массива &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,...,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_ij&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt; (пусто)&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. Будем называть &amp;lt;tex&amp;gt;(пусто)&amp;lt;/tex&amp;gt; пустой операцией. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&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;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = max{t + 1 | A(t)&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;max{C_i - d_i | i = 1, ..., n}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
  * Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
  * Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
  * Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,...,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующую корзину &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру корзины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одной корзины могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответсвующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
main()&lt;br /&gt;
	for k:= -r + 1 to r - 1 do&lt;br /&gt;
		L(k) := (empty);&lt;br /&gt;
		Z := (empty);&lt;br /&gt;
	for i:= 1 to n do&lt;br /&gt;
		if d_i &amp;lt; r then&lt;br /&gt;
			for j := 1 to n_i do&lt;br /&gt;
				добавить O_{ij} в L(d_i - n_i + j)&lt;br /&gt;
		else&lt;br /&gt;
			добавить работу i в Z&lt;br /&gt;
	for i := 1 to n do&lt;br /&gt;
		LAST(i) := 0;&lt;br /&gt;
	T1 := 0;&lt;br /&gt;
	T2 := 0;&lt;br /&gt;
	for k := -r + 1 to r - 1 do&lt;br /&gt;
		while L(k) \ne (empty) do&lt;br /&gt;
			Выбрать задание O_{ij} из L(k)&lt;br /&gt;
			L(k) := L(k)\{O_{ij}};&lt;br /&gt;
			schedule(O_{ij}) &lt;br /&gt;
	while z \ne (empty) do&lt;br /&gt;
		Выбрать работу i из Z&lt;br /&gt;
			Z := Z\{i};&lt;br /&gt;
			for j := 1 to n_i&lt;br /&gt;
				schedule(O_{ij}) 	&lt;br /&gt;
&lt;br /&gt;
schedule(O_{ij})&lt;br /&gt;
	if \mu_{ij} = A then do&lt;br /&gt;
		if T1 &amp;lt; LAST(i) then do&lt;br /&gt;
			t := LAST(i)&lt;br /&gt;
			A(t) := O_{ij}&lt;br /&gt;
		else&lt;br /&gt;
			t := T1;&lt;br /&gt;
			A(t) := O_{ij};&lt;br /&gt;
			while A(T_1) \ne (empty) do &lt;br /&gt;
				T1 := T1 + 1;&lt;br /&gt;
	else&lt;br /&gt;
		if T2 &amp;lt; LAST(i) then do&lt;br /&gt;
			t := LAST(i)&lt;br /&gt;
			B(t) := O_{ij}&lt;br /&gt;
		else&lt;br /&gt;
			t := T2;&lt;br /&gt;
			A(t) := O_{ij};&lt;br /&gt;
			while B(T_2) \ne (empty) do &lt;br /&gt;
				T2 := T2 + 1;&lt;br /&gt;
	LAST(i) := t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=24182</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=24182"/>
				<updated>2012-06-06T17:08:08Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
Дано n работ i = 1,...,n и две машины, обозначенные как A и B. i-тая работа состоит из n_i операций O_{ij} (j = 1,..n_i), которые должны быть выполнены последовательно и, при этом, если O_{ij} операция была совершена на машине A (B), то операция O_{i,j-1} должна быть совершена на машине B (A). Таким образом, i-тая работа может характеризоваться двумя значениями: количество операций n_i и машина, на которой была совершена первая операция. Пусть r = \Sum(i=1..n) N_i {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за t_{max}. К примеру, мы можем выбрать t_{max} = r. Тогда расписание можно представить как два массива A(t) и B(t) (t = 0,...,t_{max}), где A(t) = O_ij, если операция O_ij должна выполниться на машине A в момент времени t и A(t) = (пусто), если машина A простаивает в этот момент. Будем называть (пусто) пустой операцией. И для каждой операции O_ij, выполняющейся на машине A существует t, для которого A(t) = O_ij. Аналогично для B_i. Расписание достижимо тогда и только тогда, когда из A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i следует O_{i,j-1} = B(s) (A(s)) для некоторого s &amp;lt; t, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка L осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим L, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим L расписанием.  &lt;br /&gt;
С_i {{---}} время окончания работы i в достижимом расписании y = (A(t), B(t)) можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
C_i = max{t + 1 | A(t) или B(t) {{---}} операция i-той работы}&lt;br /&gt;
&lt;br /&gt;
Задача заключается в том, что для данного каждой работе i дедлайна d_i \ge 0 мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
max{C_i - d_i | i = 1, ..., n} &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
  * Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
  * Создадим список всех операций L, упорядоченный в порядке неубывания значений l(O_{ij}) &lt;br /&gt;
  * Найдем соответствующее списку L расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=24151</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=24151"/>
				<updated>2012-06-06T16:22:14Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: Новая страница: «{{в разработке}} Дано n работ i = 1,...,n и две машины, обозначенные как A и B. i-тая работа состоит...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в разработке}}&lt;br /&gt;
Дано n работ i = 1,...,n и две машины, обозначенные как A и B. i-тая работа состоит из n_i операций O_{ij} (j = 1,..n_i), которые должны быть выполнены последовательно и, при этом, если O_{ij} операция была совершена на машине A (B), то операция O_{i,j-1} должна быть совершена на машине B (A). Таким образом, i-тая работа может характеризоваться двумя значениями: количество операций n_i и машина, на которой была совершена первая операция. Пусть r = \Sum(i=1..n) N_i {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за t_{max}. К примеру, мы можем выбрать t_{max} = r. Тогда расписание можно представить как два массива A(t) и B(t) (t = 0,...,t_{max}), где A(t) = O_ij, если операция O_ij должна выполниться на машине A в момент времени t и A(t) = (пусто), если машина A простаивает в этот момент. Будем называть (пусто) пустой операцией. И для каждой операции O_ij, выполняющейся на машине A существует t, для которого A(t) = O_ij. Аналогично для B_i. Расписание достижимо тогда и только тогда, когда из A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i следует O_{i,j-1} = B(s) (A(s)) для некоторого s &amp;lt; t, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка L осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим L, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим L расписанием.  &lt;br /&gt;
С_i {{---}} время окончания работы i в достижимом расписании y = (A(t), B(t)) можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
C_i = max{t + 1 | A(t) или B(t) {{---}} операция i-той работы}&lt;br /&gt;
&lt;br /&gt;
Задача заключается в том, что для данного каждой работе i дедлайна d_i \ge 0 мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
max{C_i - d_i | i = 1, ..., n} &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B3%D1%80%D0%B5%D1%88%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=17870</id>
		<title>Участник:System29a/Вычисление погрешностей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B3%D1%80%D0%B5%D1%88%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=17870"/>
				<updated>2012-01-27T05:37:51Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
19 слайд презенташки — тут даны определения операций с соответствующими погрешностями, которые собственно делает компьютер . &amp;lt;tex&amp;gt;\delta&amp;lt;/tex&amp;gt; — погрешность конкретной операции, она различная для каждой операции, но мы её можем оценить как &amp;lt;tex&amp;gt;|\delta| \le \epsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Смотрим следующее утверждение. Тут задается операция векторного произведения для трех точек, как она рассчитывается в компьютере. Мы же хотим оценить эталонные вычисления (операции будут не в кружочках). &lt;br /&gt;
&lt;br /&gt;
Для начала выделим достаточное условие. Мы утверждаем, что если &amp;lt;tex&amp;gt;|\tilde v - v| \le |\tilde v|&amp;lt;/tex&amp;gt;, то этого достаточно для того, чтобы у &amp;lt;tex&amp;gt;\tilde v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; был одинаковый знак. Проверяется это непосредственно, эта штука должна быть эквивалентна тому утверждению, что одномерный шар радиуса &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; с центром в точке &amp;lt;tex&amp;gt;\tilde v&amp;lt;/tex&amp;gt; не пересекался с нулём. Нарисуйте картинку и всё осознаете. {{TODO| t = запилите рисунок, где есть 0, ось X, и на ней описанный шар!}}&lt;br /&gt;
&lt;br /&gt;
Окей, у нас есть подобное условие.&lt;br /&gt;
теперь раскроем &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; по нашим определениям. Следующим шагом будет раскрытие знаков в кружочке (смотрите 23 слайд).&lt;br /&gt;
&lt;br /&gt;
Следующий переход (на том же 23 слайде) скорей всего вам не понятен. Поясню, выражение &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; перегруппировали таким образом, чтобы с помощью правил &amp;lt;tex&amp;gt;|a - b| \le |a| + |b| &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|a*b| = |a|*|b| &amp;lt;/tex&amp;gt; мы смогли оценить сверху &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; именно таким образом, каким он там оценён.&lt;br /&gt;
&lt;br /&gt;
Заметим, что выражение, обозванное в презенташке как &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, вычисляется в операциях не компьютерных, а абсолютных. Это плохо, мы не умеем вычислять абсолютно :) Следующий шаг — оцениваем это выражение сверху в модели floating-point(кружочки!). Собственно, там куча промежуточных вычислений, которые я не могу пока привести. И в итоге (смотрите презентацию!) мы получим оценку погрешности вычисления нашей штуки.&lt;br /&gt;
&lt;br /&gt;
{{TODO| t=пилить эту штуку до удобоваримого состояния.}}&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B3%D1%80%D0%B5%D1%88%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=17869</id>
		<title>Участник:System29a/Вычисление погрешностей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B3%D1%80%D0%B5%D1%88%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=17869"/>
				<updated>2012-01-27T05:36:47Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: Новая страница: «Короче, смотрите, всё не так сложно как кажется.  Первый и главный совет — почитайте презен...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
19 слайд презенташки — тут даны определения операций с соответствующими погрешностями, которые собственно делает компьютер . &amp;lt;tex&amp;gt;\delta&amp;lt;/tex&amp;gt; — погрешность конкретной операции, она различная для каждой операции, но мы её можем оценить как &amp;lt;tex&amp;gt;|\delta| \le \epsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Смотрим следующее утверждение. Тут задается операция векторного произведения для трех точек, как она рассчитывается в компьютере. Мы же хотим оценить эталонные вычисления (операции будут не в кружочках). &lt;br /&gt;
&lt;br /&gt;
Для начала выделим достаточное условие. Мы утверждаем, что если &amp;lt;tex&amp;gt;|\tilde v - v| \le |\tilde v|&amp;lt;/tex&amp;gt;, то этого достаточно для того, чтобы у &amp;lt;tex&amp;gt;\tilde v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; был одинаковый знак. Проверяется это непосредственно, эта штука должна быть эквивалентна тому утверждению, что одномерный шар радиуса &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; с центром в точке &amp;lt;tex&amp;gt;\tilde v&amp;lt;/tex&amp;gt; не пересекался с нулём. Нарисуйте картинку и всё осознаете. {{TODO| t = запилите рисунок, где есть 0, ось X, и на ней описанный шар!}}&lt;br /&gt;
&lt;br /&gt;
Окей, у нас есть подобное условие.&lt;br /&gt;
теперь раскроем &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; по нашим определениям. Следующим шагом будет раскрытие знаков в кружочке (смотрите 23 слайд).&lt;br /&gt;
&lt;br /&gt;
Следующий переход (на том же 23 слайде) скорей всего вам не понятен. Поясню, выражение &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; перегруппировали таким образом, чтобы с помощью правил &amp;lt;tex&amp;gt;|a - b| \le |a| + |b| &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|a*b| = |a|*|b| &amp;lt;/tex&amp;gt; мы смогли оценить сверху &amp;lt;tex&amp;gt;|\tilde v - v|&amp;lt;/tex&amp;gt; именно таким образом, каким он там оценён.&lt;br /&gt;
&lt;br /&gt;
Заметим, что выражение, обозванное в презенташке как &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, вычисляется в операциях не компьютерных, а абсолютных. Это плохо, мы не умеем вычислять абсолютно :) Следующий шаг — оцениваем это выражение сверху в модели floating-point(кружочки!). Собственно, там куча промежуточных вычислений, которые я не могу пока привести. И в итоге (смотрите презентацию!) мы получим оценку погрешности вычисления нашей штуки.&lt;br /&gt;
&lt;br /&gt;
{{ODO| t=пилить эту штуку до удобоваримого состояния.}}&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=17867</id>
		<title>Участник:System29a</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=17867"/>
				<updated>2012-01-27T02:39:48Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Артём Попов, 2538&lt;br /&gt;
&lt;br /&gt;
[[Участник:System29a/Вычисление погрешностей]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=17866</id>
		<title>Участник:System29a</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=17866"/>
				<updated>2012-01-27T02:33:58Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Артём Попов, 2538&lt;br /&gt;
[[Вычисление погрешностей]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B5%D0%BD%D1%82%D0%BB%D0%B8-%D0%9E%D1%82%D1%82%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=17380</id>
		<title>Алгоритм Бентли-Оттмана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B5%D0%BD%D1%82%D0%BB%D0%B8-%D0%9E%D1%82%D1%82%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=17380"/>
				<updated>2012-01-20T00:17:53Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: тире&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Алгоритм Бентли-Оттмана(англ. Bentley-Ottmann) — алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются, при этом для каждой точки алгоритм выдает множество отрезков, пересекающихся в ней.&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
[[Файл:pic1.jpg|right|560|thumb|Пример результата работы алгоритма]]&lt;br /&gt;
На плоскости лежит &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; отрезков, каждый из них задан координатами своих концов. Требуется по этим данным определить множество точек, в которых эти отрезки пересекаются. Однако, не всегда координаты точки можно абсолютно точно представить с помощью вещественных типов данных. Поэтому характеризовать каждую точку будем множеством отрезков, которые пересекаются в этой точке.&lt;br /&gt;
&lt;br /&gt;
Для упрощения понимания введем два ограничения на входные данные:&lt;br /&gt;
* не существует вертикальных отрезков&lt;br /&gt;
* не существует пары отрезков, имеющих более одной общей точки&lt;br /&gt;
* никакие три отрезка не пересекаются в одной точке&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;
* отрезок закончился&lt;br /&gt;
&lt;br /&gt;
Сканирующая прямая будет расположена параллельно оси ординат, и двигаться вдоль оси абсцисс в сторону ее положительного направления. Учитывая введенные ограничения на входные данные, прямая никогда не будет проходить через два события одновременно.&lt;br /&gt;
&lt;br /&gt;
===Статус===&lt;br /&gt;
[[Файл:pic2.jpg|right|560|thumb|Иллюстрация определения статуса]]&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;
[[Файл:anim1.gif|right|560|thumb|Пример работы алгоритма]]&lt;br /&gt;
Изначально у нас есть только события вида &amp;quot;начался отрезок&amp;quot; и &amp;quot;закончился отрезок&amp;quot;. События вида &amp;quot;пересекаются два отрезка&amp;quot; будут добавляться нами в множество еще не обработанных событий. Соответственно, алгоритм выглядит так: выбираем то событие из множества необработанных, у которого наименьшая координата &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, обрабатываем, делаем так, пока множество необработанных событий непустое. Плюс, на протяжении всего алгоритма должен поддерживаться следующий инвариант: в множество необработанных событий уже добавлены все пересечения отрезков, которые в текущем статусе текущие.&lt;br /&gt;
&lt;br /&gt;
===Обработка событий===&lt;br /&gt;
====Событие &amp;quot;начало отрезка&amp;quot;====&lt;br /&gt;
Находим в статусе два отрезка,  между которыми будет находится тот, который начинается. После этого добавляем его в статус на это место и точки его пересечения с соседними добавляем в множество необработанных событий.&lt;br /&gt;
&lt;br /&gt;
====Событие &amp;quot;конец отрезка&amp;quot;====&lt;br /&gt;
Находим в статусе отрезок, который заканчивается. Удаляем его оттуда, после чего в множество необработанных событий добавляем точку, в которой пересекаются отрезки, которые были соседями заканчивающегося в старом статусе. Это необходимо, потому что в новом статусе они станут соседними. Заметим, что добавляемое событие может уже находиться в множестве, но нас это совершенно не напрягает.&lt;br /&gt;
&lt;br /&gt;
====Событие &amp;quot;пересечение отрезков&amp;quot;====&lt;br /&gt;
Находим в статусе два отрезка, которые пересекаются. Меняем их местами (это действительно происходит). После этого добавляем в множество пересечения двух новых пар соседей, которые появились после перестановки пересекшихся отрезков.&lt;br /&gt;
&lt;br /&gt;
==Обработка &amp;quot;нехороших случаев&amp;quot;==&lt;br /&gt;
===Сканирующая точка===&lt;br /&gt;
Решим, для начала, вопрос с вертикальными отрезками. Важно, что заодно пропадет и проблема с обработкой событий, имеющих одинаковую координату по оси &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:anim2.gif|right|560|thumb|Сканирующая точка]]&lt;br /&gt;
Слегка поменяем нашу концепцию. Сканирующая прямая теперь становится не совсем прямой. Теперь у нас появляется, скорее, сканирующая точка. Суть изменения в следующем: в случае, если несколько событий попадают на одну вертикальную прямую, мы их обрабатываем в порядке возрастания координаты по оси &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;. Внимательный читатель сейчас, наверное, воскликнет: &amp;quot;А как же тогда наш статус? Ведь отрезки не могут пересекать точку!&amp;quot;. Однако и это не является проблемой. Если отрезок, который лежит в статусе, не вертикален, то он сортируется по своей координате &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt;, в которой он пересекается с вертикальной прямой, проведенной через нашу точку (да, это бывшая сканирующая прямая). А вот если отрезок вертикален, то его параметром является как раз ордината &amp;quot;сканирующей точки&amp;quot;. &amp;lt;s&amp;gt;Если внимательно подумать, то все будет корректно.&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Несколько отрезков в одной точке===&lt;br /&gt;
====Первый метод решения проблемы====&lt;br /&gt;
У нас есть упорядоченное множество необработанных событий. Давайте перед добавлением события будем проверять, а нет ли его там. Если оно там уже есть, то события вида &amp;quot;в этой точке перечекаются отрезки &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;&amp;quot;, превратится в событие вида &amp;quot;в этой точке пересекаются отрезки &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;&amp;quot;. В процессе обработки этой точки порядок следования в статусе всех отрезков, пересекающихся в ней, просто инвертируется. Соответственно, проблема решилась.&lt;br /&gt;
&lt;br /&gt;
====Второй метод решения проблемы====&lt;br /&gt;
На самом деле, посмотрим более внимательно, что произойдет в этой точке. Все пересечения всех пар обработаются. Всего таких пар &amp;lt;tex&amp;gt;k^2&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;s&amp;gt;Такие дела.&amp;lt;/s&amp;gt; Здесь тоже должна быть соответствующая анимашка.&lt;br /&gt;
&lt;br /&gt;
===СНМ вместо отрезков===&lt;br /&gt;
'''Внимание! Этот раздел должен интересовать только &amp;lt;s&amp;gt;задротов&amp;lt;/s&amp;gt; любознательных, так как он описывает разбор случая, который нам, по обещанию Ковалева, не встретится.'''&lt;br /&gt;
Нам остался последний сложный случай: наложение двух или более отрезков друг для друга. Давайте теперь вместо просто отрезков будем класть в СНМ следующее: множество отрезков, которые на данном этапе накладываются друг на друга. Понятно, что при добавлении нового отрезка он или создает свое множество, или добавляется в уже существующее. При удалении удаляется из множества, если оно осталось пустым — удаляется и само множество. А при пересечении с другим множеством попарно пересекаются все отрезки из двух множеств. При этом важно, что все отрезки, накладывающиеся друг на друга, должны занимать в статусе одну ячейку, т. е. являться одним множеством.&lt;br /&gt;
&lt;br /&gt;
==Реализация алгоритма==&lt;br /&gt;
===Двоичное дерево поиска в качестве статуса===&lt;br /&gt;
Из определения статуса ясно, какую структуру удобно использовать в качестве статуса: двоичное дерево поиска. В нем удобно делать все необходимые операции, и выполняться они будут за &amp;lt;tex&amp;gt;O(log_2(n))&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;
Заметим, что мы не умеем получать абсолютно точные координаты пересечения двух отрезков. Однако, мы умеем представлять эти координаты в качестве суммы произведений нескольких чисел (просто пересечение прямых и раскрытие скобок в верхней части дроби). А сами координаты нам и не требуются, нам необходимо только уметь сравнивать эти координаты друг с другом. Сравнивать же эти суммы произведений с другими такими же суммами и с обычными числами (в обобщенном представлении тоже такими же суммами) мы тоже умеем. Победа!&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=16840</id>
		<title>Формула Уитни</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=16840"/>
				<updated>2012-01-16T19:59:53Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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, m)&amp;lt;/tex&amp;gt; - граф. Тогда коэффициент при &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;1\le i\le n&amp;lt;/tex&amp;gt; в хроматическом многочлене &amp;lt;tex&amp;gt;P(G, x)&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;\sum \limits_{j=0}^{m}{(-1)^jN(i, j)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; - число остовных подграфов графа &amp;lt;tex&amp;gt;G&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; рёбер, т.е. &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{i=1}^{n}{(\sum \limits_{j=0}^{m}{(-1)^jN(i, j))x^i}}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;br&amp;gt;Пусть &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; — некоторый набор из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; красок. Отображение &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;VG&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;K&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;G&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Возьмём некоторую собственную или несобственную раскраску графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Удалим из графа каждое ребро, концы которого раскрашены в разный цвет. Получим остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, в котором каждое ребро соединяет вершины одинакового цвета. Исходную собственную или несобственную раскраску будем называть ''строго несобственной'' раскраской остовного подграфа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;. Каждой компоненте связности графа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; соответствует точно один цвет - цвет её вершин. Если остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; компонент связности, то есть &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt; различных строго несобственных раскрасок, отвечающих остовному подграфу &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.&amp;lt;br&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;br&amp;gt;Пусть &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; — число остовных подграфов графа &amp;lt;tex&amp;gt;G&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; рёбер.&amp;lt;br&amp;gt;&lt;br /&gt;
Из общего числа &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt; собственных и не собственных раскрасок вычтем число строго несобственных раскрасок остовных подграфов, имеющих ровно одно ребро. Если мы вычтем сумму &amp;lt;tex&amp;gt; \sum \limits_{i}{N(i, 1)x^i} &amp;lt;/tex&amp;gt;, то мы вычтем помимо указанного числа ещё и строго несобственные раскраски остовного подграфа, содержащего ровно два ребра. Более того, это число мы вычтем дважды. Подобным образом, число строго несобственных раскрасок остовных подграфов, содержащих точно три, четыре и более ребер будет вычтено соответствующее число раз.&amp;lt;br/&amp;gt;&lt;br /&gt;
Попытаемся скомпенсировать двукратное вычитание добавлением &amp;lt;tex&amp;gt;\sum \limits_{i}{N(i, 2)x^i}&amp;lt;/tex&amp;gt;, однако при этом добавится излишек строго несобственных раскрасок для остовных подграфов с тремя, четырьмя и более ребрами. &amp;lt;br/&amp;gt;&lt;br /&gt;
Подобную конструкцию можно рассчитать по [[Формула включения-исключения|формуле включения-исключения]].   &lt;br /&gt;
Воспользуемся формулой и получим число собственных раскрасок графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Оно равно &amp;lt;tex&amp;gt;x^n - \sum \limits_{i}{N(i, 1)x^i} + \sum \limits_{i}{N(i, 2)x^i} - \sum \limits_{i}{N(i, 3)x^i} + ...&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Так как &amp;lt;tex&amp;gt;N(n, 0) = 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{j=0}^{m}{\sum \limits_{i=1}^{n}{(-1)^jN(i, j)x^i}} = \sum \limits_{i=1}^{n}{\sum \limits_{j=0}^{m}{(-1)^jN(i, j)x^i}}&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;/div&gt;</summary>
		<author><name>System29a</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=16809</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=16809"/>
				<updated>2012-01-16T19:01:48Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Рекуррентные формулы для хроматических многочленов */&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; называется '''хроматическим многочленом'''. Обозначают &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;
&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;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&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;
{{Теорема&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;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;.&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; и &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;&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;. Тогда верны два следующих утверждения:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Граф &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;&lt;br /&gt;
2. В графе &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;&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;
Граф &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;, то есть у которого вершины &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;
|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;
|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;
== Литература ==&lt;br /&gt;
1. Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. - 368 с.: ил. - (Учебники для вузов. Специальная литература). '''ISBN 978-5-8114-1068-2'''&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Харари Ф. - Теория графов: Изд. 4-е. - М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. - 296 с. '''ISBN 978-5-397-00622-4'''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Раскраски графов]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=16127</id>
		<title>Обсуждение:Формула Уитни</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=16127"/>
				<updated>2012-01-11T02:28:03Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: Новая страница: «Я не совсем понимаю, как тут можно написать про принцип включения-исключения иначе. С одно...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Я не совсем понимаю, как тут можно написать про принцип включения-исключения иначе. С одной одной строкой как было — не совсем понятно откуда взялось. А сейчас, как в Асанове. Зато всё понятно. Чем это плохо?&amp;lt;br&amp;gt;&lt;br /&gt;
--[[Участник:System29a|System29a]] 05:28, 11 января 2012 (MSK)&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=16126</id>
		<title>Формула Уитни</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=16126"/>
				<updated>2012-01-11T02:24:42Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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, m)&amp;lt;/tex&amp;gt; - граф. Тогда коэффициент при &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;1\le i\le n&amp;lt;/tex&amp;gt; в хроматическом многочлене &amp;lt;tex&amp;gt;P(G, x)&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;\sum \limits_{j=0}^{m}{(-1)^jN(i, j)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; - число остовных подграфов графа &amp;lt;tex&amp;gt;G&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; рёбер, т.е. &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{i=1}^{n}{(\sum \limits_{j=0}^{m}{(-1)^jN(i, j))x^i}}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;br&amp;gt;Пусть &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; — некоторый набор из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; красок. Отображение &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;VG&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;K&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;G&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Возьмём некоторую собственную или несобственную раскраску графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Удалим из графа каждое ребро, концы которого раскрашены в разный цвет. Получим остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, в котором каждое ребро соединяет вершины одинакового цвета. Исходную собственную или несобственную раскраску будем называть ''строго несобственной'' раскраской остовного подграфа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;. Каждой компоненте связности графа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; соответствует точно один цвет - цвет её вершин. Если остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; компонент связности, то есть &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt; различных строго несобственных раскрасок, отвечающих остовному подграфу &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.&amp;lt;br&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;br&amp;gt;Пусть &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; — число остовных подграфов графа &amp;lt;tex&amp;gt;G&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; рёбер.&amp;lt;br&amp;gt;&lt;br /&gt;
Из общего числа &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt; собственных и не собственных раскрасок вычтем число строго несобственных раскрасок остовных подграфов, имеющих ровно одно ребро. Если мы вычтем сумму &amp;lt;tex&amp;gt; \sum \limits_{i}{N(i, 1)x^i} &amp;lt;/tex&amp;gt;, то мы вычтем помимо указанного числа ещё и избыточную величину. Действительно, допустим &amp;lt;tex&amp;gt;e_1 = u_1v_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2 = u_2v_2&amp;lt;/tex&amp;gt; — два различных ребра графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда в число строго несобственных раскрасок остовного подграфа, содержащего точно одно ребро &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt;, попадут и те, у которых вершины &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;, а это в свою очередь строго несобственные раскраски остовного подграфа, содержащего ровно два ребра &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. При этом их число мы вычтем дважды — для &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. Аналогично, число строго несобственных раскрасок остовных подграфов, содержащих точно три, четыре и более ребер будет вычтено соответствующее число раз.&amp;lt;br/&amp;gt;&lt;br /&gt;
Добавим сумму &amp;lt;tex&amp;gt;\sum \limits_{i}{N(i, 2)x^i}&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;x^n - \sum \limits_{i}{N(i, 1)x^i} + \sum \limits_{i}{N(i, 2)x^i} - \sum \limits_{i}{N(i, 3)x^i} + ...&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Так как &amp;lt;tex&amp;gt;N(n, 0) = 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{j=0}^{m}{\sum \limits_{i=1}^{n}{(-1)^jN(i, j)x^i}} = \sum \limits_{i=1}^{n}{\sum \limits_{j=0}^{m}{(-1)^jN(i, j)x^i}}&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;/div&gt;</summary>
		<author><name>System29a</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=16124</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=16124"/>
				<updated>2012-01-11T01:58:52Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: Перенёс определение в текст доказательства&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; называется '''хроматическим многочленом'''. Обозначают &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;
&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;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&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;
{{Теорема&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;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;.&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; и &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;&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;. Тогда верны два следующих утверждения:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Граф &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;&lt;br /&gt;
2. В графе &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;&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;
|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/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;, то есть у которого вершины &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;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;
|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;
== Литература ==&lt;br /&gt;
1. Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. - 368 с.: ил. - (Учебники для вузов. Специальная литература). '''ISBN 978-5-8114-1068-2'''&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Харари Ф. - Теория графов: Изд. 4-е. - М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. - 296 с. '''ISBN 978-5-397-00622-4'''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Раскраски графов]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%BF%D0%BE_%D0%BC%D0%B5%D1%80%D0%B5&amp;diff=16034</id>
		<title>Сходимость по мере</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%BF%D0%BE_%D0%BC%D0%B5%D1%80%D0%B5&amp;diff=16034"/>
				<updated>2012-01-09T22:14:55Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
[[Предельный переход в классе измеримых функций|&amp;lt;&amp;lt;]][[Классические теоремы теории измеримых функций|&amp;gt;&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Пусть функции &amp;lt;tex&amp;gt;f_n, f&amp;lt;/tex&amp;gt; {{---}} измеримы на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;, множества &amp;lt;tex&amp;gt;E(|f_n - f| \geq \delta)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\delta &amp;gt; 0&amp;lt;/tex&amp;gt;, измеримы.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;f_n&amp;lt;/tex&amp;gt; стремятся по мере на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;f_n\stackrel{[E]}{\Rightarrow} f&amp;lt;/tex&amp;gt;), если &amp;lt;tex&amp;gt;\forall\delta&amp;gt;0 : \mu E(|f_n - f| \geq \delta) \xrightarrow[n\to\infty]{} 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В определённом смысле, это наиболее слабый вид сходимости, что подтверждает следующая классическая теорема Лебега.&lt;br /&gt;
{{TODO| t=запилить единственность}}&lt;br /&gt;
&lt;br /&gt;
==Теорема Лебега==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Лебег&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mu E&amp;lt;+\infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;f_n\to f&amp;lt;/tex&amp;gt; почти всюду на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;f_n\stackrel{E}{\Rightarrow} f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Как мы выяснили ранее, удобно рассматривать &amp;lt;tex&amp;gt;E'=\bigcup\limits_{p=1}^\infty \bigcap\limits_{m=1}^\infty \bigcup\limits_{n=m}^\infty E(|f_n - f| \geq \frac1p)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
по условию теоремы, &amp;lt;tex&amp;gt;\mu E' = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;B_m = \bigcup\limits_{n=m}^\infty E(|f_n - f| \geq \frac1p) \supset B_{m+1}&amp;lt;/tex&amp;gt;, тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\forall p: B = \bigcap\limits_{m=1}^\infty B_m &amp;lt;/tex&amp;gt;, очевидно, содержится в &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;,&lt;br /&gt;
поэтому, по полноте меры, &amp;lt;tex&amp;gt;\mu B = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
По монотонности меры, &amp;lt;tex&amp;gt;\mu B_i&amp;lt;/tex&amp;gt; {{---}} убывающая числовая последовательность. Она ограничена, значит, у неё есть предел. &lt;br /&gt;
&lt;br /&gt;
Покажем, что он равен нулю. Или, более общий факт: &amp;lt;tex&amp;gt;\mu B_m \to \mu B = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся тем, что &amp;lt;tex&amp;gt;\mu E&amp;lt;/tex&amp;gt; {{---}} конечен.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;B = \bigcap\limits_{m=1}^\infty B_m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&amp;lt;tex&amp;gt;\overline B = \bigcup\limits_{m=1}^\infty \overline B_m&amp;lt;/tex&amp;gt; (здесь под &amp;lt;tex&amp;gt; \overline X &amp;lt;/tex&amp;gt; имеется в виду дополнение &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;B_m&amp;lt;/tex&amp;gt; {{---}} убывающая (&amp;lt;tex&amp;gt;B_m \supset B_{m+1}&amp;lt;/tex&amp;gt;), значит, дополнения растут: &amp;lt;tex&amp;gt;\overline B_m \subset \overline B_{m+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\overline B = \overline B_1 \cup (\overline B_2 \setminus \overline B_1) \cup (\overline B_3 \setminus \overline B_2) \cup \ldots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\overline B \subset E&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;\mu \overline B \leq \mu E &amp;lt; +\infty&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;-аддитивности, &amp;lt;tex&amp;gt;\mu\overline B = \mu\overline B_1 + \mu(\overline B_2 \setminus\overline B_1) + \mu(\overline B_3 \setminus \overline B_2) + \cdots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В силу конечности &amp;lt;tex&amp;gt;\mu E&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mu(\overline B_{m + 1} \setminus \overline B_{m}) = \mu \overline B_{m + 1} - \mu \overline B_{m} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вставляя это в ряд и вспоминая, что ряд {{---}} предел частичных сумм, получаем &lt;br /&gt;
&amp;lt;tex&amp;gt;\mu\overline B = \mu\overline B_1 - \mu \overline B_1 + \mu\overline B_2 - \mu \overline B_2 + \mu\overline B_3 - \cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как частичная сумма этого ряда с номером &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; — не что иное, как &amp;lt;tex&amp;gt; \mu \overline B_m &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\mu \overline B_m \rightarrow \mu \overline B &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mu B_m = \mu E - \mu \overline B_m&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mu B = \mu E - \mu \overline B&amp;lt;/tex&amp;gt;, отсюда &amp;lt;tex&amp;gt;\mu B_m \to \mu B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В нашем случае &amp;lt;tex&amp;gt;\mu B  =0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall p : \mu \bigcup\limits_{n=m}^\infty E(|f_n - f| \geq \frac1p) \to 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall \delta &amp;gt; 0\ \exists p_0 \in \mathbb{N} : \frac1{p_0} \leq \delta&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(|f_m - f| \geq \delta) \subset E(|f_m-f|\geq \frac1{p_0}) \to 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;f_n \stackrel{E}{\Rightarrow} f&amp;lt;/tex&amp;gt; по определению.&lt;br /&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; \mu E &amp;lt; +\infty &amp;lt;/tex&amp;gt; — существенно.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим функции &amp;lt;tex&amp;gt;f_n(x)=\begin{cases}0 &amp;amp;, 0 \leq x &amp;lt; n\\1 &amp;amp;, x\geq n\end{cases}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E = \mathbb{R}^+&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При фиксированном &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, для всех &amp;lt;tex&amp;gt;n &amp;gt; N: n &amp;gt; x \Rightarrow f_n(x) = 0&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;f_n(x) \xrightarrow[n \to \infty]{} 0&amp;lt;/tex&amp;gt; всюду на &amp;lt;tex&amp;gt;\mathbb{R}^+&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\lambda(\mathbb{R^+}) = +\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем &amp;lt;tex&amp;gt;\delta=\frac12&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E(|f_n - f|\geq \delta) = \mathbb{R}^+(|f_n(x)| \geq \frac12) = [n; +\infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\lambda E(|f_n-f|\geq \delta) = +\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;f_n \not\Rightarrow 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;
Замечание: даже в случае конечной меры &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; последовательность функций, сходящаяся по мере, может не иметь предела ни в одной точке.&lt;br /&gt;
&lt;br /&gt;
[[Предельный переход в классе измеримых функций|&amp;lt;&amp;lt;]][[Классические теоремы теории измеримых функций|&amp;gt;&amp;gt;]]&lt;br /&gt;
[[Категория:Математический анализ 2 курс]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%BF%D0%BE_%D0%BC%D0%B5%D1%80%D0%B5&amp;diff=16033</id>
		<title>Сходимость по мере</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%BF%D0%BE_%D0%BC%D0%B5%D1%80%D0%B5&amp;diff=16033"/>
				<updated>2012-01-09T22:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
[[Предельный переход в классе измеримых функций|&amp;lt;&amp;lt;]][[Классические теоремы теории измеримых функций|&amp;gt;&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Пусть функции &amp;lt;tex&amp;gt;f_n, f&amp;lt;/tex&amp;gt; {{---}} измеримы на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;, множества &amp;lt;tex&amp;gt;E(|f_n - f| \geq \delta)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\delta &amp;gt; 0&amp;lt;/tex&amp;gt;, измеримы.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;f_n&amp;lt;/tex&amp;gt; стремятся по мере на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;f_n\stackrel{[E]}{\Rightarrow} f&amp;lt;/tex&amp;gt;), если &amp;lt;tex&amp;gt;\forall\delta&amp;gt;0 : \mu E(|f_n - f| \geq \delta) \xrightarrow[n\to\infty]{} 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В определённом смысле, это наиболее слабый вид сходимости, что подтверждает следующая классическая теорема Лебега.&lt;br /&gt;
&lt;br /&gt;
{{TODO| t=запилить единственность}}&lt;br /&gt;
&lt;br /&gt;
==Теорема Лебега==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Лебег&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mu E&amp;lt;+\infty&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;f_n\to f&amp;lt;/tex&amp;gt; почти всюду на &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;f_n\stackrel{E}{\Rightarrow} f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Как мы выяснили ранее, удобно рассматривать &amp;lt;tex&amp;gt;E'=\bigcup\limits_{p=1}^\infty \bigcap\limits_{m=1}^\infty \bigcup\limits_{n=m}^\infty E(|f_n - f| \geq \frac1p)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
по условию теоремы, &amp;lt;tex&amp;gt;\mu E' = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;B_m = \bigcup\limits_{n=m}^\infty E(|f_n - f| \geq \frac1p) \supset B_{m+1}&amp;lt;/tex&amp;gt;, тогда &lt;br /&gt;
&amp;lt;tex&amp;gt;\forall p: B = \bigcap\limits_{m=1}^\infty B_m &amp;lt;/tex&amp;gt;, очевидно, содержится в &amp;lt;tex&amp;gt;E'&amp;lt;/tex&amp;gt;,&lt;br /&gt;
поэтому, по полноте меры, &amp;lt;tex&amp;gt;\mu B = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
По монотонности меры, &amp;lt;tex&amp;gt;\mu B_i&amp;lt;/tex&amp;gt; {{---}} убывающая числовая последовательность. Она ограничена, значит, у неё есть предел. &lt;br /&gt;
&lt;br /&gt;
Покажем, что он равен нулю. Или, более общий факт: &amp;lt;tex&amp;gt;\mu B_m \to \mu B = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся тем, что &amp;lt;tex&amp;gt;\mu E&amp;lt;/tex&amp;gt; {{---}} конечен.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;B = \bigcap\limits_{m=1}^\infty B_m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&amp;lt;tex&amp;gt;\overline B = \bigcup\limits_{m=1}^\infty \overline B_m&amp;lt;/tex&amp;gt; (здесь под &amp;lt;tex&amp;gt; \overline X &amp;lt;/tex&amp;gt; имеется в виду дополнение &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;B_m&amp;lt;/tex&amp;gt; {{---}} убывающая (&amp;lt;tex&amp;gt;B_m \supset B_{m+1}&amp;lt;/tex&amp;gt;), значит, дополнения растут: &amp;lt;tex&amp;gt;\overline B_m \subset \overline B_{m+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\overline B = \overline B_1 \cup (\overline B_2 \setminus \overline B_1) \cup (\overline B_3 \setminus \overline B_2) \cup \ldots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\overline B \subset E&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;\mu \overline B \leq \mu E &amp;lt; +\infty&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;-аддитивности, &amp;lt;tex&amp;gt;\mu\overline B = \mu\overline B_1 + \mu(\overline B_2 \setminus\overline B_1) + \mu(\overline B_3 \setminus \overline B_2) + \cdots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В силу конечности &amp;lt;tex&amp;gt;\mu E&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mu(\overline B_{m + 1} \setminus \overline B_{m}) = \mu \overline B_{m + 1} - \mu \overline B_{m} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вставляя это в ряд и вспоминая, что ряд {{---}} предел частичных сумм, получаем &lt;br /&gt;
&amp;lt;tex&amp;gt;\mu\overline B = \mu\overline B_1 - \mu \overline B_1 + \mu\overline B_2 - \mu \overline B_2 + \mu\overline B_3 - \cdots&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как частичная сумма этого ряда с номером &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; — не что иное, как &amp;lt;tex&amp;gt; \mu \overline B_m &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\mu \overline B_m \rightarrow \mu \overline B &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mu B_m = \mu E - \mu \overline B_m&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mu B = \mu E - \mu \overline B&amp;lt;/tex&amp;gt;, отсюда &amp;lt;tex&amp;gt;\mu B_m \to \mu B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В нашем случае &amp;lt;tex&amp;gt;\mu B  =0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall p : \mu \bigcup\limits_{n=m}^\infty E(|f_n - f| \geq \frac1p) \to 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall \delta &amp;gt; 0\ \exists p_0 \in \mathbb{N} : \frac1{p_0} \leq \delta&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E(|f_m - f| \geq \delta) \subset E(|f_m-f|\geq \frac1{p_0}) \to 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;f_n \stackrel{E}{\Rightarrow} f&amp;lt;/tex&amp;gt; по определению.&lt;br /&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; \mu E &amp;lt; +\infty &amp;lt;/tex&amp;gt; — существенно.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим функции &amp;lt;tex&amp;gt;f_n(x)=\begin{cases}0 &amp;amp;, 0 \leq x &amp;lt; n\\1 &amp;amp;, x\geq n\end{cases}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E = \mathbb{R}^+&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При фиксированном &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, для всех &amp;lt;tex&amp;gt;n &amp;gt; N: n &amp;gt; x \Rightarrow f_n(x) = 0&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;f_n(x) \xrightarrow[n \to \infty]{} 0&amp;lt;/tex&amp;gt; всюду на &amp;lt;tex&amp;gt;\mathbb{R}^+&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\lambda(\mathbb{R^+}) = +\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем &amp;lt;tex&amp;gt;\delta=\frac12&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E(|f_n - f|\geq \delta) = \mathbb{R}^+(|f_n(x)| \geq \frac12) = [n; +\infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\lambda E(|f_n-f|\geq \delta) = +\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;f_n \not\Rightarrow 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;
Замечание: даже в случае конечной меры &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; последовательность функций, сходящаяся по мере, может не иметь предела ни в одной точке.&lt;br /&gt;
&lt;br /&gt;
[[Предельный переход в классе измеримых функций|&amp;lt;&amp;lt;]][[Классические теоремы теории измеримых функций|&amp;gt;&amp;gt;]]&lt;br /&gt;
[[Категория:Математический анализ 2 курс]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=15886</id>
		<title>Участник:System29a</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:System29a&amp;diff=15886"/>
				<updated>2012-01-08T14:13:30Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Артём Попов, 2538&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14884</id>
		<title>Участник:Sementry/Гайд по vizi</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14884"/>
				<updated>2011-12-18T23:18:23Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Подготовка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p align = &amp;quot;right&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Дон Хуан добавил, что в его мире подарков не раздают и что всякое знание дается в нем великим трудом.&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p align = &amp;quot;right&amp;quot;&amp;gt;&amp;lt;i&amp;gt;(К. Кастанеда, &amp;quot;Учение Дона Хуана&amp;quot;)&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если вы зашли на эту страницу, то, вероятнее всего, вы не хотите самостоятельно разбираться с устаревшими недокументированными системами. Возможно, у вас нет на это времени, возможно, вам это не интересно, может быть, вам просто лень. Тем не менее, вы готовы написать много-много кода на Java и XML, а потом долго-долго его дебажить. Так или иначе, вы оказались здесь, потому что хотите разобраться с Vizi и написать визуализатор.&lt;br /&gt;
&lt;br /&gt;
Что же такое Vizi? Это, в некотором роде, фреймворк, который должен облегчить разработку визуализаторов. К сожалению, из-за плохой и незавершенной документации написание приложения с использованием vizi скорее усложняется, а не упрощается. Этот гайд написан для того, чтобы можно было более-менее сориентироваться в процессе разработки и, вопреки всем препятствиям, написать что-то адекватно работающее.&lt;br /&gt;
&lt;br /&gt;
= Подготовка =&lt;br /&gt;
&lt;br /&gt;
=== Установка ===&lt;br /&gt;
Скачиваем [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/vizi-0_4b7.rar последнюю версию Vizi], [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/vizi-0_4b6-bin.rar бинарики предпоследней], [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/classes-1.1.8.jar Java 1.1.8 classes] и [http://mirrors.sonic.net/apache//ant/binaries/apache-ant-1.8.2-bin.zip собранный Apache Ant].&lt;br /&gt;
&lt;br /&gt;
Распаковываем куда-нибудь последнюю версию Vizi. В папку meta копируем файл &amp;quot;classes-1.1.8.jar&amp;quot;. Создаем папку /meta/bin и копируем содержимое папки apache-ant-1.8.2 туда (чтобы получились папки /meta/bin/bin, /meta/bin/lib, etc.). Туда же, куда распаковали последнюю Vizi (т.е. туда, где лежит корневая папка vizi), распаковываем бинарники предпоследней, дополняя недостающие файлы. Заменять новые версии старыми не нужно.&lt;br /&gt;
&lt;br /&gt;
Теперь надо немного подправить xml-файлы для сборки, конечно, если у вас нет Java 1.1. В /meta/scripts/build/build-compile.xml исправляем debuglevel на &amp;quot;lines,vars,source&amp;quot; в 154 строчке и target на &amp;quot;1.7&amp;quot; или &amp;quot;1.6&amp;quot; (в зависимости от версии jdk). Возможно, нужно исправить что-то еще, но, мне кажется, это все. (если этого недостаточно, нужно исправить аналогичным образом строчки 137 и 138 --[[Участник:Glukos|Иван Раков]] 02:01, 18 декабря 2011 (MSK))&lt;br /&gt;
&lt;br /&gt;
=== Для пользователей Windows ===&lt;br /&gt;
Добавляем в систему переменную окружения java_home, в ней прописываем путь к jdk. Путь не должен содержать пробелов. Hint: в Windows можно заменить &amp;quot;Program Files&amp;quot; на &amp;quot;Progra~1&amp;quot;. А &amp;quot;Program Files [x86]&amp;quot; на &amp;quot;Progra~2&amp;quot;, да.&lt;br /&gt;
&lt;br /&gt;
Возвращаемся в корень папки vizi и пробуем запустить ant.bat без параметров. &lt;br /&gt;
Если я написал эту часть гайда правильно, а вы правильно выполнили предыдущие действия, то все должно скомпилироваться, вы получите сообщение &amp;quot;BUILD SUCCESSFUL&amp;quot;, а в корне появится новая папка deploy, в которой будет лежать визуализатор для поиска максимума.&lt;br /&gt;
&lt;br /&gt;
=== Для пользователей Linux ===&lt;br /&gt;
Как вы могли заметить, для сборки проекта в vizi есть файлик ant.bat. Для того, чтобы получить соответствующий файл для сборки понятный Linux, выполните следующие действия:&lt;br /&gt;
&lt;br /&gt;
В системе должны быть прописаны соответственные переменные окружения. Посмотрите на свой &amp;lt;code&amp;gt;~/.profile&amp;lt;/code&amp;gt;(или на .bashrc, тогда надо будет всего лишь открыть новую консоль, а не перелогиниваться --[[Участник:Dgerasimov|Дмитрий Герасимов]]) и добавьте при необходимости следующие строчки: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
JAVA_HOME=/home/jambo/soft/java/jdk1.6.0_24 (то есть путь до jdk) &amp;lt;br/&amp;gt;&lt;br /&gt;
export JAVA_HOME&lt;br /&gt;
&lt;br /&gt;
JDK_HOME=$JAVA_HOME &amp;lt;br/&amp;gt;&lt;br /&gt;
export JDK_HOME&lt;br /&gt;
 &lt;br /&gt;
JRE_HOME=$JAVA_HOME/jre &amp;lt;br/&amp;gt;&lt;br /&gt;
export JRE_HOME&lt;br /&gt;
&lt;br /&gt;
ANT_HOME=/home/jambo/soft/apache-ant (то есть путь до apache-ant)  &amp;lt;br/&amp;gt;&lt;br /&gt;
export ANT_HOME&lt;br /&gt;
&lt;br /&gt;
PATH=$PATH:$JDK_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
PATH=$PATH:$JRE_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
PATH=$PATH:$ANT_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
export PATH &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы все изменения &amp;lt;code&amp;gt;.profile&amp;lt;/code&amp;gt; вступили в силу, нужно перезагрузить машину (или завершить сеанс пользователя и снова зайти)&lt;br /&gt;
&lt;br /&gt;
Ок, переменные окружения мы прописали.&lt;br /&gt;
Теперь в папке с vizi создайте файл &amp;lt;code&amp;gt;ant.sh&amp;lt;/code&amp;gt;, дайте ему права на выполнения командой &amp;lt;code&amp;gt;chmod +x ant.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
в файлик поместите следующее содержимое: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  #!/bin/sh &amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  CLASSPATH=`find meta/bin/lib -maxdepth 3 -name '*.jar' -printf '%p:'`$CLASSPATH &amp;lt;br/&amp;gt;&lt;br /&gt;
  CLASSPATH=`find $JDK_HOME -maxdepth 3 -name '*.jar' -printf '%p:'`$CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  #echo $CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  export CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  exec \&amp;lt;br/&amp;gt;&lt;br /&gt;
          java -classpath &amp;quot;$CLASSPATH&amp;quot; \&amp;lt;br/&amp;gt;&lt;br /&gt;
          org.apache.tools.ant.Main $*&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Запускаем командой &amp;lt;code&amp;gt;./ant.sh&amp;lt;/code&amp;gt;, должно всё получиться. В папке deploy должен валяться визуализатор примера.&lt;br /&gt;
&lt;br /&gt;
=== Дальше ===&lt;br /&gt;
Для того, чтобы скомпилировать что-то еще, нужно исправить строчку project в файле build.properties на путь к нужному проекту. Другие визуализаторы можно взять в Term3. Если у вас собирался поиск максимума, а при попытке сделать то же самое с другим визуализатором начинают появляться ошибки о недостающих классах, то можно взять их из архива rt.jar в jdk и добавить в classes-1.1.8.jar. Также можно просто заменить classes-1.1.8.jar на rt.jar, правда, если это кого-то волнует, он весит на порядок больше. UPD: проблема в том, что конкатенация строк через &amp;quot;+&amp;quot; в Java, похоже, реализована через класс StringBuilder, который появился только в 5 версии. Если вы хотите, чтобы ваш визуализатор полностью соответствовал предъявляемым к нему требованиям, воспользуйтесь методом concat().&lt;br /&gt;
&lt;br /&gt;
Ура-ура, теперь мы умеем собирать правильно написанный готовый визуализатор!&lt;br /&gt;
&lt;br /&gt;
Теперь рекомендуется открыть и прочесть docs/readme.html, если вы вдруг это еще не сделали. Что-то пока будет непонятно, но, по крайней мере, вы узнаете про параметры запуска vizi.&lt;br /&gt;
&lt;br /&gt;
= Написание визуализатора =&lt;br /&gt;
&lt;br /&gt;
Теперь можно начать писать свой собственный визуализатор. Предварительно я настоятельно рекомендую прочесть [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/XMLFormat-0_01.pdf спецификацию используемых XML-описаний].&lt;br /&gt;
&lt;br /&gt;
Структуру проекта можно посмотреть в примерах. Если вы хотите пользоваться какой-нибудь средой разработки, то, вероятно, вам понадобятся исходные коды vizi, которые поставляются вместе с ней и также лежат в папке projects/vizi, ее содержимое нужно скопировать в папку вашего проекта, тогда IDE будет знать, что за классы вы хотите использовать. Компилить проект нужно все тем же запуском ant.bat, дебагать из-под IDE не получится, используйте debug-output.&lt;br /&gt;
&lt;br /&gt;
== %your_project%.xml ==&lt;br /&gt;
&lt;br /&gt;
Берем аналогичный файл из уже готового проекта и меняем все параметры на соответствующие нашему проекту, тут проблем возникнуть не должно.&lt;br /&gt;
&lt;br /&gt;
== %your_project%-algorithm.xml ==&lt;br /&gt;
&lt;br /&gt;
Пожалуй, самая неприятная часть. Да-да, логику программы мы будем писать на языке разметки XML. Для подробных сведений о спецификации используемого метаязыка читайте указанный двумя абзацами выше файл, а также ознакомьтесь с примерами, здесь я опишу лишь некоторые подводные камни.&lt;br /&gt;
&lt;br /&gt;
У нас есть конструкции step для присвоений, if-then-else для переменных, while для циклов и call-auto для вызова функции. Можно спокойно объявлять и пользоваться одиночными переменными и массивами примитивных типов, с другими объектами могут возникнуть внезапные осложнения. В описании сказано, что переменные бывают локальными и глобальными. Это не так, переменные бывают только глобальными; главное отличие состоит в том, что значение по умолчанию у глобальных переменных обязательно присутствует, а у локальных {{---}} обязательно отсутствует. Поэтому с рекурсией все грустно, если она необходима, то, видимо, нужно написать стек самостоятельно, либо использовать на свой страх и риск объект stack, который Vizi сама пропишет(но позже там могут возникнуть проблемы с обращением автомата). Можно также схалтурить и написать основную часть кода в визуализаторе, а xml-файл менять как угодно, лишь бы только запланированное разбиение вашего алгоритма на шаги, которые будет видеть пользователь, оставалось прежним.&lt;br /&gt;
&lt;br /&gt;
Рекомендуемый способ разработки: взять тщательно протестированный и уже сданный код вашего алгоритма на Java, выкинуть из него все сложные классы и языковые конструкции, включая рекурсию и циклы for и свалить все переменные в одну кучу &amp;quot;class Data&amp;quot;. Сохраните люмпенизированный таким образом код и убедитесь в том, что он все еще работает так, как надо. Теперь полученный код можно постепенно перерабатывать в xml-файл, окружая все действия нужными тегами. Пока лучше ничего не рисовать, тег draw можно добавить и потом.&lt;br /&gt;
&lt;br /&gt;
Аргументы в комментарии к шагу задаются как {0}, {1}, etc. Если вы не хотите показывать какой-то шаг пользователю, комментария у него нет, а он все равно показывается, сделайте значение level равным -1.&lt;br /&gt;
&lt;br /&gt;
Когда все напишете, запустите ant.bat с параметром debug-source. Если где-то есть ошибка, то вам скажут, где именно. Если все написано верно, то версия кода для дебага должна появиться в папке src/ru/ifmo/vizi/%your_project%/%your_project%Debug.java. Сравните ее на похожесть с ранее упрощенным кодом, должно получиться примерно то же самое. Подебажьте сгенерированный код и убедитесь в том, что оно и работает так, как запланировано. Если все хорошо, то можно запустить ant.bat без параметров, сборка не дойдет до конца, но вы сгенерируете код src/ru/ifmo/vizi/%your_project%/%your_project%.java, который написан уже в стиле автоматного программирования и пригодится вам для написания визуализатора в вашей любимой IDE.&lt;br /&gt;
&lt;br /&gt;
== %your_project%-configuration.xml ==&lt;br /&gt;
&lt;br /&gt;
Из этого файла будут подгружаться все параметры для вашего визуализатора. Никаких констант, все должно конфигурироваться через XML! Опять же, начать можно с частей уже готовых проектов, оставив более тонкую настройку на потом.&lt;br /&gt;
&lt;br /&gt;
== src/ru/ifmo/vizi/%your_project%/%your_project%Visualizer.java ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуемый способ разработки: взять аналогичный код для поиска максимума и выкинуть из него все лишнее, запустить ant.bat без параметров, убедиться в том, что визуализатор собирается и запускается. Если все прошло успешно, то при запуске вы увидите окошко белого цвета с серой панелькой внизу. На заднем плане будет чернеть консолька, ее, как уже было ранее упомянуто, полезно использовать для debug-output'а.&lt;br /&gt;
&lt;br /&gt;
На этом этапе полезно запустить ant.bat c параметром docs и почитать сгенерированный javadoc.&lt;br /&gt;
&lt;br /&gt;
Если вам нужен какой-то компонент, которого нет в vizi, то ищите его в AWT. Если вам нужен какой-то графический примитив, то, возможно, придется написать его самостоятельно. Код некоторых графических примитивов можно посмотреть, например, в SegmentsTree\src\ru\ifmo\vizi\SegmentsTree\widgets.&lt;br /&gt;
&lt;br /&gt;
Больше я не могу посоветовать ничего конкретного, читайте исходники (лучше не читать исходники поиска максимума, черта с два вы напишете что-то работающее так же) и смотрите, как визуализация устроена там.&lt;br /&gt;
&lt;br /&gt;
== ссылки ==&lt;br /&gt;
* [http://dl.dropbox.com/u/29995484/vizi.zip] - моя папка vizi, со всеми необходимыми частями и всевозможным мусором;&lt;br /&gt;
* [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/] - страничка vizi на neerc.ifmo.ru.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14772</id>
		<title>Участник:Sementry/Гайд по vizi</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14772"/>
				<updated>2011-12-17T20:56:51Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Для пользователей Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p align = &amp;quot;right&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Дон Хуан добавил, что в его мире подарков не раздают и что всякое знание дается в нем великим трудом.&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p align = &amp;quot;right&amp;quot;&amp;gt;&amp;lt;i&amp;gt;(К. Кастанеда, &amp;quot;Учение Дона Хуана&amp;quot;)&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если вы зашли на эту страницу, то, вероятнее всего, вы не хотите самостоятельно разбираться с устаревшими недокументированными системами. Возможно, у вас нет на это времени, возможно, вам это не интересно, может быть, вам просто лень. Тем не менее, вы готовы написать много-много кода на Java и XML, а потом долго-долго его дебажить. Так или иначе, вы оказались здесь, потому что хотите разобраться с Vizi и написать визуализатор.&lt;br /&gt;
&lt;br /&gt;
Что же такое Vizi? Это, в некотором роде, фреймворк, который должен облегчить разработку визуализаторов. К сожалению, из-за плохой и незавершенной документации написание приложения с использованием vizi скорее усложняется, а не упрощается. Этот гайд написан для того, чтобы можно было более-менее сориентироваться в процессе разработки и, вопреки всем препятствиям, написать что-то адекватно работающее.&lt;br /&gt;
&lt;br /&gt;
= Подготовка =&lt;br /&gt;
&lt;br /&gt;
=== Установка ===&lt;br /&gt;
Скачиваем [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/vizi-0_4b7.rar последнюю версию Vizi], [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/vizi-0_4b6-bin.rar бинарики предпоследней], [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/classes-1.1.8.jar Java 1.1.8 classes] и [http://mirrors.sonic.net/apache//ant/binaries/apache-ant-1.8.2-bin.zip собранный Apache Ant].&lt;br /&gt;
&lt;br /&gt;
Распаковываем куда-нибудь последнюю версию Vizi. В папку meta копируем файл &amp;quot;classes-1.1.8.jar&amp;quot;. Создаем папку /meta/bin и копируем содержимое папки apache-ant-1.8.2 туда (чтобы получились папки /meta/bin/bin, /meta/bin/lib, etc.). Туда же, куда распаковали последнюю Vizi (т.е. туда, где лежит корневая папка vizi), распаковываем бинарники предпоследней, дополняя недостающие файлы. Заменять новые версии старыми не нужно.&lt;br /&gt;
=== Для пользователей Windows ===&lt;br /&gt;
Добавляем в систему переменную окружения java_home, в ней прописываем путь к jdk. Путь не должен содержать пробелов. Hint: в Windows можно заменить &amp;quot;Program Files&amp;quot; на &amp;quot;Progra~1&amp;quot;. А &amp;quot;Program Files [x86]&amp;quot; на &amp;quot;Progra~2&amp;quot;, да.&lt;br /&gt;
&lt;br /&gt;
Теперь надо немного подправить xml-файлы для сборки, конечно, если у вас нет Java 1.1. В /meta/scripts/build/build-compile.xml исправляем debuglevel на &amp;quot;lines,vars,source&amp;quot; в 154 строчке и target на &amp;quot;1.7&amp;quot; или &amp;quot;1.6&amp;quot; (в зависимости от версии jdk). Возможно, нужно исправить что-то еще, но, мне кажется, это все.&lt;br /&gt;
&lt;br /&gt;
Возвращаемся в корень папки vizi и пробуем запустить ant.bat без параметров. &lt;br /&gt;
Если я написал эту часть гайда правильно, а вы правильно выполнили предыдущие действия, то все должно скомпилироваться, вы получите сообщение &amp;quot;BUILD SUCCESSFUL&amp;quot;, а в корне появится новая папка deploy, в которой будет лежать визуализатор для поиска максимума.&lt;br /&gt;
&lt;br /&gt;
=== Для пользователей Linux ===&lt;br /&gt;
Как вы могли заметить, для сборки проекта в vizi есть файлик ant.bat. Для того, чтобы получить соответствующий файл для сборки понятный Linux, выполните следующие действия:&lt;br /&gt;
&lt;br /&gt;
В системе должны быть прописаны соответственные переменные окружения. Посмотрите на свой &amp;lt;code&amp;gt;~/.profile&amp;lt;/code&amp;gt; и добавьте при необходимости следующие строчки: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
JAVA_HOME=/home/jambo/soft/java/jdk1.6.0_24 (то есть путь до jdk) &amp;lt;br/&amp;gt;&lt;br /&gt;
export JAVA_HOME&lt;br /&gt;
&lt;br /&gt;
JDK_HOME=$JAVA_HOME &amp;lt;br/&amp;gt;&lt;br /&gt;
export JDK_HOME&lt;br /&gt;
 &lt;br /&gt;
JRE_HOME=$JAVA_HOME/jre &amp;lt;br/&amp;gt;&lt;br /&gt;
export JRE_HOME&lt;br /&gt;
&lt;br /&gt;
ANT_HOME=/home/jambo/soft/apache-ant (то есть путь до apache-ant)  &amp;lt;br/&amp;gt;&lt;br /&gt;
export ANT_HOME&lt;br /&gt;
&lt;br /&gt;
PATH=$PATH:$JDK_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
PATH=$PATH:$JRE_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
PATH=$PATH:$ANT_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
export PATH &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы все изменения &amp;lt;code&amp;gt;.profile&amp;lt;/code&amp;gt; вступили в силу, нужно перезагрузить машину (или завершить сеанс пользователя и снова зайти)&lt;br /&gt;
&lt;br /&gt;
Ок, переменные окружения мы прописали.&lt;br /&gt;
Теперь в папке с vizi создайте файл &amp;lt;code&amp;gt;ant.sh&amp;lt;/code&amp;gt;, дайте ему права на выполнения командой &amp;lt;code&amp;gt;chmod +x ant.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
в файлик поместите следующее содержимое: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  #!/bin/sh &amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  CLASSPATH=`find meta/bin/lib -maxdepth 3 -name '*.jar' -printf '%p:'`$CLASSPATH &amp;lt;br/&amp;gt;&lt;br /&gt;
  CLASSPATH=`find $JDK_HOME -maxdepth 3 -name '*.jar' -printf '%p:'`$CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  #echo $CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  export CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  exec \&amp;lt;br/&amp;gt;&lt;br /&gt;
          java -classpath &amp;quot;$CLASSPATH&amp;quot; \&amp;lt;br/&amp;gt;&lt;br /&gt;
          org.apache.tools.ant.Main $*&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Запускаем командой &amp;lt;code&amp;gt;./ant.sh&amp;lt;/code&amp;gt;, должно всё получиться. В папке deploy должен валяться визуализатор примера.&lt;br /&gt;
&lt;br /&gt;
=== Дальше ===&lt;br /&gt;
Для того, чтобы скомпилировать что-то еще, нужно исправить строчку project в файле build.properties на путь к нужному проекту. Другие визуализаторы можно взять в Term3. Если у вас собирался поиск максимума, а при попытке сделать то же самое с другим визуализатором начинают появляться ошибки о недостающих классах, то можно взять их из архива rt.jar в jdk и добавить в classes-1.1.8.jar. Также можно просто заменить classes-1.1.8.jar на rt.jar, правда, если это кого-то волнует, он весит на порядок больше. &lt;br /&gt;
&lt;br /&gt;
Ура-ура, теперь мы умеем собирать правильно написанный готовый визуализатор!&lt;br /&gt;
&lt;br /&gt;
Теперь рекомендуется открыть и прочесть docs/readme.html, если вы вдруг это еще не сделали. Что-то пока будет непонятно, но, по крайней мере, вы узнаете про параметры запуска vizi.&lt;br /&gt;
&lt;br /&gt;
= Написание визуализатора =&lt;br /&gt;
&lt;br /&gt;
Теперь можно начать писать свой собственный визуализатор. Предварительно я настоятельно рекомендую прочесть [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/XMLFormat-0_01.pdf спецификацию используемых XML-описаний].&lt;br /&gt;
&lt;br /&gt;
Структуру проекта можно посмотреть в примерах. Если вы хотите пользоваться какой-нибудь средой разработки, то, вероятно, вам понадобятся исходные коды vizi, которые поставляются вместе с ней и также лежат в папке projects/vizi, ее содержимое нужно скопировать в папку вашего проекта, тогда IDE будет знать, что за классы вы хотите использовать. Компилить проект нужно все тем же запуском ant.bat, дебагать из-под IDE не получится, используйте debug-output.&lt;br /&gt;
&lt;br /&gt;
== %your_project%.xml ==&lt;br /&gt;
&lt;br /&gt;
Берем аналогичный файл из уже готового проекта и меняем все параметры на соответствующие нашему проекту, тут проблем возникнуть не должно.&lt;br /&gt;
&lt;br /&gt;
== %your_project%-algorithm.xml ==&lt;br /&gt;
&lt;br /&gt;
Пожалуй, самая неприятная часть. Да-да, логику программы мы будем писать на языке разметки XML. Для подробных сведений о спецификации используемого метаязыка читайте указанный двумя абзацами выше файл, а также ознакомьтесь с примерами, здесь я опишу лишь некоторые подводные камни.&lt;br /&gt;
&lt;br /&gt;
У нас есть конструкции step для присвоений, if-then-else для переменных, while для циклов и call-auto для вызова функции. Можно спокойно объявлять и пользоваться одиночными переменными и массивами примитивных типов, с другими объектами могут возникнуть внезапные осложнения. В описании сказано, что переменные бывают локальными и глобальными. Это не так, переменные бывают только глобальными; главное отличие состоит в том, что значение по умолчанию у глобальных переменных обязательно присутствует, а у локальных {{---}} обязательно отсутствует. Поэтому с рекурсией все грустно, если она необходима, то, видимо, нужно написать стек самостоятельно, либо использовать на свой страх и риск объект stack, который Vizi сама пропишет(но позже там могут возникнуть проблемы с обращением автомата). Можно также схалтурить и написать основную часть кода в визуализаторе, а xml-файл менять как угодно, лишь бы только запланированное разбиение вашего алгоритма на шаги, которые будет видеть пользователь, оставалось прежним.&lt;br /&gt;
&lt;br /&gt;
Рекомендуемый способ разработки: взять тщательно протестированный и уже сданный код вашего алгоритма на Java, выкинуть из него все сложные классы и языковые конструкции, включая рекурсию и циклы for и свалить все переменные в одну кучу &amp;quot;class Data&amp;quot;. Сохраните люмпенизированный таким образом код и убедитесь в том, что он все еще работает так, как надо. Теперь полученный код можно постепенно перерабатывать в xml-файл, окружая все действия нужными тегами. Пока лучше ничего не рисовать, тег draw можно добавить и потом.&lt;br /&gt;
&lt;br /&gt;
Аргументы в комментарии к шагу задаются как {0}, {1}, etc. Если вы не хотите показывать какой-то шаг пользователю, комментария у него нет, а он все равно показывается, сделайте значение level равным -1.&lt;br /&gt;
&lt;br /&gt;
Когда все напишете, запустите ant.bat с параметром debug-source. Если где-то есть ошибка, то вам скажут, где именно. Если все написано верно, то версия кода для дебага должна появиться в папке src/ru/ifmo/vizi/%your_project%/%your_project%Debug.java. Сравните ее на похожесть с ранее упрощенным кодом, должно получиться примерно то же самое. Подебажьте сгенерированный код и убедитесь в том, что оно и работает так, как запланировано. Если все хорошо, то можно запустить ant.bat без параметров, сборка не дойдет до конца, но вы сгенерируете код src/ru/ifmo/vizi/%your_project%/%your_project%.java, который написан уже в стиле автоматного программирования и пригодится вам для написания визуализатора в вашей любимой IDE.&lt;br /&gt;
&lt;br /&gt;
== %your_project%-configuration.xml ==&lt;br /&gt;
&lt;br /&gt;
Из этого файла будут подгружаться все параметры для вашего визуализатора. Никаких констант, все должно конфигурироваться через XML! Опять же, начать можно с частей уже готовых проектов, оставив более тонкую настройку на потом.&lt;br /&gt;
&lt;br /&gt;
== src/ru/ifmo/vizi/%your_project%/%your_project%Visualizer.java ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуемый способ разработки: взять аналогичный код для поиска максимума и выкинуть из него все лишнее, запустить ant.bat без параметров, убедиться в том, что визуализатор собирается и запускается. Если все прошло успешно, то при запуске вы увидите окошко белого цвета с серой панелькой внизу. На заднем плане будет чернеть консолька, ее, как уже было ранее упомянуто, полезно использовать для debug-output'а.&lt;br /&gt;
&lt;br /&gt;
На этом этапе полезно запустить ant.bat c параметром docs и почитать сгенерированный javadoc.&lt;br /&gt;
&lt;br /&gt;
Если вам нужен какой-то компонент, которого нет в vizi, то ищите его в AWT. Если вам нужен какой-то графический примитив, то, возможно, придется написать его самостоятельно. Код некоторых графических примитивов можно посмотреть, например, в SegmentsTree\src\ru\ifmo\vizi\SegmentsTree\widgets.&lt;br /&gt;
&lt;br /&gt;
Больше я не могу посоветовать ничего конкретного, читайте исходники (лучше не читать исходники поиска максимума, черта с два вы напишете что-то работающее так же) и смотрите, как визуализация устроена там.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14771</id>
		<title>Участник:Sementry/Гайд по vizi</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14771"/>
				<updated>2011-12-17T20:40:29Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: Добавил часть для линуксоидов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p align = &amp;quot;right&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Дон Хуан добавил, что в его мире подарков не раздают и что всякое знание дается в нем великим трудом.&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p align = &amp;quot;right&amp;quot;&amp;gt;&amp;lt;i&amp;gt;(К. Кастанеда, &amp;quot;Учение Дона Хуана&amp;quot;)&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если вы зашли на эту страницу, то, вероятнее всего, вы не хотите самостоятельно разбираться с устаревшими недокументированными системами. Возможно, у вас нет на это времени, возможно, вам это не интересно, может быть, вам просто лень. Тем не менее, вы готовы написать много-много кода на Java и XML, а потом долго-долго его дебажить. Так или иначе, вы оказались здесь, потому что хотите разобраться с Vizi и написать визуализатор.&lt;br /&gt;
&lt;br /&gt;
Что же такое Vizi? Это, в некотором роде, фреймворк, который должен облегчить разработку визуализаторов. К сожалению, из-за плохой и незавершенной документации написание приложения с использованием vizi скорее усложняется, а не упрощается. Этот гайд написан для того, чтобы можно было более-менее сориентироваться в процессе разработки и, вопреки всем препятствиям, написать что-то адекватно работающее.&lt;br /&gt;
&lt;br /&gt;
= Подготовка =&lt;br /&gt;
&lt;br /&gt;
=== Установка ===&lt;br /&gt;
Скачиваем [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/vizi-0_4b7.rar последнюю версию Vizi], [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/vizi-0_4b6-bin.rar бинарики предпоследней], [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/classes-1.1.8.jar Java 1.1.8 classes] и [http://mirrors.sonic.net/apache//ant/binaries/apache-ant-1.8.2-bin.zip собранный Apache Ant].&lt;br /&gt;
&lt;br /&gt;
Распаковываем куда-нибудь последнюю версию Vizi. В папку meta копируем файл &amp;quot;classes-1.1.8.jar&amp;quot;. Создаем папку /meta/bin и копируем содержимое папки apache-ant-1.8.2 туда (чтобы получились папки /meta/bin/bin, /meta/bin/lib, etc.). Туда же, куда распаковали последнюю Vizi (т.е. туда, где лежит корневая папка vizi), распаковываем бинарники предпоследней, дополняя недостающие файлы. Заменять новые версии старыми не нужно.&lt;br /&gt;
=== Для пользователей Windows ===&lt;br /&gt;
Добавляем в систему переменную окружения java_home, в ней прописываем путь к jdk. Путь не должен содержать пробелов. Hint: в Windows можно заменить &amp;quot;Program Files&amp;quot; на &amp;quot;Progra~1&amp;quot;. А &amp;quot;Program Files [x86]&amp;quot; на &amp;quot;Progra~2&amp;quot;, да.&lt;br /&gt;
&lt;br /&gt;
Теперь надо немного подправить xml-файлы для сборки, конечно, если у вас нет Java 1.1. В /meta/scripts/build/build-compile.xml исправляем debuglevel на &amp;quot;lines,vars,source&amp;quot; в 154 строчке и target на &amp;quot;1.7&amp;quot; или &amp;quot;1.6&amp;quot; (в зависимости от версии jdk). Возможно, нужно исправить что-то еще, но, мне кажется, это все.&lt;br /&gt;
&lt;br /&gt;
Возвращаемся в корень папки vizi и пробуем запустить ant.bat без параметров. &lt;br /&gt;
Если я написал эту часть гайда правильно, а вы правильно выполнили предыдущие действия, то все должно скомпилироваться, вы получите сообщение &amp;quot;BUILD SUCCESSFUL&amp;quot;, а в корне появится новая папка deploy, в которой будет лежать визуализатор для поиска максимума.&lt;br /&gt;
&lt;br /&gt;
=== Для пользователей Linux ===&lt;br /&gt;
Как вы могли заметить, для сборки проекта в vizi есть файлик ant.bat. Для того, чтобы получить соответствующий файл для сборки понятный Linux, выполните следующие действия:&lt;br /&gt;
&lt;br /&gt;
В системе должны быть прописаны соответственные переменные окружения. Посмотрите на свой &amp;lt;code&amp;gt;~/.profile&amp;lt;/code&amp;gt; и добавьте при необходимости следующие строчки: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
JAVA_HOME=/home/jambo/soft/java/jdk1.6.0_24 (то есть путь до jdk) &amp;lt;br/&amp;gt;&lt;br /&gt;
export JAVA_HOME&lt;br /&gt;
&lt;br /&gt;
JDK_HOME=$JAVA_HOME &amp;lt;br/&amp;gt;&lt;br /&gt;
export JDK_HOME&lt;br /&gt;
 &lt;br /&gt;
JRE_HOME=$JAVA_HOME/jre &amp;lt;br/&amp;gt;&lt;br /&gt;
export JRE_HOME&lt;br /&gt;
&lt;br /&gt;
ANT_HOME=/home/jambo/soft/apache-ant (то есть путь до apache-ant)  &amp;lt;br/&amp;gt;&lt;br /&gt;
export ANT_HOME&lt;br /&gt;
&lt;br /&gt;
PATH=$PATH:$JDK_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
PATH=$PATH:$JRE_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
PATH=$PATH:$ANT_HOME/bin &amp;lt;br/&amp;gt;&lt;br /&gt;
export PATH &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы все изменения &amp;lt;code&amp;gt;.profile&amp;lt;/code&amp;gt; вступили в силу, нужно перезагрузить машину (или завершить сеанс пользователя и снова зайти)&lt;br /&gt;
&lt;br /&gt;
Ок, переменные окружения мы прописали.&lt;br /&gt;
Теперь в папке с vizi создайте файл &amp;lt;code&amp;gt;ant.sh&amp;lt;/code&amp;gt;, дайте ему права на выполнения командой &amp;lt;code&amp;gt;chmod +x ant.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
в файлик поместите следующее содержимое: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  #!/bin/sh &amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  CLASSPATH=`find meta/bin/lib -maxdepth 3 -name '*.jar' -printf '%p:'`$CLASSPATH &amp;lt;br/&amp;gt;&lt;br /&gt;
  CLASSPATH=`find $JDK_HOME -maxdepth 3 -name '*.jar' -printf '%p:'`$CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  #echo $CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  export CLASSPATH&amp;lt;br/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  exec \&amp;lt;br/&amp;gt;&lt;br /&gt;
          java -classpath &amp;quot;$CLASSPATH&amp;quot; \&amp;lt;br/&amp;gt;&lt;br /&gt;
          org.apache.tools.ant.Main&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Запускаем командой &amp;lt;code&amp;gt;./ant.sh&amp;lt;/code&amp;gt;, должно всё получиться. В папке deploy должен валяться визуализатор примера.&lt;br /&gt;
&lt;br /&gt;
=== Дальше ===&lt;br /&gt;
Для того, чтобы скомпилировать что-то еще, нужно исправить строчку project в файле build.properties на путь к нужному проекту. Другие визуализаторы можно взять в Term3. Если у вас собирался поиск максимума, а при попытке сделать то же самое с другим визуализатором начинают появляться ошибки о недостающих классах, то можно взять их из архива rt.jar в jdk и добавить в classes-1.1.8.jar. Также можно просто заменить classes-1.1.8.jar на rt.jar, правда, если это кого-то волнует, он весит на порядок больше. &lt;br /&gt;
&lt;br /&gt;
Ура-ура, теперь мы умеем собирать правильно написанный готовый визуализатор!&lt;br /&gt;
&lt;br /&gt;
Теперь рекомендуется открыть и прочесть docs/readme.html, если вы вдруг это еще не сделали. Что-то пока будет непонятно, но, по крайней мере, вы узнаете про параметры запуска vizi.&lt;br /&gt;
&lt;br /&gt;
= Написание визуализатора =&lt;br /&gt;
&lt;br /&gt;
Теперь можно начать писать свой собственный визуализатор. Предварительно я настоятельно рекомендую прочесть [http://neerc.ifmo.ru/~kgeorgiy/courses/vizi/XMLFormat-0_01.pdf спецификацию используемых XML-описаний].&lt;br /&gt;
&lt;br /&gt;
Структуру проекта можно посмотреть в примерах. Если вы хотите пользоваться какой-нибудь средой разработки, то, вероятно, вам понадобятся исходные коды vizi, которые поставляются вместе с ней и также лежат в папке projects/vizi, ее содержимое нужно скопировать в папку вашего проекта, тогда IDE будет знать, что за классы вы хотите использовать. Компилить проект нужно все тем же запуском ant.bat, дебагать из-под IDE не получится, используйте debug-output.&lt;br /&gt;
&lt;br /&gt;
== %your_project%.xml ==&lt;br /&gt;
&lt;br /&gt;
Берем аналогичный файл из уже готового проекта и меняем все параметры на соответствующие нашему проекту, тут проблем возникнуть не должно.&lt;br /&gt;
&lt;br /&gt;
== %your_project%-algorithm.xml ==&lt;br /&gt;
&lt;br /&gt;
Пожалуй, самая неприятная часть. Да-да, логику программы мы будем писать на языке разметки XML. Для подробных сведений о спецификации используемого метаязыка читайте указанный двумя абзацами выше файл, а также ознакомьтесь с примерами, здесь я опишу лишь некоторые подводные камни.&lt;br /&gt;
&lt;br /&gt;
У нас есть конструкции step для присвоений, if-then-else для переменных, while для циклов и call-auto для вызова функции. Можно спокойно объявлять и пользоваться одиночными переменными и массивами примитивных типов, с другими объектами могут возникнуть внезапные осложнения. В описании сказано, что переменные бывают локальными и глобальными. Это не так, переменные бывают только глобальными; главное отличие состоит в том, что значение по умолчанию у глобальных переменных обязательно присутствует, а у локальных {{---}} обязательно отсутствует. Поэтому с рекурсией все грустно, если она необходима, то, видимо, нужно написать стек самостоятельно, либо использовать на свой страх и риск объект stack, который Vizi сама пропишет(но позже там могут возникнуть проблемы с обращением автомата). Можно также схалтурить и написать основную часть кода в визуализаторе, а xml-файл менять как угодно, лишь бы только запланированное разбиение вашего алгоритма на шаги, которые будет видеть пользователь, оставалось прежним.&lt;br /&gt;
&lt;br /&gt;
Рекомендуемый способ разработки: взять тщательно протестированный и уже сданный код вашего алгоритма на Java, выкинуть из него все сложные классы и языковые конструкции, включая рекурсию и циклы for и свалить все переменные в одну кучу &amp;quot;class Data&amp;quot;. Сохраните люмпенизированный таким образом код и убедитесь в том, что он все еще работает так, как надо. Теперь полученный код можно постепенно перерабатывать в xml-файл, окружая все действия нужными тегами. Пока лучше ничего не рисовать, тег draw можно добавить и потом.&lt;br /&gt;
&lt;br /&gt;
Аргументы в комментарии к шагу задаются как {0}, {1}, etc. Если вы не хотите показывать какой-то шаг пользователю, комментария у него нет, а он все равно показывается, сделайте значение level равным -1.&lt;br /&gt;
&lt;br /&gt;
Когда все напишете, запустите ant.bat с параметром debug-source. Если где-то есть ошибка, то вам скажут, где именно. Если все написано верно, то версия кода для дебага должна появиться в папке src/ru/ifmo/vizi/%your_project%/%your_project%Debug.java. Сравните ее на похожесть с ранее упрощенным кодом, должно получиться примерно то же самое. Подебажьте сгенерированный код и убедитесь в том, что оно и работает так, как запланировано. Если все хорошо, то можно запустить ant.bat без параметров, сборка не дойдет до конца, но вы сгенерируете код src/ru/ifmo/vizi/%your_project%/%your_project%.java, который написан уже в стиле автоматного программирования и пригодится вам для написания визуализатора в вашей любимой IDE.&lt;br /&gt;
&lt;br /&gt;
== %your_project%-configuration.xml ==&lt;br /&gt;
&lt;br /&gt;
Из этого файла будут подгружаться все параметры для вашего визуализатора. Никаких констант, все должно конфигурироваться через XML! Опять же, начать можно с частей уже готовых проектов, оставив более тонкую настройку на потом.&lt;br /&gt;
&lt;br /&gt;
== src/ru/ifmo/vizi/%your_project%/%your_project%Visualizer.java ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуемый способ разработки: взять аналогичный код для поиска максимума и выкинуть из него все лишнее, запустить ant.bat без параметров, убедиться в том, что визуализатор собирается и запускается. Если все прошло успешно, то при запуске вы увидите окошко белого цвета с серой панелькой внизу. На заднем плане будет чернеть консолька, ее, как уже было ранее упомянуто, полезно использовать для debug-output'а.&lt;br /&gt;
&lt;br /&gt;
На этом этапе полезно запустить ant.bat c параметром docs и почитать сгенерированный javadoc.&lt;br /&gt;
&lt;br /&gt;
Если вам нужен какой-то компонент, которого нет в vizi, то ищите его в AWT. Если вам нужен какой-то графический примитив, то, возможно, придется написать его самостоятельно. Код некоторых графических примитивов можно посмотреть, например, в SegmentsTree\src\ru\ifmo\vizi\SegmentsTree\widgets.&lt;br /&gt;
&lt;br /&gt;
Больше я не могу посоветовать ничего конкретного, читайте исходники (лучше не читать исходники поиска максимума, черта с два вы напишете что-то работающее так же) и смотрите, как визуализация устроена там.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14768</id>
		<title>Обсуждение участника:Sementry/Гайд по vizi</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14768"/>
				<updated>2011-12-17T19:56:41Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Можешь впилить линк на этот гайд на свою страницу? Так будет удобнее, имо. --[[Участник:SkudarnovYaroslav|SkudarnovYaroslav]] 12:57, 13 декабря 2011 (MSK)&lt;br /&gt;
: На свою страницу [[Участник:Sementry|здесь]]? Done.&lt;br /&gt;
:: Благодарю =)&lt;br /&gt;
&lt;br /&gt;
[флуд] Мне нравится как выглядела фраза &amp;quot;пользователи альтернативных операционных систем&amp;quot; до правки. -- [[Участник:Dmitriy D.|Dmitriy D.]] 11:37, 14 декабря 2011 (MSK)&lt;br /&gt;
&lt;br /&gt;
Сделал все по подготовке, перепроверил 3 раза, Система не находит путь...что я делаю не так? Завадский Дмитрий&lt;br /&gt;
: Что у тебя с переменной окружения java_home ? Попробуй в консоли написать: &amp;quot;%java_home%\bin\javac&amp;quot;. Если тут скажет, что не может найти путь, значит у тебя неправильно установлена переменная %java_home% (а может быть ты указал путь к jre вместо jdk?) [[Участник:Dmitriy D.|Dmitriy D.]] 19:38, 17 декабря 2011 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Участник:System29a|System29a]] 22:34, 17 декабря 2011 (MSK) Ребят, кто-то под никсами собирал? не могу никак совладать с &lt;br /&gt;
BUILD FAILED&lt;br /&gt;
/home/jambo/tmp/vizi/meta/scripts/build/build-shared.xml:120: taskdef class SchemaValidatorTask cannot be found&lt;br /&gt;
&lt;br /&gt;
Update: сейчас подкручу гайд, линуксоидам нужен свой запускающий скрипт.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14767</id>
		<title>Обсуждение участника:Sementry/Гайд по vizi</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sementry/%D0%93%D0%B0%D0%B9%D0%B4_%D0%BF%D0%BE_vizi&amp;diff=14767"/>
				<updated>2011-12-17T19:34:51Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Можешь впилить линк на этот гайд на свою страницу? Так будет удобнее, имо. --[[Участник:SkudarnovYaroslav|SkudarnovYaroslav]] 12:57, 13 декабря 2011 (MSK)&lt;br /&gt;
: На свою страницу [[Участник:Sementry|здесь]]? Done.&lt;br /&gt;
:: Благодарю =)&lt;br /&gt;
&lt;br /&gt;
[флуд] Мне нравится как выглядела фраза &amp;quot;пользователи альтернативных операционных систем&amp;quot; до правки. -- [[Участник:Dmitriy D.|Dmitriy D.]] 11:37, 14 декабря 2011 (MSK)&lt;br /&gt;
&lt;br /&gt;
Сделал все по подготовке, перепроверил 3 раза, Система не находит путь...что я делаю не так? Завадский Дмитрий&lt;br /&gt;
: Что у тебя с переменной окружения java_home ? Попробуй в консоли написать: &amp;quot;%java_home%\bin\javac&amp;quot;. Если тут скажет, что не может найти путь, значит у тебя неправильно установлена переменная %java_home% (а может быть ты указал путь к jre вместо jdk?) [[Участник:Dmitriy D.|Dmitriy D.]] 19:38, 17 декабря 2011 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Участник:System29a|System29a]] 22:34, 17 декабря 2011 (MSK) Ребят, кто-то под никсами собирал? не могу никак совладать с &lt;br /&gt;
BUILD FAILED&lt;br /&gt;
/home/jambo/tmp/vizi/meta/scripts/build/build-shared.xml:120: taskdef class SchemaValidatorTask cannot be found&lt;/div&gt;</summary>
		<author><name>System29a</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=14760</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=14760"/>
				<updated>2011-12-17T05:29:08Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Хроматический многочлен полного графа */&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; называется '''хроматическим многочленом'''. Обозначают &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=Пусть &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/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/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;
&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;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&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;
{{Теорема&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;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;.&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; и &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;&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;. Тогда верны два следующих утверждения:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Граф &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;&lt;br /&gt;
2. В графе &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;&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;
|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;
|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;
== Литература ==&lt;br /&gt;
1. Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. - 368 с.: ил. - (Учебники для вузов. Специальная литература). '''ISBN 978-5-8114-1068-2'''&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Харари Ф. - Теория графов: Изд. 4-е. - М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. - 296 с. '''ISBN 978-5-397-00622-4'''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Раскраски графов]]&lt;/div&gt;</summary>
		<author><name>System29a</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=14759</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=14759"/>
				<updated>2011-12-17T05:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &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; называется '''хроматическим многочленом'''. Обозначают &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=Пусть &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/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/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;
&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;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Примечание. В некоторых источниках &amp;lt;tex&amp;gt;x^{\underline{n}}&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;x^{(n)}&amp;lt;/tex&amp;gt;. Это не очень удобно, так как легко спутать с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-ой производной.&lt;br /&gt;
&lt;br /&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;
{{Теорема&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;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;.&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; и &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;&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;. Тогда верны два следующих утверждения:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Граф &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;&lt;br /&gt;
2. В графе &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;&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;
|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;
|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;
== Литература ==&lt;br /&gt;
1. Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. - 368 с.: ил. - (Учебники для вузов. Специальная литература). '''ISBN 978-5-8114-1068-2'''&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Харари Ф. - Теория графов: Изд. 4-е. - М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. - 296 с. '''ISBN 978-5-397-00622-4'''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Раскраски графов]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=14758</id>
		<title>Формула Уитни</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%A3%D0%B8%D1%82%D0%BD%D0%B8&amp;diff=14758"/>
				<updated>2011-12-17T04:52:36Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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, m)&amp;lt;/tex&amp;gt; - граф. Тогда коэффициент при &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;1\le i\le n&amp;lt;/tex&amp;gt; в хроматическом многочлене &amp;lt;tex&amp;gt;P(G, x)&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;\sum \limits_{j=0}^{m}{(-1)^jN(i, j)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; - число остовных подграфов графа &amp;lt;tex&amp;gt;G&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; рёбер, т.е. &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{i=1}^{n}{(\sum \limits_{j=0}^{m}{(-1)^jN(i, j))x^i}}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;br&amp;gt;Пусть &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; — некоторый набор из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; красок. Отображение &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;VG&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;K&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;G&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Возьмём некоторую собственную или несобственную раскраску графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Удалим из графа каждое ребро, концы которого раскрашены в разный цвет. Получим остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;, в котором каждое ребро соединяет вершины одинакового цвета. Исходную собственную или несобственную раскраску будем называть ''строго несобственной'' раскраской остовного подграфа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;. Каждой компоненте связности графа &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; соответствует точно один цвет - цвет её вершин. Если остовный подграф &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; компонент связности, то есть &amp;lt;tex&amp;gt;x^i&amp;lt;/tex&amp;gt; различных строго несобственных раскрасок, отвечающих остовному подграфу &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt;.&amp;lt;br&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;br&amp;gt;Пусть &amp;lt;tex&amp;gt;N(i, j)&amp;lt;/tex&amp;gt; — число остовных подграфов графа &amp;lt;tex&amp;gt;G&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; рёбер.&amp;lt;br&amp;gt;&lt;br /&gt;
Из общего числа &amp;lt;tex&amp;gt;x^n&amp;lt;/tex&amp;gt; собственных и не собственных раскрасок вычтем число строго несобственных раскрасок остовных подграфов, имеющих ровно одно ребро. Если мы вычтем сумму &amp;lt;tex&amp;gt; \sum \limits_{i}{N(i, 1)x^i} &amp;lt;/tex&amp;gt;, то мы вычтем помимо указанного числа ещё и избыточную величину. Действительно, допустим &amp;lt;tex&amp;gt;e_1 = u_1v_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2 = u_2v_2&amp;lt;/tex&amp;gt; — два различных ребра графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Тогда в число строго несобственных раскрасок остовного подграфа, содержащего точно одно ребро &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt;, попадут и те, у которых вершины &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;, а это в свою очередь строго несобственные раскраски остовного подграфа, содержащего ровно два ребра &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. При этом их число мы вычтем дважды — для &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt;. Аналогично, число строго несобственных раскрасок остовных подграфов, содержащих точно три, четыре и более ребер будет вычтено соответствующее число раз.&amp;lt;br/&amp;gt;&lt;br /&gt;
Добавим сумму &amp;lt;tex&amp;gt;\sum \limits_{i}{N(i, 2)x^i}&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;x^n - \sum \limits_{i}{N(i, 1)x^i} + \sum \limits_{i}{N(i, 2)x^i} - \sum \limits_{i}{N(i, 3)x^i} + ...&amp;lt;/tex&amp;gt;&amp;lt;br&amp;gt;Так как &amp;lt;tex&amp;gt;N(n, 0) = 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P(G, x) = \sum \limits_{j=0}^{m}{\sum \limits_{i=1}^{n}{(-1)^jN(i, j)x^i}} = \sum \limits_{i=1}^{n}{\sum \limits_{j=0}^{m}{(-1)^jN(i, j)x^i}}&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;/div&gt;</summary>
		<author><name>System29a</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=14711</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=14711"/>
				<updated>2011-12-17T00:36:31Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &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; называется '''хроматическим многочленом'''. Обозначают &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;
&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;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Примечание. В некоторых источниках &amp;lt;tex&amp;gt;x^{\underline{n}}&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;x^{(n)}&amp;lt;/tex&amp;gt;. Это не очень удобно, так как легко спутать с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-ой производной.&lt;br /&gt;
&lt;br /&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;
{{Теорема&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;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;.&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; и &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;&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;. Тогда верны два следующих утверждения:&amp;lt;br /&amp;gt;&lt;br /&gt;
1. Граф &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;&lt;br /&gt;
2. В графе &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;&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;
|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;
|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;
== Литература ==&lt;br /&gt;
1. Асанов М. О., Баранский В. А., Расин В. В. - Дискретная математика: Графы, матроиды, алгоритмы: Учебное пособие. 2-е изд., испр. и доп. - СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. - 368 с.: ил. - (Учебники для вузов. Специальная литература). '''ISBN 978-5-8114-1068-2'''&amp;lt;br /&amp;gt;&lt;br /&gt;
2. Харари Ф. - Теория графов: Изд. 4-е. - М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. - 296 с. '''ISBN 978-5-397-00622-4'''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Раскраски графов]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=13746</id>
		<title>Обсуждение:Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=13746"/>
				<updated>2011-12-01T03:39:12Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: Новая страница: «~~~~ Вы уверены, что сложность алгоритма нахождения пути &amp;lt;tex&amp;gt;O(VE)&amp;lt;/tex&amp;gt;?»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Участник:System29a|System29a]] 06:39, 1 декабря 2011 (MSK)&lt;br /&gt;
Вы уверены, что сложность алгоритма нахождения пути &amp;lt;tex&amp;gt;O(VE)&amp;lt;/tex&amp;gt;?&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9924</id>
		<title>Сортирующие сети для квадратичных сортировок</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9924"/>
				<updated>2011-06-14T19:44:38Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
[[Файл:Bubblesort.png]]&lt;br /&gt;
&lt;br /&gt;
=== [[Сортировка вставками]] ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Insertsort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesort.png‎]]&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;
* Если сжать последовательные сортирующие сети пузырьком и вставками, то результат будет одним и тем же.&lt;br /&gt;
* В результирующей сети будет &amp;lt;tex&amp;gt;(2n - 3)&amp;lt;/tex&amp;gt; слоев.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Parralelsort.png‎]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesortparralel.png‎]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Дональд Э. Кнут. Искусство программирования. Том 3. Сортировка и Поиск.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9923</id>
		<title>Сортирующие сети для квадратичных сортировок</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9923"/>
				<updated>2011-06-14T19:43:34Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Сортировка вставками */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
[[Файл:Bubblesort.png]]&lt;br /&gt;
&lt;br /&gt;
=== [[Сортировка вставками]] ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Insertsort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesort.png‎]]&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;
* Если сжать последовательные сортирующие сети пузырьком и вставками, то результат будет одним и тем же.&lt;br /&gt;
* В результирующей сети будет &amp;lt;tex&amp;gt;(2n - 3)&amp;lt;/tex&amp;gt; слоев.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Parralelsort.png‎]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesortparralel.png‎]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Дональд Э. Кнут. Искусство программирования. Том 3. Сортировка и Поиск.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9922</id>
		<title>Сортирующие сети для квадратичных сортировок</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9922"/>
				<updated>2011-06-14T19:42:24Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Сортировка пузырьком */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
[[Файл:Bubblesort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка вставками ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Insertsort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesort.png‎]]&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;
* Если сжать последовательные сортирующие сети пузырьком и вставками, то результат будет одним и тем же.&lt;br /&gt;
* В результирующей сети будет &amp;lt;tex&amp;gt;(2n - 3)&amp;lt;/tex&amp;gt; слоев.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Parralelsort.png‎]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesortparralel.png‎]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Дональд Э. Кнут. Искусство программирования. Том 3. Сортировка и Поиск.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9921</id>
		<title>Сортирующие сети для квадратичных сортировок</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9921"/>
				<updated>2011-06-14T19:41:05Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
[[Файл:Bubblesort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка вставками ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Insertsort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesort.png‎]]&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;
* Если сжать последовательные сортирующие сети пузырьком и вставками, то результат будет одним и тем же.&lt;br /&gt;
* В результирующей сети будет &amp;lt;tex&amp;gt;(2n - 3)&amp;lt;/tex&amp;gt; слоев.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Parralelsort.png‎]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesortparralel.png‎]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Дональд Э. Кнут. Искусство программирования. Том 3. Сортировка и Поиск.&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=9910</id>
		<title>Дискретная математика и алгоритмы</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=9910"/>
				<updated>2011-06-14T17:44:34Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Сортирующие сети */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
*[[Транзитивное замыкание|Транзитивное замыкание отношения]]&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;
*[[Полином Жегалкина]]&lt;br /&gt;
*[[Теорема Поста о полной системе функций]]&lt;br /&gt;
*[[Сокращенная и минимальная ДНФ]]&lt;br /&gt;
*[[Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно]]&lt;br /&gt;
*[[Специальные формы КНФ|Специальные формы КНФ: КНФ в форме Хорна и КНФ в форме Крома]]&lt;br /&gt;
*[[Преобразование Мёбиуса для получения коэффициентов полинома Жегалкина]]&lt;br /&gt;
*[[Представление функции класса DM с помощью медианы]]&lt;br /&gt;
*[[Пороговая функция]]&lt;br /&gt;
&lt;br /&gt;
== Схемы из функциональных элементов ==&lt;br /&gt;
*[[Реализация булевой функции схемой из функциональных элементов]]&lt;br /&gt;
*[[Изменение размера оптимальной схемы при переходе к другому базису]]&lt;br /&gt;
*[[Cумматор]]&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;
*[[Представление символов, таблицы кодировок]]&lt;br /&gt;
*[[Алгоритм Хаффмана]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы сжатия ==&lt;br /&gt;
*[[Алгоритм LZW]]&lt;br /&gt;
*[[Алгоритмы LZ77 и LZ78]]&lt;br /&gt;
*[[Преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Обратное преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Преобразование MTF]]&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;
*[[Получение объекта по номеру]]&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;
*[[Матричное представление перестановок]]&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;
*[[Задача о перемножении матриц]]&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;
== Теория вероятности ==&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;
*[[Дисперсия случайной величины]]&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;
* [[Расчет вероятности поглощения в состоянии]]&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;
* [[Список]]&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;
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]&lt;br /&gt;
* [[Анализ реализации с ранговой эвристикой  | Анализ реализации с ранговой эвристикой]]&lt;br /&gt;
&lt;br /&gt;
== Деревья поиска ==&lt;br /&gt;
* [[Упорядоченное множество]]&lt;br /&gt;
* [[Дерево поиска, наивная реализация]]&lt;br /&gt;
* [[АВЛ-дерево]]&lt;br /&gt;
* [[2-3 дерево]]&lt;br /&gt;
* [[B-дерево]]&lt;br /&gt;
* [[Красно-черное дерево]]&lt;br /&gt;
* [[Декартово дерево]]&lt;br /&gt;
* [[Splay-дерево]]&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;
* [[Многомерное дерево отрезков]]&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;
* [[Различные алгоритмы хеширования]]&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;
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]&lt;br /&gt;
* [[Сортировка вставками]]&lt;br /&gt;
* [[Сортировка подсчетом]]&lt;br /&gt;
* [[Сортировка подсчетом сложных объектов]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики]]&lt;br /&gt;
* [[Поиск k-й порядковой статистики за линейное время]]&lt;br /&gt;
* [[Теорема о нижней оценке для сортировки сравнениями]]&lt;br /&gt;
&lt;br /&gt;
== [[Сортирующие сети]] ==&lt;br /&gt;
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]&lt;br /&gt;
* [[Сортирующие сети для квадратичных сортировок]]&lt;br /&gt;
* [[Сеть Бетчера]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы поиска ==&lt;br /&gt;
* [[Поиск с помощью золотого сечения]]&lt;br /&gt;
* [[Интерполяционный поиск]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC_%D0%BF%D0%BE_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D1%83_%D0%B7%D0%B0_2_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80&amp;diff=9674</id>
		<title>Обсуждение:Теоретический минимум по математическому анализу за 2 семестр</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC_%D0%BF%D0%BE_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D1%83_%D0%B7%D0%B0_2_%D1%81%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D1%80&amp;diff=9674"/>
				<updated>2011-06-12T02:48:22Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вопрос №7. Признак типа Абеля-Дирихле&lt;br /&gt;
&lt;br /&gt;
казалось бы, недостаточно, чтобы &amp;lt;tex&amp;gt;a_n(x)&amp;lt;/tex&amp;gt; стремилась к нулю, нужно еще чтобы она это делала монотонно&lt;br /&gt;
:fixed&lt;br /&gt;
&lt;br /&gt;
14, 15 вопрос, конечно, очень хотелось бы, что-бы запилили [[Участник:System29a|System29a]] 02:48, 12 июня 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9239</id>
		<title>Сортирующие сети для квадратичных сортировок</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=9239"/>
				<updated>2011-06-07T17:23:24Z</updated>
		
		<summary type="html">&lt;p&gt;System29a: /* Сортирующие сети с последовательной сортировкой */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
&lt;br /&gt;
[[Файл:Bubblesort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка вставками ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Insertsort.png]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesort.png‎]]&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;
* Если сжать последовательные сортирующие сети пузырьком и вставками, то результат будет одним и тем же.&lt;br /&gt;
* В результирующей сети будет &amp;lt;tex&amp;gt;(2n - 3)&amp;lt;/tex&amp;gt; слоев.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Parralelsort.png‎]]&lt;br /&gt;
&lt;br /&gt;
=== Сортировка выбором ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Choosesortparralel.png‎]]&lt;/div&gt;</summary>
		<author><name>System29a</name></author>	</entry>

	</feed>