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

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32655</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32655"/>
				<updated>2013-06-21T16:27:24Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&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;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_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;d_i - m + 1&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;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него тайм-слот, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, расписания не существует тогда и только тогда, когда&lt;br /&gt;
переполнился нулевой тайм-слот.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Расписания не существует, а значит, никакой алгоритм его не найдет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Введем понятие ''фронта'' расписания. ''Фронтом'' назовем вектор размеров тайм-слотов. Заметим, что от того, в каком порядке происходят перебрасывания из переполнившихся тайм-слотов, итоговый фронт не зависит. Поэтому, если мы сначала положим все работы в тайм-слоты, игнорируя ограничение на их размер, а потом в каком-то порядке перекинем, итоговый фронт окажется тем же. В случае, если при построении тайм-слотов игнорировалось ограничение на их размер, ни одну единицу работы нельзя назначить позже.&lt;br /&gt;
&lt;br /&gt;
Будем также рассматривать тайм-слоты без номеров работ: в каждом тайм-слоте просто лежит сколько-то единиц работ. От этого итоговый фронт также не изменится. Заметим, что если нельзя составить корректную в плане наполненности конфигурацию тайм-слотов при данном ослаблении, то нельзя это сделать и в случае существования номера у каждой единицы работы. Будем рассматривать тайм-слоты по убыванию времени с &amp;lt;tex&amp;gt;d_1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. В каждый момент времени будем хранить сколько работ ''необходимо'' перекинуть на более ранние тайм-слоты. Изначально это число равно нулю.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим очередной тайм-слот. Пусть в нем занято &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; ячеек из &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, а также есть еще &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; нераспределяемых позже единиц работы. Здесь возможны два случая:&lt;br /&gt;
* &amp;lt;tex&amp;gt;h +  a &amp;gt; m&amp;lt;/tex&amp;gt;. В этом случае, так как более &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; единиц работы сейчас выполнить нельзя, а также ничего нельзя назначить позже, то оказывается, что невыполняемых сейчас или позже работ стало &amp;lt;tex&amp;gt;h + a - m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;h + a &amp;lt;= m&amp;lt;/tex&amp;gt;. Здесь можно назначить все нераспределяемые позже работы на это время, и сбросить их счетчик.&lt;br /&gt;
&lt;br /&gt;
Так как и этот, и изучаемый алгоритм получают в итоге одинаковый фронт, а в этом мы вышли из нулевого времени, а невыполненные единицы работы остались, то так как распределить их никак невозможно, то не существует расписания, в котором бы выполнились все работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствовать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&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;k&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;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
&lt;br /&gt;
При помощи построения паросочетаний было построено расписание для тех &amp;lt;tex&amp;gt;k&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;O(t)&amp;lt;/tex&amp;gt; найдём переполнившийся тайм-слот и за &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; перекинем из него элемент. Так как &amp;lt;tex&amp;gt;t=O(nm)&amp;lt;/tex&amp;gt;, итоговая сложность этой части {{---}} &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достроение графа до регулярного делается за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} количество ребер в нем. Количество ребер в регулярном двудольном графе &amp;lt;tex&amp;gt;E = Vd&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} количество вершин в одной из долей, а &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} степень. Количество вершин в правой доле {{---}} &amp;lt;tex&amp;gt;O(t) = O(nm)&amp;lt;/tex&amp;gt;. Значит граф будет построен за &amp;lt;tex&amp;gt;O(nm^2)&amp;lt;/tex&amp;gt;, так как степень каждой вершины {{---}} &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность последней фазы зависит от того, каким алгоритмом граф разбивается на паросочетания. Использовав, например, алгоритм Куна, можно добиться сложности &amp;lt;tex&amp;gt;O(m \cdot M) = O(m \cdot n^3m^3)&amp;lt;/tex&amp;gt;. Итоговая сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(n^3m^4)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32654</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32654"/>
				<updated>2013-06-21T16:25:00Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Оценка сложности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&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;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_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;d_i - m + 1&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;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него тайм-слот, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, расписания не существует тогда и только тогда, когда&lt;br /&gt;
переполнился нулевой тайм-слот.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Расписания не существует, а значит, никакой алгоритм его не найдет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Введем понятие ''фронта'' расписания. ''Фронтом'' назовем вектор размеров тайм-слотов. Заметим, что от того, в каком порядке происходят перебрасывания из переполнившихся тайм-слотов, итоговый фронт не зависит. Поэтому, если мы сначала положим все работы в тайм-слоты, игнорируя ограничение на их размер, а потом в каком-то порядке перекинем, итоговый фронт окажется тем же. В случае, если при построении тайм-слотов игнорировалось ограничение на их размер, ни одну единицу работы нельзя назначить позже.&lt;br /&gt;
&lt;br /&gt;
Будем также рассматривать тайм-слоты без номеров работ: в каждом тайм-слоте просто лежит сколько-то единиц работ. От этого итоговый фронт также не изменится. Заметим, что если нельзя составить корректную в плане наполненности конфигурацию тайм-слотов при данном ослаблении, то нельзя это сделать и в случае существования номера у каждой единицы работы. Будем рассматривать тайм-слоты по убыванию времени с &amp;lt;tex&amp;gt;d_1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. В каждый момент времени будем хранить сколько работ ''необходимо'' перекинуть на более ранние тайм-слоты. Изначально это число равно нулю.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим очередной тайм-слот. Пусть в нем занято &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; ячеек из &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, а также есть еще &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; нераспределяемых позже единиц работы. Здесь возможны два случая:&lt;br /&gt;
* &amp;lt;tex&amp;gt;h +  a &amp;gt; m&amp;lt;/tex&amp;gt;. В этом случае, так как более &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; единиц работы сейчас выполнить нельзя, а также ничего нельзя назначить позже, то оказывается, что невыполняемых сейчас или позже работ стало &amp;lt;tex&amp;gt;h + a - m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;h + a &amp;lt;= m&amp;lt;/tex&amp;gt;. Здесь можно назначить все нераспределяемые позже работы на это время, и сбросить их счетчик.&lt;br /&gt;
&lt;br /&gt;
Так как и этот, и изучаемый алгоритм получают в итоге одинаковый фронт, а в этом мы вышли из нулевого времени, а невыполненные единицы работы остались, то так как распределить их никак невозможно, то не существует расписания, в котором бы выполнились все работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствовать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&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;k&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;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
&lt;br /&gt;
При помощи построения паросочетаний было построено расписание для тех &amp;lt;tex&amp;gt;k&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;O(t)&amp;lt;/tex&amp;gt; найдём переполнившийся тайм-слот и за &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; перекинем из него элемент. Так как &amp;lt;tex&amp;gt;t=O(nm)&amp;lt;/tex&amp;gt;, итоговая сложность этой части {{---}} &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достроение графа до регулярного делается за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} количество ребер в нем. Количество ребер в регулярном двудольном графе &amp;lt;tex&amp;gt;E = Vd&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} количество вершин в одной из долей, а &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} степень. Количество вершин в правой доле {{---}} &amp;lt;tex&amp;gt;O(t) = O(nm)&amp;lt;/tex&amp;gt;. Значит граф будет построен за &amp;lt;tex&amp;gt;O(nm^2)&amp;lt;/tex&amp;gt;, так как степень каждой вершины {{---}} &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность последней фазы зависит от того, каким алгоритмом граф разбивается на паросочетания. Использовав, например, алгоритм Куна, можно добиться сложности &amp;lt;tex&amp;gt;O(m \cdot M) = O(m \cdot n^3m^3)&amp;lt;/tex&amp;gt;. Итоговая сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(n^3m^4)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32653</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32653"/>
				<updated>2013-06-21T16:21:56Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&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;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_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;d_i - m + 1&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;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него тайм-слот, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, расписания не существует тогда и только тогда, когда&lt;br /&gt;
переполнился нулевой тайм-слот.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Расписания не существует, а значит, никакой алгоритм его не найдет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Введем понятие ''фронта'' расписания. ''Фронтом'' назовем вектор размеров тайм-слотов. Заметим, что от того, в каком порядке происходят перебрасывания из переполнившихся тайм-слотов, итоговый фронт не зависит. Поэтому, если мы сначала положим все работы в тайм-слоты, игнорируя ограничение на их размер, а потом в каком-то порядке перекинем, итоговый фронт окажется тем же. В случае, если при построении тайм-слотов игнорировалось ограничение на их размер, ни одну единицу работы нельзя назначить позже.&lt;br /&gt;
&lt;br /&gt;
Будем также рассматривать тайм-слоты без номеров работ: в каждом тайм-слоте просто лежит сколько-то единиц работ. От этого итоговый фронт также не изменится. Заметим, что если нельзя составить корректную в плане наполненности конфигурацию тайм-слотов при данном ослаблении, то нельзя это сделать и в случае существования номера у каждой единицы работы. Будем рассматривать тайм-слоты по убыванию времени с &amp;lt;tex&amp;gt;d_1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. В каждый момент времени будем хранить сколько работ ''необходимо'' перекинуть на более ранние тайм-слоты. Изначально это число равно нулю.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим очередной тайм-слот. Пусть в нем занято &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; ячеек из &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, а также есть еще &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; нераспределяемых позже единиц работы. Здесь возможны два случая:&lt;br /&gt;
* &amp;lt;tex&amp;gt;h +  a &amp;gt; m&amp;lt;/tex&amp;gt;. В этом случае, так как более &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; единиц работы сейчас выполнить нельзя, а также ничего нельзя назначить позже, то оказывается, что невыполняемых сейчас или позже работ стало &amp;lt;tex&amp;gt;h + a - m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;h + a &amp;lt;= m&amp;lt;/tex&amp;gt;. Здесь можно назначить все нераспределяемые позже работы на это время, и сбросить их счетчик.&lt;br /&gt;
&lt;br /&gt;
Так как и этот, и изучаемый алгоритм получают в итоге одинаковый фронт, а в этом мы вышли из нулевого времени, а невыполненные единицы работы остались, то так как распределить их никак невозможно, то не существует расписания, в котором бы выполнились все работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствовать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&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;k&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;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
&lt;br /&gt;
При помощи построения паросочетаний было построено расписание для тех &amp;lt;tex&amp;gt;k&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;O(t)&amp;lt;/tex&amp;gt; найдём переполнившийся тайм-слот и за &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; перекинем из него элемент. Так как &amp;lt;tex&amp;gt;t=O(nm)&amp;lt;/tex&amp;gt;, итоговая сложность этой части {{---}} &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достроение графа до регулярного делается за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} количество ребер в нем. Количество ребер в регулярном двудольном графе &amp;lt;tex&amp;gt;E = Vd&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} количество вершин в одной из долей, а &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} степень. Количество вершин в правой доле {{---}} &amp;lt;tex&amp;gt;O(t) = O(nm)&amp;lt;/tex&amp;gt;. Значит, граф будет построен за &amp;lt;tex&amp;gt;O(nm^2)&amp;lt;/tex&amp;gt;, так как степень каждой вершины {{---}} &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность последней фазы зависит от того, каким алгоритмом граф разбивается на паросочетания. Использовав, например, алгоритм Куна, можно добиться сложности &amp;lt;tex&amp;gt;O(m \cdot M) = O(m \cdot n^3m^3)&amp;lt;/tex&amp;gt;. Итоговая сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(n^3m^4)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32652</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32652"/>
				<updated>2013-06-21T16:19:15Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&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;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_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;d_i - m + 1&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;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него тайм-слот, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то, по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, расписания не существует тогда и только тогда, когда&lt;br /&gt;
переполнился нулевой тайм-слот.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Расписания не существует, а значит, никакой алгоритм его не найдет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Введем понятие ''фронта'' расписания. ''Фронтом'' назовем вектор размеров тайм-слотов. Заметим, что от того, в каком порядке происходят перебрасывания из переполнившихся тайм-слотов, итоговый фронт не зависит. Поэтому, если мы сначала положим все работы в тайм-слоты, игнорируя ограничение на их размер, а потом в каком-то порядке перекинем, итоговый фронт окажется тем же. В случае, если при построении тайм-слотов игнорировалось ограничение на их размер, ни одну единицу работы нельзя назначить позже.&lt;br /&gt;
&lt;br /&gt;
Будем также рассматривать тайм-слоты без номеров работ: в каждом тайм-слоте просто лежит сколько-то единиц работ. От этого итоговый фронт также не изменится. Заметим, что если нельзя составить корректную в плане наполненности конфигурацию тайм-слотов при данном ослаблении, то нельзя это сделать и в случае существования номера у каждой единицы работы. Будем рассматривать тайм-слоты по убыванию времени с &amp;lt;tex&amp;gt;d_1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. В каждый момент времени будем хранить сколько работ ''необходимо'' перекинуть на более ранние тайм-слоты. Изначально это число равно нулю.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим очередной тайм-слот. Пусть в нем занято &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; ячеек из &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, а также есть еще &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; нераспределяемых позже единиц работы. Здесь возможны два случая:&lt;br /&gt;
* &amp;lt;tex&amp;gt;h +  a &amp;gt; m&amp;lt;/tex&amp;gt;. В этом случае, так как более &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; единиц работы сейчас выполнить нельзя, а также ничего нельзя назначить позже, то оказывается, что невыполняемых сейчас или позже работ стало &amp;lt;tex&amp;gt;h + a - m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;h + a &amp;lt;= m&amp;lt;/tex&amp;gt;. Здесь можно назначить все нераспределяемые позже работы на это время, и сбросить их счетчик.&lt;br /&gt;
&lt;br /&gt;
Так как и этот, и изучаемый алгоритм получают в итоге одинаковый фронт, а в этом мы вышли из нулевого времени, а невыполненные единицы работы остались, то, так как распределить их никак невозможно, то не существует расписания, в котором бы выполнились все работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствовать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&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;k&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;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
&lt;br /&gt;
При помощи построения паросочетаний было построено расписание для тех &amp;lt;tex&amp;gt;k&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;O(t)&amp;lt;/tex&amp;gt; найдём переполнившийся тайм-слот и за &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; перекинем из него элемент. Так как &amp;lt;tex&amp;gt;t=O(nm)&amp;lt;/tex&amp;gt;, итоговая сложность этой части {{---}} &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достроение графа до регулярного делается за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} количество ребер в нем. Количество ребер в регулярном двудольном графе &amp;lt;tex&amp;gt;E = Vd&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} количество вершин в одной из долей, а &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} степень. Количество вершин в правой доле {{---}} &amp;lt;tex&amp;gt;O(t) = O(nm)&amp;lt;/tex&amp;gt;. Значит, граф будет построен за &amp;lt;tex&amp;gt;O(nm^2)&amp;lt;/tex&amp;gt;, так как степень каждой вершины {{---}} &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность последней фазы зависит от того, каким алгоритмом граф разбивается на паросочетания. Использовав, например, алгоритм Куна, можно добиться сложности &amp;lt;tex&amp;gt;O(m \cdot M) = O(m \cdot n^3m^3)&amp;lt;/tex&amp;gt;. Итоговая сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(n^3m^4)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32651</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=32651"/>
				<updated>2013-06-21T16:15:14Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&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;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_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;d_i - m + 1&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;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него тайм-слот, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то, по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, расписания не существует тогда и только тогда, когда&lt;br /&gt;
переполнился нулевой тайм-слот.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Расписания не существует, а значит, никакой алгоритм его не найдет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&lt;br /&gt;
Введем понятие ''фронта'' расписания. ''Фронтом'' назовем вектор размеров тайм-слотов. Заметим, что от того, в каком порядке происходят перебрасывания из переполнившихся тайм-слотов, итоговый фронт не зависит. Поэтому, если мы сначала положим все работы в тайм-слоты, игнорируя ограничение на их размер, а потом в каком-то порядке перекинем, итоговый фронт окажется тем же. В случае, если при построении тайм-слотов игнорировалось ограничение на их размер, ни одну единицу работы нельзя назначить позже.&lt;br /&gt;
&lt;br /&gt;
Будем также рассматривать тайм-слоты без номеров работ: в каждом тайм-слоте просто лежит сколько-то единиц работ. От этого итоговый фронт также не изменится. Заметим, что если нельзя составить корректную в плане наполненности конфигурацию тайм-слотов при данном ослаблении, то нельзя это сделать и в случае существования номера у каждой единицы работы. Будем рассматривать тайм-слоты по убыванию времени с &amp;lt;tex&amp;gt;d_1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. В каждый момент времени будем хранить сколько работ ''необходимо'' перекинуть на более ранние тайм-слоты. Изначально это число равно нулю.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим очередной тайм-слот. Пусть в нем занято &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; ячеек из &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, а также, есть еще &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; нераспределяемых позже единиц работы. Здесь возможны два случая:&lt;br /&gt;
* &amp;lt;tex&amp;gt;h +  a &amp;gt; m&amp;lt;/tex&amp;gt;. В этом случае, так как более &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; единиц работы сейчас выполнить нельзя, а также, ничего нельзя назначить позже, то оказывается, что невыполняемых сейчас или позже работ стало &amp;lt;tex&amp;gt;h + a - m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если &amp;lt;tex&amp;gt;h + a &amp;lt;= m&amp;lt;/tex&amp;gt;. Здесь можно назначить все нераспределяемые позже работы на это время, и сбросить их счетчик.&lt;br /&gt;
&lt;br /&gt;
Так как и этот, и изучаемый алгоритм получают в итоге одинаковый фронт, а в этом мы вышли из нулевого времени, а невыполненные единицы работы остались, то, так как распределить их никак невозможно, то не существует расписания, в котором бы выполнились все работы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствовать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&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;k&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;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
&lt;br /&gt;
При помощи построения паросочетаний было построено расписание для тех &amp;lt;tex&amp;gt;k&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;O(t)&amp;lt;/tex&amp;gt; найдём переполнившийся тайм-слот и за &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt; перекинем из него элемент. Так как &amp;lt;tex&amp;gt;t=O(nm)&amp;lt;/tex&amp;gt;, итоговая сложность этой части {{---}} &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достроение графа до регулярного делается за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; {{---}} количество ребер в нем. Количество ребер в регулярном двудольном графе &amp;lt;tex&amp;gt;E = Vd&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} количество вершин в одной из долей, а &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} степень. Количество вершин в правой доле {{---}} &amp;lt;tex&amp;gt;O(t) = O(nm)&amp;lt;/tex&amp;gt;. Значит, граф будет построен за &amp;lt;tex&amp;gt;O(nm^2)&amp;lt;/tex&amp;gt;, так как степень каждой вершины {{---}} &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность последней фазы зависит от того, каким алгоритмом граф разбивается на паросочетания. Использовав, например, алгоритм Куна, можно добиться сложности &amp;lt;tex&amp;gt;O(m \cdot M) = O(m \cdot n^3m^3)&amp;lt;/tex&amp;gt;. Итоговая сложность алгоритма {{---}} &amp;lt;tex&amp;gt;O(n^3m^4)&amp;lt;/tex&amp;gt;.&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=32650</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=32650"/>
				<updated>2013-06-21T16:10:00Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; \varnothing&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;
Для доказательство того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.12 &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;Y = (A(t), B(t))&amp;lt;/tex&amp;gt; — расписание, где &amp;lt;tex&amp;gt;B(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(t) = \emptyset)&amp;lt;/tex&amp;gt;. Тогда для каждого &amp;lt;tex&amp;gt;s &amp;gt; t&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B(s) = O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(s) = O_{ij})&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;A(s -1) = O_{i, j - 1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(s - 1) = O_{i, j -1}))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.13. &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; — операция, которую планируют строчкой (*) или (**) и &amp;lt;tex&amp;gt;t = LAST(i) &amp;gt; T1(T2)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;A(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(t) = \emptyset)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.14 &lt;br /&gt;
|statement=Если существует расписание без опозданий, то данный алгоритм построит расписание без опозданий.&lt;br /&gt;
|proof={{в разработке}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.15. &lt;br /&gt;
|statement=Расписание, построенное данным алгоритмом, оптимально.&lt;br /&gt;
|proof={{в разработке}}&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>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=32649</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=32649"/>
				<updated>2013-06-21T16:08:03Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; \varnothing&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;
Для доказательство того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.12 &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;Y = (A(t), B(t))&amp;lt;/tex&amp;gt; — расписание, где &amp;lt;tex&amp;gt;B(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(t) = \emptyset)&amp;lt;/tex&amp;gt;. Тогда для каждого &amp;lt;tex&amp;gt;s &amp;gt; t&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B(s) = O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(s) = O_{ij})&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;A(s -1) = O_{i, j - 1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(s - 1) = O_{i, j -1}))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.13. &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; — операция, которую планируют строчкой (*) или (**) и &amp;lt;tex&amp;gt;t = LAST(i) &amp;gt; T1(T2)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;A(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(t) = \emptyset)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.14 &lt;br /&gt;
|statement=Если существует расписание без опозданий, то данный алгоритм построит расписание без опозданий.&lt;br /&gt;
|proof={{в разработке}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.15. &lt;br /&gt;
|statement=Расписание, построенное данным алгоритмом, оптимально.&lt;br /&gt;
|proof={{в разработке}}&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>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=32648</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=32648"/>
				<updated>2013-06-21T16:05:33Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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; \varnothing&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;
Для доказательство того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.12 &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;Y = (A(t), B(t))&amp;lt;/tex&amp;gt; — расписание, где &amp;lt;tex&amp;gt;B(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(t) = \emptyset)&amp;lt;/tex&amp;gt;. Тогда для каждого &amp;lt;tex&amp;gt;s &amp;gt; t&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B(s) = O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(s) = O_{ij})&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;A(s -1) = O_{i, j - 1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(s - 1) = O_{i, j -1}))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.13. &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; — операция, которую планируют строчкой (*) или (**) и &amp;lt;tex&amp;gt;t = LAST(i) &amp;gt; T1(T2)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;A(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(t) = \emptyset)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.14 &lt;br /&gt;
|statement=Если существует расписание без опозданий, то данный алгоритм построит расписание без опозданий.&lt;br /&gt;
|proof={{в разработке}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.15. &lt;br /&gt;
|statement=Расписание, построенное данным алгоритмом, оптимально.&lt;br /&gt;
|proof={{в разработке}}&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>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32615</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32615"/>
				<updated>2013-06-18T17:18:25Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало списка &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим список &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот список является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]]&lt;br /&gt;
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. &lt;br /&gt;
&lt;br /&gt;
Пусть его длина равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k &amp;lt; n &amp;lt;/tex&amp;gt;. Пусть на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; позиции на первом и втором станках стоит работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а на втором станке на позиции &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; стоит работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Тогда заметим, что если мы поставим работу &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на первом станке сразу после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то последовательные работы с &amp;lt;tex&amp;gt; h &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписании после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом список является отпимальной перестановкой работ. &lt;br /&gt;
&lt;br /&gt;
{{лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких-то работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в списке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеем произвольное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшения целевой функции. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 2 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 2)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим произвольную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32612</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32612"/>
				<updated>2013-06-18T17:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало списка &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим список &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот список является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]]&lt;br /&gt;
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. &lt;br /&gt;
&lt;br /&gt;
Пусть его длина равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k &amp;lt; n &amp;lt;/tex&amp;gt;. Пусть на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; позиции на первом и втором станках стоит работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а на втором станке на позиции &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; стоит работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Тогда заметим, что если мы поставим работу &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на первом станке сразу после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то последовательные работы с &amp;lt;tex&amp;gt; h &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписании после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом список является отпимальной перестановкой работ. &lt;br /&gt;
&lt;br /&gt;
{{лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в списке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функции. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 2 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 2)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим произвольную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32611</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32611"/>
				<updated>2013-06-18T16:55:35Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало списка &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим список &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот список является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]]&lt;br /&gt;
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. &lt;br /&gt;
&lt;br /&gt;
Пусть его длина равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k &amp;lt; n &amp;lt;/tex&amp;gt;. Пусть на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; позиций на первом и втором станках стоит работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а на втором станке на позиций &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; стоит работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Тогда заметим, что если мы поставим работу &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на первом станке сразу после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то последовательные работы с &amp;lt;tex&amp;gt; h &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписаний после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом список является отпимальной перестановкой работ. &lt;br /&gt;
&lt;br /&gt;
{{лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в списке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 2 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 2)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32541</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32541"/>
				<updated>2013-06-16T16:53:06Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]]&lt;br /&gt;
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. &lt;br /&gt;
&lt;br /&gt;
Пусть его длина равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k &amp;lt; n &amp;lt;/tex&amp;gt;. Пусть на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; позиций на первом и втором станках стоит работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а на втором станке на позиций &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; стоит работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Тогда заметим, что если мы поставим работу &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на первом станке сразу после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то последовательные работы с &amp;lt;tex&amp;gt; h &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписаний после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 2 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 2)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32540</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32540"/>
				<updated>2013-06-16T16:51:48Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]]&lt;br /&gt;
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. &lt;br /&gt;
&lt;br /&gt;
Пусть его длина равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k &amp;lt; n &amp;lt;/tex&amp;gt;. Пусть на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; позиций на первом и втором станках стоит работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а на втором станке на позиций &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; стоит работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Тогда заметим, что если мы поставим работу &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на первом станке сразу после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то последовательные работы с &amp;lt;tex&amp;gt; h &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписаний после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Таким образом нам удалось увеличить длину наибольщего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 2 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 2)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32539</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32539"/>
				<updated>2013-06-16T16:50:54Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]]&lt;br /&gt;
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. &lt;br /&gt;
&lt;br /&gt;
Пусть его длина равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k &amp;lt; n &amp;lt;/tex&amp;gt;. Пусть на &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; позиций на первом и втором станках стоит работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а на втором станке на позиций &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; стоит работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Тогда заметим, что если мы поставим работу &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на первом станке сразу после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то работы &amp;lt;tex&amp;gt; h &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписаний после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;. Таким образом нам удалось увеличить длину наибольщего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 2 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 2)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax_first_fixed.png&amp;diff=32538</id>
		<title>Файл:F2cmax first fixed.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax_first_fixed.png&amp;diff=32538"/>
				<updated>2013-06-16T16:44:34Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax_first.png&amp;diff=32537</id>
		<title>Файл:F2cmax first.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax_first.png&amp;diff=32537"/>
				<updated>2013-06-16T16:39:26Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32536</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=32536"/>
				<updated>2013-06-16T16:12:06Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Таким образом задача сводится к поиску этой искомой перестановки.  Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 1 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 1)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31760</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31760"/>
				<updated>2013-06-11T11:10:43Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax_fixed.png|400px|thumb|right|Рис. 1 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 1)&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; начинается на втором станке сразу же после завершения ее на первом&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; не может  начаться на втором станке сразу же после завершения ее на первом &lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&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; delta &amp;lt;/tex&amp;gt; {{---}} время прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt; на первом станке и до начала ее выполнения на втором станке. Тогда имеем, что &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax_fixed.png&amp;diff=31759</id>
		<title>Файл:F2cmax fixed.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax_fixed.png&amp;diff=31759"/>
				<updated>2013-06-11T10:58:25Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31758</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31758"/>
				<updated>2013-06-11T10:50:35Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:f2cmax.png|400px|thumb|right|Рис. 1 - Расположение последовательных работ]]&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим возможные случаи расположения работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (см. Рис. 1):&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В этом случае &amp;lt;tex&amp;gt; w_{ij} = p_{i1} + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В этом случае &amp;lt;tex&amp;gt; w_{ij} = p_{i1} + p_{j1} + p_{j2}  &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В этом случае &amp;lt;tex&amp;gt; w_{ij} = p_{i1} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;В этом случае &amp;lt;tex&amp;gt; w_{ij} = delta + p_{i2} + p_{j2} &amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax.png&amp;diff=31757</id>
		<title>Файл:F2cmax.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:F2cmax.png&amp;diff=31757"/>
				<updated>2013-06-11T10:43:31Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31626</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31626"/>
				<updated>2013-06-10T17:59:09Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31625</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31625"/>
				<updated>2013-06-10T17:58:09Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31619</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31619"/>
				<updated>2013-06-10T17:39:55Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31618</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31618"/>
				<updated>2013-06-10T17:26:34Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
TODO&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; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим случайную перестановку &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Пусть перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &amp;lt;tex&amp;gt; k &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; S &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; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &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; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31599</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31599"/>
				<updated>2013-06-10T16:51:46Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31598</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31598"/>
				<updated>2013-06-10T16:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31594</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31594"/>
				<updated>2013-06-10T16:44:55Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &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; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &amp;lt;/tex&amp;gt;. Заметим, что в обоих случаях она расположена позже( в силу нашего построения), чем работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то лемма доказана.   &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31584</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31584"/>
				<updated>2013-06-10T16:10:40Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; раз, следовательно алгоритм работает за &amp;lt;tex&amp;gt;O(n\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31580</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31580"/>
				<updated>2013-06-10T15:57:44Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31567</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31567"/>
				<updated>2013-06-10T15:38:56Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&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;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31564</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31564"/>
				<updated>2013-06-10T15:32:17Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&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_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то допишем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе дописываем в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L + R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&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;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31556</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31556"/>
				<updated>2013-06-10T15:03:44Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Постановка задачи */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&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;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31554</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31554"/>
				<updated>2013-06-10T14:56:22Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: Новая страница: «== Постановка задачи ==  == Описание алгоритма ==  ==Доказательство корректности алгоритма==  ...»&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;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>GR1n</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=31553</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=31553"/>
				<updated>2013-06-10T14:52:00Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: /* Теория расписаний */&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;
*[[Meet-in-the-middle]]&lt;br /&gt;
*[[Динамическое программирование по профилю]]&lt;br /&gt;
*[[Задача о рюкзаке]]&lt;br /&gt;
*[[Динамика по поддеревьям]]&lt;br /&gt;
&lt;br /&gt;
== Теория вероятностей ==&lt;br /&gt;
*[[Вероятностное пространство, элементарный исход, событие]]&lt;br /&gt;
*[[Независимые события]]&lt;br /&gt;
*[[Условная вероятность]]&lt;br /&gt;
*[[Формула Байеса]]&lt;br /&gt;
*[[Формула полной вероятности]]&lt;br /&gt;
*[[Дискретная случайная величина]]&lt;br /&gt;
*[[Независимые случайные величины]]&lt;br /&gt;
*[[Математическое ожидание случайной величины]]&lt;br /&gt;
*[[Дисперсия случайной величины]]&lt;br /&gt;
*[[Ковариация случайных величин]]&lt;br /&gt;
*[[Корреляция случайных величин]]&lt;br /&gt;
*[[Энтропия случайного источника]]&lt;br /&gt;
*[[Симуляция одним распределением другого]]&lt;br /&gt;
*[[Арифметическое кодирование]]&lt;br /&gt;
*[[Парадоксы теории вероятностей]]&lt;br /&gt;
*[[Схема Бернулли]]&lt;br /&gt;
&lt;br /&gt;
== Марковские цепи ==&lt;br /&gt;
&lt;br /&gt;
* [[Марковская цепь]]&lt;br /&gt;
* [[Теорема о поглощении]]&lt;br /&gt;
* [[Фундаментальная матрица]]&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;quot;Вперед-Назад&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
= Второй семестр =&lt;br /&gt;
&lt;br /&gt;
== Амортизационный анализ ==&lt;br /&gt;
* [[Амортизационный анализ]]&lt;br /&gt;
* [[Саморасширяющийся массив]]&lt;br /&gt;
* [[Массив с увеличением/уменьшением размера]]&lt;br /&gt;
* [[Список]]&lt;br /&gt;
* [[Стек]]&lt;br /&gt;
* [[Очередь]]&lt;br /&gt;
* [[Персистентный стек]]&lt;br /&gt;
* [[Персистентная очередь]]&lt;br /&gt;
* [[Персистентный дек]]&lt;br /&gt;
* [[Мажорирующий элемент]]&lt;br /&gt;
* [[Счетчик Кнута]]&lt;br /&gt;
&lt;br /&gt;
== Приоритетные очереди ==&lt;br /&gt;
&lt;br /&gt;
* [[Двоичная куча]]&lt;br /&gt;
* [[Биномиальная куча]]&lt;br /&gt;
* [[Фибоначчиева куча]]&lt;br /&gt;
* [[Левосторонняя куча]]&lt;br /&gt;
* [[Тонкая куча]]&lt;br /&gt;
* [[Толстая куча]]&lt;br /&gt;
* [[Куча Бродала-Окасаки]]&lt;br /&gt;
&lt;br /&gt;
== Система непересекающихся множеств ==&lt;br /&gt;
* [[СНМ (наивные реализации) | Наивные реализации]]&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;
* [[Fusion tree]]&lt;br /&gt;
* [[Сверхбыстрый цифровой бор]]&lt;br /&gt;
&lt;br /&gt;
== Дерево отрезков ==&lt;br /&gt;
&lt;br /&gt;
* [[Статистики на отрезках. Корневая эвристика]]&lt;br /&gt;
* [[Дерево отрезков. Построение]]&lt;br /&gt;
* [[Реализация запроса в дереве отрезков сверху]]&lt;br /&gt;
* [[Реализация запроса в дереве отрезков снизу]]&lt;br /&gt;
* [[Несогласованные поддеревья. Реализация массового обновления]]&lt;br /&gt;
* [[Многомерное дерево отрезков]]&lt;br /&gt;
* [[Сжатое многомерное дерево отрезков]]&lt;br /&gt;
&lt;br /&gt;
== Дерево Фенвика ==&lt;br /&gt;
* [[Дерево Фенвика]]&lt;br /&gt;
* [[Встречное дерево Фенвика]]&lt;br /&gt;
* [[Дерево Фенвика для некоммутативных операций]]&lt;br /&gt;
* [[Многомерное дерево Фенвика]]&lt;br /&gt;
&lt;br /&gt;
== Хеширование ==&lt;br /&gt;
* [[Хеш-таблица]]&lt;br /&gt;
* [[Разрешение коллизий]]&lt;br /&gt;
* [[Хеширование кукушки]]&lt;br /&gt;
* [[Идеальное хеширование]]&lt;br /&gt;
* [[Перехеширование. Амортизационный анализ]]&lt;br /&gt;
* [[Фильтр Блума]]&lt;br /&gt;
* [[Универсальное семейство хеш-функций]]&lt;br /&gt;
&lt;br /&gt;
== [[Сортировка]] ==&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;
* [[Timsort]]&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;
* [[Граф блоков-точек сочленения]]&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;
* [[Алгоритм Дейкстры]]&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;
* [[Алгоритм &amp;quot;поднять-в-начало&amp;quot;]]&lt;br /&gt;
* [[Теорема о декомпозиции]]&lt;br /&gt;
* [[Теорема о декомпозиционном барьере]]&lt;br /&gt;
* [[Циркуляция потока]]&lt;br /&gt;
* [[Алгоритм Каргера для нахождения минимального разреза]]&lt;br /&gt;
&lt;br /&gt;
== Задача о потоке минимальной стоимости ==&lt;br /&gt;
* [[Поток минимальной стоимости]]&lt;br /&gt;
* [[Теорема Форда-Фалкерсона о потоке минимальной стоимости]]&lt;br /&gt;
* [[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]&lt;br /&gt;
* [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]&lt;br /&gt;
* [[Использование потенциалов Джонсона при поиске потока минимальной стоимости]]&lt;br /&gt;
* [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]&lt;br /&gt;
* [[Венгерский алгоритм решения задачи о назначениях]]&lt;br /&gt;
&lt;br /&gt;
= Четвертый семестр =&lt;br /&gt;
&lt;br /&gt;
== Основные определения. Простые комбинаторные свойства слов ==&lt;br /&gt;
* [[Основные определения, связанные со строками]]&lt;br /&gt;
* [[Период и бордер, их связь]]&lt;br /&gt;
* [[Слово Фибоначчи]]&lt;br /&gt;
* [[Слово Туэ-Морса]]&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;
* [[F2Cmax|&amp;lt;tex&amp;gt;F2 \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;br /&gt;
* [[P1sumu|&amp;lt;tex&amp;gt;1 \mid \mid \sum U_{i}&amp;lt;/tex&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11848</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11848"/>
				<updated>2011-10-25T00:45:46Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A_1| &amp;lt;/tex&amp;gt; {{---}} истинно).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} объединение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;  B \cap A_n  = \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n =  \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right)      (**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предположение индукции и равенство &amp;lt;tex&amp;gt; (**) &amp;lt;/tex&amp;gt; имеем, что  &amp;lt;tex&amp;gt; |B \cap A_n|  = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; =| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt; =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно и &amp;lt;tex&amp;gt;|A| =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11847</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11847"/>
				<updated>2011-10-25T00:43:46Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A_1| &amp;lt;/tex&amp;gt; {{---}} истинно).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} объединение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;  B \cap A_n  = \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n =  \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right)      (**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предположение индукции и равенство &amp;lt;tex&amp;gt; (**) &amp;lt;/tex&amp;gt; имеем, что  &amp;lt;tex&amp;gt; |B \cap A_n|  = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt; =\!  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно и &amp;lt;tex&amp;gt;|A| =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11846</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11846"/>
				<updated>2011-10-25T00:41:06Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A_1| &amp;lt;/tex&amp;gt; {{---}} истинно).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} объединение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;  B \cap A_n  = \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n =  \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right)      (**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предположение индукции и равенство &amp;lt;tex&amp;gt; (**) &amp;lt;/tex&amp;gt; имеем, что  &amp;lt;tex&amp;gt; |B \cap A_n|  = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt; =\!  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно и &amp;lt;tex&amp;gt;|A| =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11845</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11845"/>
				<updated>2011-10-25T00:17:57Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} объединение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;  B \cap A_n  = \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n =  \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right)      (**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предположение индукции и равенство &amp;lt;tex&amp;gt; (**) &amp;lt;/tex&amp;gt; имеем, что  &amp;lt;tex&amp;gt; |B \cap A_n|  = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt; =\!  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно и &amp;lt;tex&amp;gt;|A| =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11844</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11844"/>
				<updated>2011-10-25T00:16:58Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;  B \cap A_n  = \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n =  \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right)      (**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предположение индукции и равенство &amp;lt;tex&amp;gt; (**) &amp;lt;/tex&amp;gt; имеем, что  &amp;lt;tex&amp;gt; |B \cap A_n|  = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt; =\!  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно и &amp;lt;tex&amp;gt;|A| =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11842</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11842"/>
				<updated>2011-10-24T23:49:52Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
 &amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt; =\!  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно и &amp;lt;tex&amp;gt;|A| =  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11834</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11834"/>
				<updated>2011-10-24T23:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n | (*)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
= &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11832</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11832"/>
				<updated>2011-10-24T23:31:10Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
= &amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;  \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11831</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11831"/>
				<updated>2011-10-24T23:27:46Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11830</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11830"/>
				<updated>2011-10-24T23:27:07Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на две группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11829</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11829"/>
				<updated>2011-10-24T23:26:50Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на три группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, первое и третье слагаемое &amp;quot;отвечают&amp;quot; за вторую группу, а второе слагаемое за первую группу. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11828</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11828"/>
				<updated>2011-10-24T23:24:45Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на три группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\{n\} \cup I&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;I \in N'&amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, каждое слагаемое &amp;quot;отвечает&amp;quot; за соответствующие группы. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11827</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11827"/>
				<updated>2011-10-24T23:13:42Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значения в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на три группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} \cup I \in 2^{N'}  &amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, каждое слагаемое &amp;quot;отвечает&amp;quot; за соответствующие группы. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11826</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11826"/>
				<updated>2011-10-24T23:11:46Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значение в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на три группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} \cup I \in 2^{N'}  &amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, каждое слагаемое &amp;quot;отвечает&amp;quot; за соответствующие группы. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11825</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%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=11825"/>
				<updated>2011-10-24T23:10:38Z</updated>
		
		<summary type="html">&lt;p&gt;GR1n: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формула включения–исключения''' {{---}} это комбинаторная формула, которая позволяет определить мощность объединения конечных множеств, если известны их мощности и мощности всех их возможных пересечений.&lt;br /&gt;
&lt;br /&gt;
[[Файл:пересечение двух множеств.svg.png|thumb|right|Случай для двух множеств]]&lt;br /&gt;
&lt;br /&gt;
Например, в случае двух множеств &amp;lt;tex&amp;gt;~A, B&amp;lt;/tex&amp;gt; формула включения{{---}}исключения имеет вид:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt; | A \cup B | = | A | + | B | - | A \cap B |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
В сумме &amp;lt;tex&amp;gt;~| A | + | B |&amp;lt;/tex&amp;gt; элементы пересечения &amp;lt;tex&amp;gt;A \cap B&amp;lt;/tex&amp;gt; учтены дважды, и, чтобы компенсировать это, мы вычитаем &amp;lt;tex&amp;gt; | A \cap B |&amp;lt;/tex&amp;gt; из правой части формулы. Справедливость этого рассуждения видна из диаграммы Эйлера–Венна для двух множеств, приведенной на рисунке справа.&lt;br /&gt;
&lt;br /&gt;
Таким же образом и в случае &amp;lt;tex&amp;gt;~n&amp;gt;2&amp;lt;/tex&amp;gt; множеств процесс нахождения количества элементов объединения &amp;lt;tex&amp;gt;A_1 \cup A_2 \cup \ldots \cup A_n&amp;lt;/tex&amp;gt; состоит во включении всего, затем исключении лишнего, затем включении ошибочно исключенного и так далее, то есть в попеременном включении и исключении. Отсюда и происходит название формулы.&lt;br /&gt;
&lt;br /&gt;
{{Теорема &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i &amp;lt;/tex&amp;gt; , тогда по формуле включения–исключения: &amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; | A | = \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
Причем &amp;lt;tex&amp;gt; N = \{ 1,2, \ldots ,n \} &amp;lt;/tex&amp;gt;. За  &amp;lt;tex&amp;gt; 2^N &amp;lt;/tex&amp;gt; примем множество всех подмножеств &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||proof=&lt;br /&gt;
Доказываем теорему по индукции.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;~l&amp;lt;/tex&amp;gt; {{---}} это количество множеств, мощность пересечения которых мы ищем. Для случая &amp;lt;tex&amp;gt;~l=1&amp;lt;/tex&amp;gt; равенство обращается в тривиальное (&amp;lt;tex&amp;gt; |A| = |A| &amp;lt;/tex&amp;gt;).  Для случая &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; справедливость теоремы пояснена выше. Таким образом, &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; {{---}} база индукции.  &lt;br /&gt;
&lt;br /&gt;
Предположим, что для &amp;lt;tex&amp;gt;~l=n-1&amp;lt;/tex&amp;gt; равенство верно. Докажем, что равенство истинно для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} пересечение &amp;lt;tex&amp;gt;~n&amp;lt;/tex&amp;gt; множеств. Тогда очевидно, что  &amp;lt;tex&amp;gt; A = \bigcup \limits_{i=1}^{n}A_i = \left(  {\bigcup \limits_{i=1}^{n-1}A_i} \right) \cup A_n &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; B = \bigcup \limits_{i=1}^{n-1}A_i &amp;lt;/tex&amp;gt;;  &amp;lt;tex&amp;gt;N' = \{ 1,2, \ldots ,n-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из предположения индукции, имеем, что &lt;br /&gt;
&amp;lt;tex&amp;gt; | B | = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, так как формула верна для &amp;lt;tex&amp;gt;~l=2&amp;lt;/tex&amp;gt; (из базы индукции), то верно равенство &amp;lt;tex&amp;gt; | A | = | B | + | A_n | - | B \cap A_n |(1)&amp;lt;/tex&amp;gt;. Найдем  &amp;lt;tex&amp;gt;~| B \cap A_n |&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt; | B \cap A_n | = \left| \left( \bigcup \limits_{i=1}^{n-1}A_i \right) \cap A_n \right|= \left| \bigcup \limits_{i=1}^{n-1} \left( A_i \cap A_n \right) \right|     (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из предположения индукции имеем, что &amp;lt;tex&amp;gt; (2) = &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} \left( A_j \cap A_n \right) \right| = \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставим полученные значение в &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;   | A |\!\!  = | A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I} A_j \right| \right) - \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В силу того, что &amp;lt;tex&amp;gt;  -  \sum \limits_{I \in 2^{N'}} (-1)^{|I|+1}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| = \ \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имеем в предыдущей формуле&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; | A |\!\!=| A_n |+\left( \sum \limits_{I \in 2^{N'}}  (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| \right) +  \left( \sum \limits_{I \in 2^{N'}} (-1)^{|I|+2}  \left| \bigcap \limits_{ j\in I \cup \{ n \} } A_j \right| \right) &lt;br /&gt;
&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;= \sum \limits_{I \in 2^N} (-1)^{|I|+1}  \left| \bigcap \limits_{ j \in I } A_j \right| &amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Равенство справедливо, потому что все наборы &amp;lt;tex&amp;gt; I \in 2^N &amp;lt;/tex&amp;gt; можно разбить на три группы :&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; I \in 2^{N'} &amp;lt;/tex&amp;gt; Это означает, что в наборе точно '''не''' будет присутствовать  индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, а будут все различные варианты индексов остальных множеств, т.е. &amp;lt;tex&amp;gt; I \in 2^{N'}&amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \{ n \} \cup I \in 2^{N'}  &amp;lt;/tex&amp;gt; Аналогично предыдущему, только в наборе будет индекс &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видно из равенства, каждое слагаемое &amp;quot;отвечает&amp;quot; за соответствующие группы. Значит, равенство истинно.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для &amp;lt;tex&amp;gt;~l=n&amp;lt;/tex&amp;gt; мы доказали, что равенство верно. Значит, индукционный переход верен, то есть теорема доказана.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>GR1n</name></author>	</entry>

	</feed>