<?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=194.85.161.34&amp;*</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=194.85.161.34&amp;*"/>
		<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/194.85.161.34"/>
		<updated>2026-05-19T18:00:43Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D1%8B%D0%B5_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8:_%D0%94%D0%B6%D0%B0%D1%80%D0%B2%D0%B8%D1%81,_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC,_%D0%AD%D0%BD%D0%B4%D1%80%D1%8E,_%D0%A7%D0%B5%D0%BD,_QuickHull&amp;diff=36183</id>
		<title>Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D1%8B%D0%B5_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8:_%D0%94%D0%B6%D0%B0%D1%80%D0%B2%D0%B8%D1%81,_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC,_%D0%AD%D0%BD%D0%B4%D1%80%D1%8E,_%D0%A7%D0%B5%D0%BD,_QuickHull&amp;diff=36183"/>
				<updated>2014-02-22T11:11:49Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ready}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Выпуклой оболочкой множества точек называется пересечение всех выпуклых множеств, содержащих все заданные точки.}}&lt;br /&gt;
&lt;br /&gt;
Еще одно определение:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Выпуклой оболочкой множества точек называется линейная комбинация минимального набора точек, дающая все остальные точки.}}&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся основные алгоритмы построения выпуклых оболочек статического множества. Используются обозначения: &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - размер входных данных, &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - размер оболочки.&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Джарвиса =&lt;br /&gt;
&lt;br /&gt;
По-другому &amp;quot;Gift wrapping algorithm&amp;quot; (Заворачивание подарка).&lt;br /&gt;
Он заключается в том, что мы ищем выпуклую оболочку последовательно, против часовой стрелки, начиная с определенной точки.&lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
[[File:Graham1.png|thumb|250px|Промежуточный шаг алгоритма. Для точки &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; ищем следующую перебором.]] &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
1) Возьмем самую правую нижнюю точку &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; нашего множества. Добавляем ее в ответ.&lt;br /&gt;
&lt;br /&gt;
2) На каждом следующем шаге для последнего добавленного &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; ищем &amp;lt;tex&amp;gt;p_{i + 1}&amp;lt;/tex&amp;gt; среди всех недобавленных точек и &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; с максимальным полярным углом относительно &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; (Если углы равны, надо сравнивать по расстоянию). Добавляем &amp;lt;tex&amp;gt;p_{i + 1}&amp;lt;/tex&amp;gt; в ответ. Если &amp;lt;tex&amp;gt;p_{i + 1} == p_0&amp;lt;/tex&amp;gt; , заканчиваем алгоритм.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
Точка &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt;, очевидно, принадлежит оболочке. На каждом последующем шаге алгоритма мы получаем прямую &amp;lt;tex&amp;gt;p_{i-1}p_i&amp;lt;/tex&amp;gt;, по построению которой все точки множества лежат слева от нее. Значит, выпуклая оболочка состоит из &amp;lt;tex&amp;gt;p_{i}&amp;lt;/tex&amp;gt;-ых и только из них.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество, &amp;lt;tex&amp;gt;n &amp;gt; 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Jarvis(S)&lt;br /&gt;
    find i such that S[i] has the lowest y-coordinate and highest x-coordinate&lt;br /&gt;
    p0 = S[i]&lt;br /&gt;
    pi = p0&lt;br /&gt;
    k = 0&lt;br /&gt;
    do &lt;br /&gt;
      k++&lt;br /&gt;
      for i = k..n &lt;br /&gt;
        if S[i] has lower angle and higher distance than S[k] in relation to pi&lt;br /&gt;
          swap(S[i], S[k])&lt;br /&gt;
      pi = S[k]&lt;br /&gt;
    while pi != p0&lt;br /&gt;
    return k&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Добавление каждой точки в ответ занимает &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени, всего точек будет &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, поэтому итоговая сложность &amp;lt;tex&amp;gt;O(nk)&amp;lt;/tex&amp;gt;. В худшем случае, когда оболочка состоит из всех точек сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Gift_wrapping_algorithm Английская статья — Wikipedia]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%B0%D1%80%D0%B2%D0%B8%D1%81%D0%B0 Русская статья — Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Грэхема =&lt;br /&gt;
&lt;br /&gt;
Алгоритм заключается в том, что мы ищем точки оболочки последовательно, используя стек. &lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:Graham2.png|thumb|400px|Промежуточный шаг алгоритма. Зелеными линиями обозначена текущая выпуклая оболочка, синими - промежуточные соединения точек, красными - те отрезки, которые раньше входили в оболочку, а сейчас нет. На текущем шаге при добавлении точки &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; последовательно убираем из оболочки точки с &amp;lt;tex&amp;gt;i+3&amp;lt;/tex&amp;gt;-ей до &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-ой]]&lt;br /&gt;
&lt;br /&gt;
1)Находим самую правую нижнюю точку множества &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt;, добавляем в ответ.&lt;br /&gt;
&lt;br /&gt;
2)Сортируем все остальные точки по полярному углу относительно &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3)Добавляем в ответ &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; - самую первую из отсортированных точек.&lt;br /&gt;
&lt;br /&gt;
4)Берем следующую по счету точку &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Пока &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и две последних точки в текущей оболочке &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_{i-1}&amp;lt;/tex&amp;gt; образуют неправый поворот (вектора &amp;lt;tex&amp;gt;p_i t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_{i-1} p_i&amp;lt;/tex&amp;gt;), удаляем из оболочки &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5)Добавляем в оболочку &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6)Делаем п.5, пока не закончатся точки. &lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
Докажем, что на каждом шаге множество &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;-тых является выпуклой оболочкой всех уже рассмотренных точек. Доказательство проведем по индукции. &lt;br /&gt;
&lt;br /&gt;
1)База. Для трех первых точек утверждение, очевидно, выполняется. &lt;br /&gt;
&lt;br /&gt;
2)Переход. Пусть для &amp;lt;tex&amp;gt;i-1&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;ch(S \cup {i}) = ch(S) \cup i \setminus P&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; - множество всех точек из &amp;lt;tex&amp;gt;ch(S)&amp;lt;/tex&amp;gt;, видимых из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Так как мы добавляли точки в нашу оболочку против часовой стрелки и так как &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая точка лежит в &amp;lt;tex&amp;gt;ch(S \cup i)&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P&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 = n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество, &amp;lt;tex&amp;gt;n &amp;gt; 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Graham(S)&lt;br /&gt;
   find i such that S[i] has the lowest y-coordinate and highest x-coordinate&lt;br /&gt;
   swap(S[i], S[1])&lt;br /&gt;
   sort S[2..n] by angle in relation to S[1]&lt;br /&gt;
   k = 2&lt;br /&gt;
   for p = 3..n&lt;br /&gt;
     while S[k - 1], S[k], S[p] has non-right orientation&lt;br /&gt;
       k--&lt;br /&gt;
     swap(S[p], S[k + 1])   &lt;br /&gt;
   return k + 1&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Сортировка точек занимает &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt; времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - &amp;lt;tex&amp;gt;O(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;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Graham_scan Английская статья — Wikipedia]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC%D0%B0 Русская статья — Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Эндрю =&lt;br /&gt;
&lt;br /&gt;
Алгоритм, очень похожий на алгоритм Грехема. Он заключается в том, что мы находим самую левую и самую правую точки, ищем для точек над и под этой прямой выпуклую оболочку Грехемом - для них начальные точки будут лежать на &amp;lt;tex&amp;gt;\pm inf&amp;lt;/tex&amp;gt;, а сортировка по углу относительно далекой точки аналогична сортировке по координате; после этого объединяем две оболочки в одну. &lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
[[File:andrew1.png|thumb|400px|Промежуточный шаг алгоритма. Зелеными линиями обозначена текущая выпуклая оболочка, синими - промежуточные соединения точек, красными - те отрезки, которые раньше входили в оболочку, а сейчас нет. На текущем шаге при добавлении точки &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; последовательно убираем из оболочки точки с &amp;lt;tex&amp;gt;i+3&amp;lt;/tex&amp;gt;-ей до &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-ой]]&lt;br /&gt;
1)Находим самую левую и самую правую точки множества - &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2)Делим множество на две части: точки над и под прямой.&lt;br /&gt;
&lt;br /&gt;
3)Для каждой половины ищем выпуклую оболочку Грехемом с условием, что сортируем не по полярному углу, а по координате.&lt;br /&gt;
&lt;br /&gt;
4)Сливаем получившиеся оболочки. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
См. доказательство алгоритма Грехема.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество, &amp;lt;tex&amp;gt;n &amp;gt; 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Andrew(S)&lt;br /&gt;
   sort S[1..n] by x-coordinate backward(than by y backward)&lt;br /&gt;
   k = 2&lt;br /&gt;
   for p = 3..n&lt;br /&gt;
    while S[k - 1], S[k], S[p] has non-right orientation&lt;br /&gt;
      k--&lt;br /&gt;
    swap(S[p], S[k + 1])&lt;br /&gt;
   k++   &lt;br /&gt;
   sort S[k + 1..n] by x-coordinate (than by y)&lt;br /&gt;
   for p = k + 1..n&lt;br /&gt;
     while S[k - 1], S[k], S[p] has non-right orientation&lt;br /&gt;
       k--&lt;br /&gt;
     swap(S[p], S[k + 1])&lt;br /&gt;
   return k + 1&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Сортировка точек занимает &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt; времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность двух обходов - &amp;lt;tex&amp;gt; 2 \cdot O(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;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Graham_scan#Notes Одно предложение о нем]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Чена =&lt;br /&gt;
&lt;br /&gt;
Является комбинацией двух алгоритмов - Джарвиса и Грехема. Недостатком Грэхема является необходимость сортировки всех точек по полярному углу, что занимает достаточно много времени &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;. Джарвис требует перебора всех точек для каждой из &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; точек оболочки, что в худшем случае занимает &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1)Разобьем все множество на произвольные группы по &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;r = n / m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2)Для каждой группы запускаем Грехема. &lt;br /&gt;
&lt;br /&gt;
3)Начиная с самой нижней точки ищем саму выпуклую оболочку Джарвисом, но перебираем не все точки, а по одной из каждой группы.&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
На втором шаге алгоритма в каждой группе оболочка ищется за &amp;lt;tex&amp;gt;O(m \log m)&amp;lt;/tex&amp;gt;, общее время - &amp;lt;tex&amp;gt;O(r m \log m) = O(n \log m)&amp;lt;/tex&amp;gt;. На третьем шаге поиск каждой следующей точки в каждой группе занимает &amp;lt;tex&amp;gt;O(\log m)&amp;lt;/tex&amp;gt;, так как точки уже отсортированы, и мы можем найти нужную бинпоиском. Тогда поиск по всем группам займет &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;O(r \log m) = O(\frac{n}{m} \log m)&amp;lt;/tex&amp;gt;. Всего таких шагов будет &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, значит общее время - &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;O(\frac{kn}{m} \log m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Итоговое время - &amp;lt;tex&amp;gt;O(n (1 + \frac{k}{m}) \log m)&amp;lt;/tex&amp;gt;. Несложно видеть, что минимум достигается при &amp;lt;tex&amp;gt;m = k&amp;lt;/tex&amp;gt;. В таком случае сложность равна &amp;lt;tex&amp;gt;O(n \log k)&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;k&amp;lt;/tex&amp;gt;? Воспользуемся следующим методом. Положим &amp;lt;tex&amp;gt;m = 2^{2^t}&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 \ge k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда общее время алгоритма - &amp;lt;tex&amp;gt; \sum_{t=0}^{O(\log\log k)} O\left(n \log(2^{2^t})\right) = O(n) \sum_{t=0}^{O(\log\log k)} O(2^t) = O\left(n \cdot 2^{1+O(\log\log k)}\right) = O(n \log k).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Chan%27s_algorithm Английская статья — Wikipedia]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A7%D0%B0%D0%BD%D0%B0 Русская статья — Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм QuickHull =&lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
[[File:hull.png|thumb|250px|Промежуточный шаг алгоритма. Для прямой &amp;lt;tex&amp;gt;p_i p_1&amp;lt;/tex&amp;gt; нашли точку &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Над прямыми &amp;lt;tex&amp;gt;p_i p&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p p_1&amp;lt;/tex&amp;gt; точек нет, поэтому переходим к следующей прямой &amp;lt;tex&amp;gt;p_0 p_i&amp;lt;/tex&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
1)Найдем самую левую точку &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; и самую правую точку &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; (Если таких несколько, выберем среди таких нижнюю и верхнюю соответственно).&lt;br /&gt;
&lt;br /&gt;
2)Возьмем все точки выше прямой &amp;lt;tex&amp;gt;p_0 p_1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3)Найдем среди этого множества точку &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, наиболее отдаленную от прямой (если таких несколько, взять самую правую).&lt;br /&gt;
&lt;br /&gt;
4)Рекурсивно повторить шаги 2-3 для прямых &amp;lt;tex&amp;gt;p_0 p_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_i p_1&amp;lt;/tex&amp;gt;, пока есть точки.&lt;br /&gt;
&lt;br /&gt;
5)Добавить в ответ точки &amp;lt;tex&amp;gt;p_0 .. p_i .. p_1&amp;lt;/tex&amp;gt;, полученные в п. 3.&lt;br /&gt;
&lt;br /&gt;
6)Повторить пункты 2-5 для &amp;lt;tex&amp;gt;p_1 p_0&amp;lt;/tex&amp;gt; (то есть для &amp;quot;нижней&amp;quot; половины).&lt;br /&gt;
&lt;br /&gt;
7)Ответ - объединение списков из п. 5 для верхней и нижней половины.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
 &lt;br /&gt;
[[File:hull1.png|thumb|200px|]]&lt;br /&gt;
&lt;br /&gt;
Очевидно, что выпуклая оболочка всего множества является объединением выпуклых оболочек для верхнего и нижнего множества. Докажем, что алгоритм верно строит оболочку для верхнего множества, для нижнего рассуждения аналогичны.&lt;br /&gt;
Точки &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; принадлежат оболочке.&lt;br /&gt;
&lt;br /&gt;
* Пусть какая-то точка входит в нашу оболочку, но не должна.&lt;br /&gt;
&lt;br /&gt;
Назовем эту точку &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. По алгоритму эта точка появилась как самая удаленная от некой прямой &amp;lt;tex&amp;gt;t_1 t_2&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; не входит в оболочку, то существует прямая &amp;lt;tex&amp;gt;t_3 t_4&amp;lt;/tex&amp;gt; из настоящей выпуклой оболочки, что &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; лежит снизу от прямой. Тогда какая-то из &amp;lt;tex&amp;gt;t_3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t_4&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;
Пойдем вниз рекурсии в те ветки, где есть &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. В какой-то момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;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;
Заметим, что длина высоты, опущенная из точки &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; на отрезок &amp;lt;tex&amp;gt;ab&amp;lt;/tex&amp;gt;, пропорциональна векторному произведению &amp;lt;tex&amp;gt;[bt \cdot ba]&amp;lt;/tex&amp;gt;, поэтому для сравнения можно использовать именно это.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество. &amp;lt;tex&amp;gt;quick\_hull()&amp;lt;/tex&amp;gt; - рекурсивная функция, находящая оболочку подмножества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. В реализации в конце каждого подмножества находятся эл-ты, точно не принадлежащие оболочке.&lt;br /&gt;
&lt;br /&gt;
 QuickHull(S)&lt;br /&gt;
   find i such that S[i] has the highest x-coordinate and lowest y-coordinate &lt;br /&gt;
   swap(S[1], S[i])&lt;br /&gt;
   find i such that S[i] has the lowest x-coordinate and lowest y-coordinate&lt;br /&gt;
   swap(S[n], S[i])&lt;br /&gt;
   k = partition1(S) // разбиваем на те эл-ты, которые лежат над прямой и на остальные&lt;br /&gt;
   a = quick_hull(S, 1, k)&lt;br /&gt;
   b = quick_hull(S, k + 1, n);&lt;br /&gt;
   swap(S[a..k], S[k + 1, b])&lt;br /&gt;
   return start + (a - 1) + (b - k - 1) &amp;lt;br/&amp;gt;&lt;br /&gt;
 quick_hull(S, start, end)&lt;br /&gt;
   find i such that S[i], S[start], S[end] has maximum value&lt;br /&gt;
   (a, b) = partition2(S, start, end, S[i]) //свапаем эл-ты S так, чтобы сначала были все эл-ты над прямой S[start]S[i], потом S[i]S[end], потом все остальное&lt;br /&gt;
   c = quick_hull(S, start, a)&lt;br /&gt;
   d = quick_hull(S, a + 1, b)&lt;br /&gt;
   swap(S[c..a], S[a + 1..d])&lt;br /&gt;
   return start + (a - c) + (d - b)&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Пусть время, необходимое для нахождения оболочки над некой прямой и множеством точек &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;T(S)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;T(S) = O(\|S\|) + T(A \in S) + T(B \in S)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A, B&amp;lt;/tex&amp;gt; - множества над полученными прямыми. Отсюда видно, что в худшем случае, алгоритм тратит &amp;lt;tex&amp;gt;O(n^2)&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;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/QuickHull Английская статья — Wikipedia]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D1%8B%D0%B5_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8:_%D0%94%D0%B6%D0%B0%D1%80%D0%B2%D0%B8%D1%81,_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC,_%D0%AD%D0%BD%D0%B4%D1%80%D1%8E,_%D0%A7%D0%B5%D0%BD,_QuickHull&amp;diff=36182</id>
		<title>Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D1%8B%D0%B5_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8:_%D0%94%D0%B6%D0%B0%D1%80%D0%B2%D0%B8%D1%81,_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC,_%D0%AD%D0%BD%D0%B4%D1%80%D1%8E,_%D0%A7%D0%B5%D0%BD,_QuickHull&amp;diff=36182"/>
				<updated>2014-02-22T11:10:41Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{boring}}&lt;br /&gt;
{{ready}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Выпуклой оболочкой множества точек называется пересечение всех выпуклых множеств, содержащих все заданные точки.}}&lt;br /&gt;
&lt;br /&gt;
Еще одно определение:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Выпуклой оболочкой множества точек называется линейная комбинация минимального набора точек, дающая все остальные точки.}}&lt;br /&gt;
&lt;br /&gt;
Ниже приводятся основные алгоритмы построения выпуклых оболочек статического множества. Используются обозначения: &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - размер входных данных, &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; - размер оболочки.&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Джарвиса =&lt;br /&gt;
&lt;br /&gt;
По-другому &amp;quot;Gift wrapping algorithm&amp;quot; (Заворачивание подарка).&lt;br /&gt;
Он заключается в том, что мы ищем выпуклую оболочку последовательно, против часовой стрелки, начиная с определенной точки.&lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
[[File:Graham1.png|thumb|250px|Промежуточный шаг алгоритма. Для точки &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; ищем следующую перебором.]] &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
1) Возьмем самую правую нижнюю точку &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; нашего множества. Добавляем ее в ответ.&lt;br /&gt;
&lt;br /&gt;
2) На каждом следующем шаге для последнего добавленного &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; ищем &amp;lt;tex&amp;gt;p_{i + 1}&amp;lt;/tex&amp;gt; среди всех недобавленных точек и &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; с максимальным полярным углом относительно &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; (Если углы равны, надо сравнивать по расстоянию). Добавляем &amp;lt;tex&amp;gt;p_{i + 1}&amp;lt;/tex&amp;gt; в ответ. Если &amp;lt;tex&amp;gt;p_{i + 1} == p_0&amp;lt;/tex&amp;gt; , заканчиваем алгоритм.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
Точка &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt;, очевидно, принадлежит оболочке. На каждом последующем шаге алгоритма мы получаем прямую &amp;lt;tex&amp;gt;p_{i-1}p_i&amp;lt;/tex&amp;gt;, по построению которой все точки множества лежат слева от нее. Значит, выпуклая оболочка состоит из &amp;lt;tex&amp;gt;p_{i}&amp;lt;/tex&amp;gt;-ых и только из них.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество, &amp;lt;tex&amp;gt;n &amp;gt; 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Jarvis(S)&lt;br /&gt;
    find i such that S[i] has the lowest y-coordinate and highest x-coordinate&lt;br /&gt;
    p0 = S[i]&lt;br /&gt;
    pi = p0&lt;br /&gt;
    k = 0&lt;br /&gt;
    do &lt;br /&gt;
      k++&lt;br /&gt;
      for i = k..n &lt;br /&gt;
        if S[i] has lower angle and higher distance than S[k] in relation to pi&lt;br /&gt;
          swap(S[i], S[k])&lt;br /&gt;
      pi = S[k]&lt;br /&gt;
    while pi != p0&lt;br /&gt;
    return k&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Добавление каждой точки в ответ занимает &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени, всего точек будет &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, поэтому итоговая сложность &amp;lt;tex&amp;gt;O(nk)&amp;lt;/tex&amp;gt;. В худшем случае, когда оболочка состоит из всех точек сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Gift_wrapping_algorithm Английская статья — Wikipedia]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B6%D0%B0%D1%80%D0%B2%D0%B8%D1%81%D0%B0 Русская статья — Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Грэхема =&lt;br /&gt;
&lt;br /&gt;
Алгоритм заключается в том, что мы ищем точки оболочки последовательно, используя стек. &lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
&lt;br /&gt;
[[File:Graham2.png|thumb|400px|Промежуточный шаг алгоритма. Зелеными линиями обозначена текущая выпуклая оболочка, синими - промежуточные соединения точек, красными - те отрезки, которые раньше входили в оболочку, а сейчас нет. На текущем шаге при добавлении точки &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; последовательно убираем из оболочки точки с &amp;lt;tex&amp;gt;i+3&amp;lt;/tex&amp;gt;-ей до &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-ой]]&lt;br /&gt;
&lt;br /&gt;
1)Находим самую правую нижнюю точку множества &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt;, добавляем в ответ.&lt;br /&gt;
&lt;br /&gt;
2)Сортируем все остальные точки по полярному углу относительно &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3)Добавляем в ответ &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; - самую первую из отсортированных точек.&lt;br /&gt;
&lt;br /&gt;
4)Берем следующую по счету точку &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Пока &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и две последних точки в текущей оболочке &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_{i-1}&amp;lt;/tex&amp;gt; образуют неправый поворот (вектора &amp;lt;tex&amp;gt;p_i t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_{i-1} p_i&amp;lt;/tex&amp;gt;), удаляем из оболочки &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5)Добавляем в оболочку &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6)Делаем п.5, пока не закончатся точки. &lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
Докажем, что на каждом шаге множество &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;-тых является выпуклой оболочкой всех уже рассмотренных точек. Доказательство проведем по индукции. &lt;br /&gt;
&lt;br /&gt;
1)База. Для трех первых точек утверждение, очевидно, выполняется. &lt;br /&gt;
&lt;br /&gt;
2)Переход. Пусть для &amp;lt;tex&amp;gt;i-1&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;ch(S \cup {i}) = ch(S) \cup i \setminus P&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; - множество всех точек из &amp;lt;tex&amp;gt;ch(S)&amp;lt;/tex&amp;gt;, видимых из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Так как мы добавляли точки в нашу оболочку против часовой стрелки и так как &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-тая точка лежит в &amp;lt;tex&amp;gt;ch(S \cup i)&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;P&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 = n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество, &amp;lt;tex&amp;gt;n &amp;gt; 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Graham(S)&lt;br /&gt;
   find i such that S[i] has the lowest y-coordinate and highest x-coordinate&lt;br /&gt;
   swap(S[i], S[1])&lt;br /&gt;
   sort S[2..n] by angle in relation to S[1]&lt;br /&gt;
   k = 2&lt;br /&gt;
   for p = 3..n&lt;br /&gt;
     while S[k - 1], S[k], S[p] has non-right orientation&lt;br /&gt;
       k--&lt;br /&gt;
     swap(S[p], S[k + 1])   &lt;br /&gt;
   return k + 1&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Сортировка точек занимает &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt; времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность этой части - &amp;lt;tex&amp;gt;O(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;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Graham_scan Английская статья — Wikipedia]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%93%D1%80%D1%8D%D1%85%D0%B5%D0%BC%D0%B0 Русская статья — Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Эндрю =&lt;br /&gt;
&lt;br /&gt;
Алгоритм, очень похожий на алгоритм Грехема. Он заключается в том, что мы находим самую левую и самую правую точки, ищем для точек над и под этой прямой выпуклую оболочку Грехемом - для них начальные точки будут лежать на &amp;lt;tex&amp;gt;\pm inf&amp;lt;/tex&amp;gt;, а сортировка по углу относительно далекой точки аналогична сортировке по координате; после этого объединяем две оболочки в одну. &lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
[[File:andrew1.png|thumb|400px|Промежуточный шаг алгоритма. Зелеными линиями обозначена текущая выпуклая оболочка, синими - промежуточные соединения точек, красными - те отрезки, которые раньше входили в оболочку, а сейчас нет. На текущем шаге при добавлении точки &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; последовательно убираем из оболочки точки с &amp;lt;tex&amp;gt;i+3&amp;lt;/tex&amp;gt;-ей до &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt;-ой]]&lt;br /&gt;
1)Находим самую левую и самую правую точки множества - &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2)Делим множество на две части: точки над и под прямой.&lt;br /&gt;
&lt;br /&gt;
3)Для каждой половины ищем выпуклую оболочку Грехемом с условием, что сортируем не по полярному углу, а по координате.&lt;br /&gt;
&lt;br /&gt;
4)Сливаем получившиеся оболочки. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
См. доказательство алгоритма Грехема.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество, &amp;lt;tex&amp;gt;n &amp;gt; 2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Andrew(S)&lt;br /&gt;
   sort S[1..n] by x-coordinate backward(than by y backward)&lt;br /&gt;
   k = 2&lt;br /&gt;
   for p = 3..n&lt;br /&gt;
    while S[k - 1], S[k], S[p] has non-right orientation&lt;br /&gt;
      k--&lt;br /&gt;
    swap(S[p], S[k + 1])&lt;br /&gt;
   k++   &lt;br /&gt;
   sort S[k + 1..n] by x-coordinate (than by y)&lt;br /&gt;
   for p = k + 1..n&lt;br /&gt;
     while S[k - 1], S[k], S[p] has non-right orientation&lt;br /&gt;
       k--&lt;br /&gt;
     swap(S[p], S[k + 1])&lt;br /&gt;
   return k + 1&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Сортировка точек занимает &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt; времени. При обходе каждая точка добавляется в ответ не более одного раза, поэтому сложность двух обходов - &amp;lt;tex&amp;gt; 2 \cdot O(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;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Graham_scan#Notes Одно предложение о нем]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм Чена =&lt;br /&gt;
&lt;br /&gt;
Является комбинацией двух алгоритмов - Джарвиса и Грехема. Недостатком Грэхема является необходимость сортировки всех точек по полярному углу, что занимает достаточно много времени &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;. Джарвис требует перебора всех точек для каждой из &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; точек оболочки, что в худшем случае занимает &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1)Разобьем все множество на произвольные группы по &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;r = n / m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2)Для каждой группы запускаем Грехема. &lt;br /&gt;
&lt;br /&gt;
3)Начиная с самой нижней точки ищем саму выпуклую оболочку Джарвисом, но перебираем не все точки, а по одной из каждой группы.&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
На втором шаге алгоритма в каждой группе оболочка ищется за &amp;lt;tex&amp;gt;O(m \log m)&amp;lt;/tex&amp;gt;, общее время - &amp;lt;tex&amp;gt;O(r m \log m) = O(n \log m)&amp;lt;/tex&amp;gt;. На третьем шаге поиск каждой следующей точки в каждой группе занимает &amp;lt;tex&amp;gt;O(\log m)&amp;lt;/tex&amp;gt;, так как точки уже отсортированы, и мы можем найти нужную бинпоиском. Тогда поиск по всем группам займет &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;O(r \log m) = O(\frac{n}{m} \log m)&amp;lt;/tex&amp;gt;. Всего таких шагов будет &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, значит общее время - &amp;lt;tex dpi=&amp;quot;130&amp;quot;&amp;gt;O(\frac{kn}{m} \log m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Итоговое время - &amp;lt;tex&amp;gt;O(n (1 + \frac{k}{m}) \log m)&amp;lt;/tex&amp;gt;. Несложно видеть, что минимум достигается при &amp;lt;tex&amp;gt;m = k&amp;lt;/tex&amp;gt;. В таком случае сложность равна &amp;lt;tex&amp;gt;O(n \log k)&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;k&amp;lt;/tex&amp;gt;? Воспользуемся следующим методом. Положим &amp;lt;tex&amp;gt;m = 2^{2^t}&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 \ge k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда общее время алгоритма - &amp;lt;tex&amp;gt; \sum_{t=0}^{O(\log\log k)} O\left(n \log(2^{2^t})\right) = O(n) \sum_{t=0}^{O(\log\log k)} O(2^t) = O\left(n \cdot 2^{1+O(\log\log k)}\right) = O(n \log k).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Chan%27s_algorithm Английская статья — Wikipedia]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A7%D0%B0%D0%BD%D0%B0 Русская статья — Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Алгоритм QuickHull =&lt;br /&gt;
&lt;br /&gt;
== Описание Алгоритма ==&lt;br /&gt;
[[File:hull.png|thumb|250px|Промежуточный шаг алгоритма. Для прямой &amp;lt;tex&amp;gt;p_i p_1&amp;lt;/tex&amp;gt; нашли точку &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Над прямыми &amp;lt;tex&amp;gt;p_i p&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p p_1&amp;lt;/tex&amp;gt; точек нет, поэтому переходим к следующей прямой &amp;lt;tex&amp;gt;p_0 p_i&amp;lt;/tex&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
1)Найдем самую левую точку &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; и самую правую точку &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; (Если таких несколько, выберем среди таких нижнюю и верхнюю соответственно).&lt;br /&gt;
&lt;br /&gt;
2)Возьмем все точки выше прямой &amp;lt;tex&amp;gt;p_0 p_1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3)Найдем среди этого множества точку &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, наиболее отдаленную от прямой (если таких несколько, взять самую правую).&lt;br /&gt;
&lt;br /&gt;
4)Рекурсивно повторить шаги 2-3 для прямых &amp;lt;tex&amp;gt;p_0 p_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_i p_1&amp;lt;/tex&amp;gt;, пока есть точки.&lt;br /&gt;
&lt;br /&gt;
5)Добавить в ответ точки &amp;lt;tex&amp;gt;p_0 .. p_i .. p_1&amp;lt;/tex&amp;gt;, полученные в п. 3.&lt;br /&gt;
&lt;br /&gt;
6)Повторить пункты 2-5 для &amp;lt;tex&amp;gt;p_1 p_0&amp;lt;/tex&amp;gt; (то есть для &amp;quot;нижней&amp;quot; половины).&lt;br /&gt;
&lt;br /&gt;
7)Ответ - объединение списков из п. 5 для верхней и нижней половины.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
 &lt;br /&gt;
[[File:hull1.png|thumb|200px|]]&lt;br /&gt;
&lt;br /&gt;
Очевидно, что выпуклая оболочка всего множества является объединением выпуклых оболочек для верхнего и нижнего множества. Докажем, что алгоритм верно строит оболочку для верхнего множества, для нижнего рассуждения аналогичны.&lt;br /&gt;
Точки &amp;lt;tex&amp;gt;p_0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; принадлежат оболочке.&lt;br /&gt;
&lt;br /&gt;
* Пусть какая-то точка входит в нашу оболочку, но не должна.&lt;br /&gt;
&lt;br /&gt;
Назовем эту точку &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. По алгоритму эта точка появилась как самая удаленная от некой прямой &amp;lt;tex&amp;gt;t_1 t_2&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; не входит в оболочку, то существует прямая &amp;lt;tex&amp;gt;t_3 t_4&amp;lt;/tex&amp;gt; из настоящей выпуклой оболочки, что &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; лежит снизу от прямой. Тогда какая-то из &amp;lt;tex&amp;gt;t_3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;t_4&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;
Пойдем вниз рекурсии в те ветки, где есть &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. В какой-то момент &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;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;
Заметим, что длина высоты, опущенная из точки &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; на отрезок &amp;lt;tex&amp;gt;ab&amp;lt;/tex&amp;gt;, пропорциональна векторному произведению &amp;lt;tex&amp;gt;[bt \cdot ba]&amp;lt;/tex&amp;gt;, поэтому для сравнения можно использовать именно это.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
Inplace-реализация алгоритма. &amp;lt;tex&amp;gt;S[1..n]&amp;lt;/tex&amp;gt; - исходное множество. &amp;lt;tex&amp;gt;quick\_hull()&amp;lt;/tex&amp;gt; - рекурсивная функция, находящая оболочку подмножества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. В реализации в конце каждого подмножества находятся эл-ты, точно не принадлежащие оболочке.&lt;br /&gt;
&lt;br /&gt;
 QuickHull(S)&lt;br /&gt;
   find i such that S[i] has the highest x-coordinate and lowest y-coordinate &lt;br /&gt;
   swap(S[1], S[i])&lt;br /&gt;
   find i such that S[i] has the lowest x-coordinate and lowest y-coordinate&lt;br /&gt;
   swap(S[n], S[i])&lt;br /&gt;
   k = partition1(S) // разбиваем на те эл-ты, которые лежат над прямой и на остальные&lt;br /&gt;
   a = quick_hull(S, 1, k)&lt;br /&gt;
   b = quick_hull(S, k + 1, n);&lt;br /&gt;
   swap(S[a..k], S[k + 1, b])&lt;br /&gt;
   return start + (a - 1) + (b - k - 1) &amp;lt;br/&amp;gt;&lt;br /&gt;
 quick_hull(S, start, end)&lt;br /&gt;
   find i such that S[i], S[start], S[end] has maximum value&lt;br /&gt;
   (a, b) = partition2(S, start, end, S[i]) //свапаем эл-ты S так, чтобы сначала были все эл-ты над прямой S[start]S[i], потом S[i]S[end], потом все остальное&lt;br /&gt;
   c = quick_hull(S, start, a)&lt;br /&gt;
   d = quick_hull(S, a + 1, b)&lt;br /&gt;
   swap(S[c..a], S[a + 1..d])&lt;br /&gt;
   return start + (a - c) + (d - b)&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Пусть время, необходимое для нахождения оболочки над некой прямой и множеством точек &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt;T(S)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt;T(S) = O(\|S\|) + T(A \in S) + T(B \in S)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A, B&amp;lt;/tex&amp;gt; - множества над полученными прямыми. Отсюда видно, что в худшем случае, алгоритм тратит &amp;lt;tex&amp;gt;O(n^2)&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;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/QuickHull Английская статья — Wikipedia]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33839</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33839"/>
				<updated>2013-11-30T08:08:24Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Ключевые моменты */ - заменил скобки в картинке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Рассмотрим несколько самых распространенных алгоритмов:&lt;br /&gt;
&lt;br /&gt;
# Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, и его суть заключается в проверке попарного пересечения отрезков.&lt;br /&gt;
# Сложнее, но эффективнее алгоритм Бентли-Оттмана &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой.&lt;br /&gt;
# Алгоритм, предложенный Чазелле и Едельсбруннером &amp;lt;ref&amp;gt;[http://www.cs.princeton.edu/~chazelle/pubs/IntersectLineSegments.pdf ''An optimal algorithm for intersecting line segments in the plane'']&amp;lt;/ref&amp;gt;, имеет лучшую оценку &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt;, но в отличие от предыдущих методов требует квадратичной памяти.&lt;br /&gt;
# Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти, где К - число пересекающихся отрезков.&lt;br /&gt;
&lt;br /&gt;
При количестве отрезков от 2000, и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма, в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.&lt;br /&gt;
&lt;br /&gt;
==Основные понятия==&lt;br /&gt;
&lt;br /&gt;
Введем некоторые обозначения. Пусть &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; - множество всех точек пересечения отрезков из множества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;K = |Int(S)|&amp;lt;/tex&amp;gt; - количество таких пересечений ;&amp;lt;br&amp;gt;&lt;br /&gt;
Через &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; обозначим вертикальную полосу, которая ограничена прямыми &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s&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;br&amp;gt;&lt;br /&gt;
Рассмотрим взаимное расположение вертикальной полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и отрезка &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем говорить, что отрезок &amp;lt;tex&amp;gt;s&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; :&lt;br /&gt;
{{---}} '''охватывает''' (''span'') полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;l \le a \le b \le r&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{---}} '''внутренний''' (''inner'') для полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;a &amp;lt; l &amp;lt; r &amp;lt; b&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{---}} '''пересекает''' (''cross'') полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; в других случаях.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Два отрезка &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; называются ''пересекающимися внутри'' полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если их точка пересечения лежит в пределах этой полосы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для двух множеств отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; определим множество &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\{ {s, s'} | (s \in S, s' \in S') \&amp;amp; (s \ intersect \ s') \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Balaban_pic_1.png|280px|thumb|right|&amp;lt;tex&amp;gt;D = ((s_1, s_2, s_3), \langle a, b \rangle)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_4) = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_5) = 2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Int(D, \{s_4,\ s_5\}) = \{\{s_3,\ s_5\}\}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Обозначения &amp;lt;tex&amp;gt;Int_{a, b}(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int_{a, b}(S, S')&amp;lt;/tex&amp;gt; будут использоваться для описания подмножеств &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt;, состоящих из пересекающихся пар отрезков в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее фигурные скобки &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt; используются для определения неупорядоченных множеств, а круглые скобки &amp;lt;tex&amp;gt;()&amp;lt;/tex&amp;gt; используются для определения упорядоченных множеств.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
Введем отношение порядка на множестве отрезков &amp;lt;tex&amp;gt;s_1 &amp;lt;_a s_2&amp;lt;/tex&amp;gt; если оба отрезка пересекают вертикальную линию&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и точка пересечения этой прямой с отрезком &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; лежит ниже точки пересечения с &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
''Лестница'' &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; — это пара &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt;, в которой отрезки из множества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; удовлетворяют следующим условиям : &lt;br /&gt;
{{---}} любой отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
{{---}} нет пересечений отрезков внутри лестницы; &amp;lt;br&amp;gt;&lt;br /&gt;
{{---}} &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; упорядочена по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часть отрезков лестницы внутри полосы будем называть '''ступеньками'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем называть лестницу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; '''полной''' относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, если каждый отрезок из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; либо не охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, либо пересекает хотя бы одну из ступенек из множества &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть лестница &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; состоит из отрезков, пересекающих полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;|S| \le Ends_{a, b}(S) + |Int(D, S)|&amp;lt;/tex&amp;gt;,&amp;lt;br&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;Ends_{a, b}(S)&amp;lt;/tex&amp;gt; это число вершин отрезков из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, находящихся в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Если точка &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;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;i + 1&amp;lt;/tex&amp;gt;, тогда число &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; называется ''местоположением'' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на лестнице &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и обозначается как &amp;lt;tex&amp;gt;Loc(D, s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Имея лестницу &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; и множество отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, множество &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; можно найти за время &amp;lt;tex&amp;gt;O(|S| log|Q| + |Int(D, S)|)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;S’&amp;lt;/tex&amp;gt; упорядочено отношением &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x \in [a, b]&amp;lt;/tex&amp;gt;, тогда можно найти &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(|S| + |Q| + |Int(D, S)|)&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;
===Split===&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; разделяет входное множество отрезков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, охватывающих некоторую полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, на подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt; так, что лестница &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Пусть &amp;lt;tex&amp;gt;L = (s_1 ,..., s_k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;s_i &amp;lt;_a s_{i+1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;Split_{a, b}(L, Q, L')&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L' \leftarrow \varnothing; Q \leftarrow \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;j = 1,...,k&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         '''if''' отрезок &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; не пересекает&lt;br /&gt;
         последний отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; внутри полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
         и при этом охватывает её '''then'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;Q;&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''else'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;L';&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция работает за &amp;lt;tex&amp;gt;O(|L|)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
===Search In Strip===&lt;br /&gt;
&lt;br /&gt;
Зная &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; мы можем найти &amp;lt;tex&amp;gt;Int_{a, b}(L)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; используя следующую рекурсивную функцию:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split(L, Q, L');&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;L' = \varnothing&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow Q;&amp;lt;/tex&amp;gt; &lt;br /&gt;
         '''return'''&amp;lt;tex&amp;gt;;&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int_{a, b}(Q, L');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;SearchInStrip_{a, b} (L', R');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R \leftarrow Merge_b(Q, R’);&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь, &amp;lt;tex&amp;gt;Merge_x(S_1, S_2)&amp;lt;/tex&amp;gt; это функция объединения множеств &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;, упорядоченных по отношению &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;. Время выполнения &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; эквивалентно сумме времён каждого её запуска. Очевидно, что время работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той функции, будет равно &amp;lt;tex&amp;gt;O(|L_i| + |Int_{a, b}(Q_i, {L_i}')|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_i, Q_i, {L_i}'&amp;lt;/tex&amp;gt; это соответствующие наборы &amp;lt;tex&amp;gt;(L_0 = L, L_{i+1} = {L_i}')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Учитывая [[#lemma1|лемму]], заключаем, что функция &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(|L| + |Int_{a, b}(L)|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что все отрезки лежат в полосе &amp;lt;tex&amp;gt;\langle a, b\rangle&amp;lt;/tex&amp;gt;. Таким образом в самом начале у нас есть пара &amp;lt;tex&amp;gt;(S, \langle a, b\rangle)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Что же дальше происходит: множество &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; ''распадается'' в подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, после чего лестница &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; становится полной относительно множества &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Необходимо найти пересечения отрезков из &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, затем, все пересечения в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Чтобы найти пересечения отрезков в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, мы ''режем'' полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и множество &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; по вертикале &amp;lt;tex&amp;gt;x = c&amp;lt;/tex&amp;gt; на полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; и множества &amp;lt;tex&amp;gt;S'_{ls}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S'_{rs}&amp;lt;/tex&amp;gt; соответственно, где &amp;lt;tex&amp;gt;c&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;(S'_{ls}, \langle a, c \rangle)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(S'_{rs}, \langle c, b \rangle)&amp;lt;/tex&amp;gt;. Ключевым является тот факт, что согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;|S'| \le Ends_{a, b}(S') + |Int(D, S')|&amp;lt;/tex&amp;gt;, таким образом, число дополнительных отрезков, появляющихся после ''разрезаний'' пропорционально числу найденных пересечений.&lt;br /&gt;
&lt;br /&gt;
===Ключевые моменты===&lt;br /&gt;
&lt;br /&gt;
Давайте разберемся с алгоритмом более подробно:&lt;br /&gt;
&lt;br /&gt;
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы (в конечном счете, их можно будет отсортировать введением дополнительных свойств). Будем рассматривать целые координаты на промежутке &amp;lt;tex&amp;gt;[1, 2N]&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; слева направо конец отрезка множества &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; отрезок, которому он принадлежит соответственно.&lt;br /&gt;
&lt;br /&gt;
Основная задача нашего алгоритма, это рекурсивная функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Соединим каждый вызов функции с узлом некоего двоичного дерева (далее ''рекурсивное дерево''). Соответствующим узлом отметим все значения, множества и параметры вызова. Обозначим множество внутренних вершин за &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0):&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2 \cdot N&amp;lt;/tex&amp;gt; вершин по координатам и&lt;br /&gt;
         найдем &amp;lt;tex&amp;gt;p_i, s(i), i = 1,...,2 \cdot N;\ S_r \leftarrow S_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_r, 1, 2 \cdot N)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(S_v, a, b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow&amp;lt;/tex&amp;gt; отсортируем &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;; &lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Разделим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; так, что лестница&lt;br /&gt;
         &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt; будет полной, относительно множества &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b)/2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделим отрезки из &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; на пересекающих&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{ls}(v)&amp;lt;/tex&amp;gt; и&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{rs}(v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{ls}(v), a, c)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{rs}(v), c, b)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда и дальше &amp;lt;tex&amp;gt;ls(v)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;rs(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;ft(v)&amp;lt;/tex&amp;gt; означают, соответственно, левого сына, правого сына, и отцовскую вершину узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Наша задача показать, что все операции с узлом &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; происходят за &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')| + (a_v - b_v)logN)&amp;lt;/tex&amp;gt;, для этого возьмем во внимание, что &amp;lt;tex&amp;gt;\sum_v |S_v| = O(N \cdot logN + K)&amp;lt;/tex&amp;gt; (очевидно, что &amp;lt;tex&amp;gt;\sum_v |Int(D_v, S_v')| \le K&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Balaban_pic_2.png|280px|thumb|right|&amp;lt;tex&amp;gt;S_v = \{s_1, s_2, s_3, s_4, s_5\}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L_v = (s_1, s_3)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v = (s_4, s_3)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v = \{s_2, s_5\}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; похожа на функцию &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt;. Основная разница заключается в том, что &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; вызывает себя без изменения полосы, когда &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; делит полосу на две части, после чего рекурсивно вызывает себя для них. Другое отличие заключается в том, что множество &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; не упорядочено так же, как &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. В результате мы не можем напрямую использовать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для эффективного деления &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы решить эту проблему, представим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; как объединение трех множеств:&lt;br /&gt;
множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;, неупорядоченного множества &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;, и множества &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_b&amp;lt;/tex&amp;gt;. Расположим отрезки из &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;, пересекающие границу &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, отрезки пересекающие &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, и внутренние отрезки во множество &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; (пример на ''рисунке справа'').&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем вызвать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и построить &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(|L_v|) = O(|S_v|)&amp;lt;/tex&amp;gt; времени. Но мы натыкаемся на новую проблему: передавая множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, необходимо найти соответствующие множества сыновей узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Неупорядоченные множества &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt; строятся легко. Множество &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; будет найдено вызовом функции &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; для нахождения &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt; в функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; за линейное время вставкой (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левая вершина отрезка) или удалением (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; правая вершина отрезка) отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Но как получить &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; без сортировки?&lt;br /&gt;
&lt;br /&gt;
Для листьев мы сделаем проверку вначале, и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; известны, и все сыновья узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; - листья. Для начала запустим функцию &amp;lt;tex&amp;gt;Split(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt;. Теперь мы должны найти &amp;lt;tex&amp;gt;Int(D_s, S_v') = Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v) \cup Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;, но мы не знаем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и, соответственно, можем найти только &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к множеству &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; вставкой или удалением отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;. Теперь можем продолжить вычисление &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; слиянием &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конечная функция будет выглядеть так:&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2N&amp;lt;/tex&amp;gt; концов отрезков по абсциссе&lt;br /&gt;
         и найдем &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;i = 1, ..., 2N&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L_r \leftarrow (s(1))&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;I_r \leftarrow S_0 \setminus (\{s(1)\} \cup \{s(2N)\})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_r, I_r, 1, 2N, R_r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(L_v, I_v, a, b, R_v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b) / 2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделяем отрезки из &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{ls(v)}, I_{ls(v)}, a, c, R_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левый конец отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; вставить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; удалить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{rs(v)}, I_{rs(v)}, c, b, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;s \in I_v&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         Найдем &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; используя двоичный поиск;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, I_v)&amp;lt;/tex&amp;gt; используя значения, полученные шагом выше;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R_v \leftarrow Merge_b(Q_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что нахождение &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; надо делать аккуратно, так как множества &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; могут иметь одни и те же отрезки (которые '''пересекают''' &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;). Мы нашли их пересечения с &amp;lt;tex&amp;gt;D_v&amp;lt;/tex&amp;gt; при поиске &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;, и не должны вывести эти пересечения снова.&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
&lt;br /&gt;
Для начала рассчитаем место, необходимое для выполнения алгоритма. Алгоритм использует рекурсивную функцию &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Последовательность вызовов функции может занять память. Эта последовательность может быть представлена как путь корня рекурсивного дерева, до узла. Соответствующий вызов этого узла занимает &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти, каждый его &amp;quot;предок&amp;quot; занимает &amp;lt;tex&amp;gt;O(|I_v| + |Q_v|)&amp;lt;/tex&amp;gt; памяти, а остальные структуры используют &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;. Очевидно, что любой путь &amp;lt;tex&amp;gt;pt&amp;lt;/tex&amp;gt; от корня рекурсивного дерева до какого-то узла &amp;lt;tex&amp;gt;\sum_{v \in pt}(|I_v + |Q_v|) = O(N)(|I_v| \le b_v - a_v \le \lceil (b_{ft(v)} - a_{ft(v)})/2 \rceil)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге для работы алгоритма требуется &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall v \in V \  |S_v'| \le a_v - b_v + |Int(D_v, S_v')|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma1|первой леммы]] и очевидного факта, что для любого множества &amp;lt;tex&amp;gt;S \subset S_0&amp;lt;/tex&amp;gt;, количество концов отрезков, лежащих в полосе &amp;lt;tex&amp;gt;\langle a_v, b_v \rangle&amp;lt;/tex&amp;gt;, меньше чем  &amp;lt;tex&amp;gt;b_v - a_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#1&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in V} |S_v'| \le 2N \lceil logN + 1 \rceil + K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma2|леммы №2]] и следующего отношения &amp;lt;tex&amp;gt;\sum_v (b_v - a_v) \le 2N \lceil logN + 1 \rceil&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Обозначим множество всех вершин рекурсивного дерева за &amp;lt;tex&amp;gt;RT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le N \lceil 4logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для всех узлов, кроме корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; имеет место выражение &amp;lt;tex&amp;gt;|S_v| \le |S_{ft(v)}'|&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le |S_r| + \sum_{v \in RT \setminus r} |S_{ft(v)}| \le N + 2 \sum_{v \in V} |S_v'| \le N \lceil 4 logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Начальная сортировка и инициализация множеств &amp;lt;tex&amp;gt;L_r&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_r&amp;lt;/tex&amp;gt; может быть произведена за &amp;lt;tex&amp;gt;O(N logN)&amp;lt;/tex&amp;gt; времени. Время работы функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; является суммой длительностей всех его вызовов. Каждый вызов от внешних узлов добавляет к этой сумме &amp;lt;tex&amp;gt;O(|L_v| + |Int_{a, b}(L_v)|)&amp;lt;/tex&amp;gt;. Для внутренних же узлов, время требуемое для поиска &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;O(|I_v| log N)&amp;lt;/tex&amp;gt;, а для остальных &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')|)&amp;lt;/tex&amp;gt;. Если мы все это сложим, то придем к выводу, что наш алгоритм работает за &amp;lt;tex&amp;gt;O(N log^2 N + K)&amp;lt;/tex&amp;gt;. Заметим, что его скорость можно увеличить до &amp;lt;tex&amp;gt;O(N logN + K)&amp;lt;/tex&amp;gt;, если не будем учитывать время нахождения &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Соответственно в оптимальном алгоритме Балабана &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; находится за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33838</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33838"/>
				<updated>2013-11-30T08:03:34Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Основные понятия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Рассмотрим несколько самых распространенных алгоритмов:&lt;br /&gt;
&lt;br /&gt;
# Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, и его суть заключается в проверке попарного пересечения отрезков.&lt;br /&gt;
# Сложнее, но эффективнее алгоритм Бентли-Оттмана &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой.&lt;br /&gt;
# Алгоритм, предложенный Чазелле и Едельсбруннером &amp;lt;ref&amp;gt;[http://www.cs.princeton.edu/~chazelle/pubs/IntersectLineSegments.pdf ''An optimal algorithm for intersecting line segments in the plane'']&amp;lt;/ref&amp;gt;, имеет лучшую оценку &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt;, но в отличие от предыдущих методов требует квадратичной памяти.&lt;br /&gt;
# Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти, где К - число пересекающихся отрезков.&lt;br /&gt;
&lt;br /&gt;
При количестве отрезков от 2000, и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма, в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.&lt;br /&gt;
&lt;br /&gt;
==Основные понятия==&lt;br /&gt;
&lt;br /&gt;
Введем некоторые обозначения. Пусть &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; - множество всех точек пересечения отрезков из множества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;K = |Int(S)|&amp;lt;/tex&amp;gt; - количество таких пересечений ;&amp;lt;br&amp;gt;&lt;br /&gt;
Через &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; обозначим вертикальную полосу, которая ограничена прямыми &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s&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;br&amp;gt;&lt;br /&gt;
Рассмотрим взаимное расположение вертикальной полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и отрезка &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем говорить, что отрезок &amp;lt;tex&amp;gt;s&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; :&lt;br /&gt;
{{---}} '''охватывает''' (''span'') полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;l \le a \le b \le r&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{---}} '''внутренний''' (''inner'') для полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;a &amp;lt; l &amp;lt; r &amp;lt; b&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{---}} '''пересекает''' (''cross'') полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; в других случаях.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Два отрезка &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; называются ''пересекающимися внутри'' полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если их точка пересечения лежит в пределах этой полосы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для двух множеств отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; определим множество &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\{ {s, s'} | (s \in S, s' \in S') \&amp;amp; (s \ intersect \ s') \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Balaban_pic_1.png|280px|thumb|right|&amp;lt;tex&amp;gt;D = ((s_1, s_2, s_3), \langle a, b \rangle)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_4) = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_5) = 2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Int(D, \{s_4,\ s_5\}) = \{\{s_3,\ s_5\}\}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Обозначения &amp;lt;tex&amp;gt;Int_{a, b}(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int_{a, b}(S, S')&amp;lt;/tex&amp;gt; будут использоваться для описания подмножеств &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt;, состоящих из пересекающихся пар отрезков в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее фигурные скобки &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt; используются для определения неупорядоченных множеств, а круглые скобки &amp;lt;tex&amp;gt;()&amp;lt;/tex&amp;gt; используются для определения упорядоченных множеств.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
Введем отношение порядка на множестве отрезков &amp;lt;tex&amp;gt;s_1 &amp;lt;_a s_2&amp;lt;/tex&amp;gt; если оба отрезка пересекают вертикальную линию&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и точка пересечения этой прямой с отрезком &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; лежит ниже точки пересечения с &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
''Лестница'' &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; — это пара &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt;, в которой отрезки из множества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; удовлетворяют следующим условиям : &lt;br /&gt;
{{---}} любой отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
{{---}} нет пересечений отрезков внутри лестницы; &amp;lt;br&amp;gt;&lt;br /&gt;
{{---}} &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; упорядочена по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часть отрезков лестницы внутри полосы будем называть '''ступеньками'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем называть лестницу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; '''полной''' относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, если каждый отрезок из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; либо не охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, либо пересекает хотя бы одну из ступенек из множества &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть лестница &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; состоит из отрезков, пересекающих полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;|S| \le Ends_{a, b}(S) + |Int(D, S)|&amp;lt;/tex&amp;gt;,&amp;lt;br&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;Ends_{a, b}(S)&amp;lt;/tex&amp;gt; это число вершин отрезков из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, находящихся в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Если точка &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;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;i + 1&amp;lt;/tex&amp;gt;, тогда число &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; называется ''местоположением'' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на лестнице &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и обозначается как &amp;lt;tex&amp;gt;Loc(D, s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Имея лестницу &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; и множество отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, множество &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; можно найти за время &amp;lt;tex&amp;gt;O(|S| log|Q| + |Int(D, S)|)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;S’&amp;lt;/tex&amp;gt; упорядочено отношением &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x \in [a, b]&amp;lt;/tex&amp;gt;, тогда можно найти &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(|S| + |Q| + |Int(D, S)|)&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;
===Split===&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; разделяет входное множество отрезков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, охватывающих некоторую полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, на подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt; так, что лестница &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Пусть &amp;lt;tex&amp;gt;L = (s_1 ,..., s_k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;s_i &amp;lt;_a s_{i+1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;Split_{a, b}(L, Q, L')&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L' \leftarrow \varnothing; Q \leftarrow \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;j = 1,...,k&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         '''if''' отрезок &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; не пересекает&lt;br /&gt;
         последний отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; внутри полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
         и при этом охватывает её '''then'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;Q;&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''else'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;L';&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция работает за &amp;lt;tex&amp;gt;O(|L|)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
===Search In Strip===&lt;br /&gt;
&lt;br /&gt;
Зная &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; мы можем найти &amp;lt;tex&amp;gt;Int_{a, b}(L)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; используя следующую рекурсивную функцию:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split(L, Q, L');&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;L' = \varnothing&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow Q;&amp;lt;/tex&amp;gt; &lt;br /&gt;
         '''return'''&amp;lt;tex&amp;gt;;&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int_{a, b}(Q, L');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;SearchInStrip_{a, b} (L', R');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R \leftarrow Merge_b(Q, R’);&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь, &amp;lt;tex&amp;gt;Merge_x(S_1, S_2)&amp;lt;/tex&amp;gt; это функция объединения множеств &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;, упорядоченных по отношению &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;. Время выполнения &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; эквивалентно сумме времён каждого её запуска. Очевидно, что время работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той функции, будет равно &amp;lt;tex&amp;gt;O(|L_i| + |Int_{a, b}(Q_i, {L_i}')|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_i, Q_i, {L_i}'&amp;lt;/tex&amp;gt; это соответствующие наборы &amp;lt;tex&amp;gt;(L_0 = L, L_{i+1} = {L_i}')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Учитывая [[#lemma1|лемму]], заключаем, что функция &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(|L| + |Int_{a, b}(L)|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что все отрезки лежат в полосе &amp;lt;tex&amp;gt;\langle a, b\rangle&amp;lt;/tex&amp;gt;. Таким образом в самом начале у нас есть пара &amp;lt;tex&amp;gt;(S, \langle a, b\rangle)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Что же дальше происходит: множество &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; ''распадается'' в подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, после чего лестница &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; становится полной относительно множества &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Необходимо найти пересечения отрезков из &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, затем, все пересечения в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Чтобы найти пересечения отрезков в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, мы ''режем'' полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и множество &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; по вертикале &amp;lt;tex&amp;gt;x = c&amp;lt;/tex&amp;gt; на полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; и множества &amp;lt;tex&amp;gt;S'_{ls}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S'_{rs}&amp;lt;/tex&amp;gt; соответственно, где &amp;lt;tex&amp;gt;c&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;(S'_{ls}, \langle a, c \rangle)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(S'_{rs}, \langle c, b \rangle)&amp;lt;/tex&amp;gt;. Ключевым является тот факт, что согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;|S'| \le Ends_{a, b}(S') + |Int(D, S')|&amp;lt;/tex&amp;gt;, таким образом, число дополнительных отрезков, появляющихся после ''разрезаний'' пропорционально числу найденных пересечений.&lt;br /&gt;
&lt;br /&gt;
===Ключевые моменты===&lt;br /&gt;
&lt;br /&gt;
Давайте разберемся с алгоритмом более подробно:&lt;br /&gt;
&lt;br /&gt;
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы (в конечном счете, их можно будет отсортировать введением дополнительных свойств). Будем рассматривать целые координаты на промежутке &amp;lt;tex&amp;gt;[1, 2N]&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; слева направо конец отрезка множества &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; отрезок, которому он принадлежит соответственно.&lt;br /&gt;
&lt;br /&gt;
Основная задача нашего алгоритма, это рекурсивная функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Соединим каждый вызов функции с узлом некоего двоичного дерева (далее ''рекурсивное дерево''). Соответствующим узлом отметим все значения, множества и параметры вызова. Обозначим множество внутренних вершин за &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0):&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2 \cdot N&amp;lt;/tex&amp;gt; вершин по координатам и&lt;br /&gt;
         найдем &amp;lt;tex&amp;gt;p_i, s(i), i = 1,...,2 \cdot N;\ S_r \leftarrow S_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_r, 1, 2 \cdot N)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(S_v, a, b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow&amp;lt;/tex&amp;gt; отсортируем &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;; &lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Разделим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; так, что лестница&lt;br /&gt;
         &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt; будет полной, относительно множества &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b)/2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделим отрезки из &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; на пересекающих&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{ls}(v)&amp;lt;/tex&amp;gt; и&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{rs}(v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{ls}(v), a, c)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{rs}(v), c, b)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда и дальше &amp;lt;tex&amp;gt;ls(v)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;rs(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;ft(v)&amp;lt;/tex&amp;gt; означают, соответственно, левого сына, правого сына, и отцовскую вершину узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Наша задача показать, что все операции с узлом &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; происходят за &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')| + (a_v - b_v)logN)&amp;lt;/tex&amp;gt;, для этого возьмем во внимание, что &amp;lt;tex&amp;gt;\sum_v |S_v| = O(N \cdot logN + K)&amp;lt;/tex&amp;gt; (очевидно, что &amp;lt;tex&amp;gt;\sum_v |Int(D_v, S_v')| \le K&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Balaban_pic_2.png|280px|thumb|right|&amp;lt;tex&amp;gt;S_v = (s_1, s_2, s_3, s_4, s_5)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L_v = (s_1, s_3)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v = (s_3, s_4)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v = (s_2, s_5)&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; похожа на функцию &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt;. Основная разница заключается в том, что &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; вызывает себя без изменения полосы, когда &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; делит полосу на две части, после чего рекурсивно вызывает себя для них. Другое отличие заключается в том, что множество &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; не упорядочено так же, как &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. В результате мы не можем напрямую использовать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для эффективного деления &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы решить эту проблему, представим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; как объединение трех множеств:&lt;br /&gt;
множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;, неупорядоченного множества &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;, и множества &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_b&amp;lt;/tex&amp;gt;. Расположим отрезки из &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;, пересекающие границу &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, отрезки пересекающие &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, и внутренние отрезки во множество &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; (пример на ''рисунке справа'').&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем вызвать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и построить &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(|L_v|) = O(|S_v|)&amp;lt;/tex&amp;gt; времени. Но мы натыкаемся на новую проблему: передавая множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, необходимо найти соответствующие множества сыновей узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Неупорядоченные множества &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt; строятся легко. Множество &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; будет найдено вызовом функции &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; для нахождения &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt; в функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; за линейное время вставкой (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левая вершина отрезка) или удалением (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; правая вершина отрезка) отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Но как получить &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; без сортировки?&lt;br /&gt;
&lt;br /&gt;
Для листьев мы сделаем проверку вначале, и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; известны, и все сыновья узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; - листья. Для начала запустим функцию &amp;lt;tex&amp;gt;Split(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt;. Теперь мы должны найти &amp;lt;tex&amp;gt;Int(D_s, S_v') = Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v) \cup Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;, но мы не знаем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и, соответственно, можем найти только &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к множеству &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; вставкой или удалением отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;. Теперь можем продолжить вычисление &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; слиянием &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конечная функция будет выглядеть так:&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2N&amp;lt;/tex&amp;gt; концов отрезков по абсциссе&lt;br /&gt;
         и найдем &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;i = 1, ..., 2N&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L_r \leftarrow (s(1))&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;I_r \leftarrow S_0 \setminus (\{s(1)\} \cup \{s(2N)\})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_r, I_r, 1, 2N, R_r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(L_v, I_v, a, b, R_v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b) / 2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделяем отрезки из &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{ls(v)}, I_{ls(v)}, a, c, R_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левый конец отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; вставить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; удалить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{rs(v)}, I_{rs(v)}, c, b, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;s \in I_v&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         Найдем &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; используя двоичный поиск;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, I_v)&amp;lt;/tex&amp;gt; используя значения, полученные шагом выше;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R_v \leftarrow Merge_b(Q_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что нахождение &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; надо делать аккуратно, так как множества &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; могут иметь одни и те же отрезки (которые '''пересекают''' &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;). Мы нашли их пересечения с &amp;lt;tex&amp;gt;D_v&amp;lt;/tex&amp;gt; при поиске &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;, и не должны вывести эти пересечения снова.&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
&lt;br /&gt;
Для начала рассчитаем место, необходимое для выполнения алгоритма. Алгоритм использует рекурсивную функцию &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Последовательность вызовов функции может занять память. Эта последовательность может быть представлена как путь корня рекурсивного дерева, до узла. Соответствующий вызов этого узла занимает &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти, каждый его &amp;quot;предок&amp;quot; занимает &amp;lt;tex&amp;gt;O(|I_v| + |Q_v|)&amp;lt;/tex&amp;gt; памяти, а остальные структуры используют &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;. Очевидно, что любой путь &amp;lt;tex&amp;gt;pt&amp;lt;/tex&amp;gt; от корня рекурсивного дерева до какого-то узла &amp;lt;tex&amp;gt;\sum_{v \in pt}(|I_v + |Q_v|) = O(N)(|I_v| \le b_v - a_v \le \lceil (b_{ft(v)} - a_{ft(v)})/2 \rceil)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге для работы алгоритма требуется &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall v \in V \  |S_v'| \le a_v - b_v + |Int(D_v, S_v')|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma1|первой леммы]] и очевидного факта, что для любого множества &amp;lt;tex&amp;gt;S \subset S_0&amp;lt;/tex&amp;gt;, количество концов отрезков, лежащих в полосе &amp;lt;tex&amp;gt;\langle a_v, b_v \rangle&amp;lt;/tex&amp;gt;, меньше чем  &amp;lt;tex&amp;gt;b_v - a_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#1&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in V} |S_v'| \le 2N \lceil logN + 1 \rceil + K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma2|леммы №2]] и следующего отношения &amp;lt;tex&amp;gt;\sum_v (b_v - a_v) \le 2N \lceil logN + 1 \rceil&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Обозначим множество всех вершин рекурсивного дерева за &amp;lt;tex&amp;gt;RT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le N \lceil 4logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для всех узлов, кроме корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; имеет место выражение &amp;lt;tex&amp;gt;|S_v| \le |S_{ft(v)}'|&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le |S_r| + \sum_{v \in RT \setminus r} |S_{ft(v)}| \le N + 2 \sum_{v \in V} |S_v'| \le N \lceil 4 logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Начальная сортировка и инициализация множеств &amp;lt;tex&amp;gt;L_r&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_r&amp;lt;/tex&amp;gt; может быть произведена за &amp;lt;tex&amp;gt;O(N logN)&amp;lt;/tex&amp;gt; времени. Время работы функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; является суммой длительностей всех его вызовов. Каждый вызов от внешних узлов добавляет к этой сумме &amp;lt;tex&amp;gt;O(|L_v| + |Int_{a, b}(L_v)|)&amp;lt;/tex&amp;gt;. Для внутренних же узлов, время требуемое для поиска &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;O(|I_v| log N)&amp;lt;/tex&amp;gt;, а для остальных &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')|)&amp;lt;/tex&amp;gt;. Если мы все это сложим, то придем к выводу, что наш алгоритм работает за &amp;lt;tex&amp;gt;O(N log^2 N + K)&amp;lt;/tex&amp;gt;. Заметим, что его скорость можно увеличить до &amp;lt;tex&amp;gt;O(N logN + K)&amp;lt;/tex&amp;gt;, если не будем учитывать время нахождения &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Соответственно в оптимальном алгоритме Балабана &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; находится за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33837</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33837"/>
				<updated>2013-11-30T07:56:55Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Основные понятия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Рассмотрим несколько самых распространенных алгоритмов:&lt;br /&gt;
&lt;br /&gt;
# Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, и его суть заключается в проверке попарного пересечения отрезков.&lt;br /&gt;
# Сложнее, но эффективнее алгоритм Бентли-Оттмана &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой.&lt;br /&gt;
# Алгоритм, предложенный Чазелле и Едельсбруннером &amp;lt;ref&amp;gt;[http://www.cs.princeton.edu/~chazelle/pubs/IntersectLineSegments.pdf ''An optimal algorithm for intersecting line segments in the plane'']&amp;lt;/ref&amp;gt;, имеет лучшую оценку &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt;, но в отличие от предыдущих методов требует квадратичной памяти.&lt;br /&gt;
# Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти, где К - число пересекающихся отрезков.&lt;br /&gt;
&lt;br /&gt;
При количестве отрезков от 2000, и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма, в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.&lt;br /&gt;
&lt;br /&gt;
==Основные понятия==&lt;br /&gt;
&lt;br /&gt;
Введем некоторые обозначения. Пусть &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; - множество всех точек пересечения отрезков из множества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;K = |Int(S)|&amp;lt;/tex&amp;gt; - количество таких пересечений ;&amp;lt;br&amp;gt;&lt;br /&gt;
Через &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; обозначим вертикальную полосу, которая ограничена прямыми &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s&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;br&amp;gt;&lt;br /&gt;
Рассмотрим взаимное расположение вертикальной полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и отрезка &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем говорить, что отрезок &amp;lt;tex&amp;gt;s&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; :&lt;br /&gt;
{{---}} '''охватывает''' (''span'') полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;l \le a \le b \le r&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{---}} '''внутренний''' (''inner'') для полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;a &amp;lt; l &amp;lt; r &amp;lt; b&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{---}} '''пересекает''' (''cross'') полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; в других случаях.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Два отрезка &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; называются ''пересекающимися внутри'' полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если их точка пересечения лежит в пределах этой полосы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для двух множеств отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; определим множество &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\{ {s, s'} | (s \in S, s' \in S') \&amp;amp; (s \ intersect \ s') \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Balaban_pic_1.png|280px|thumb|right|&amp;lt;tex&amp;gt;D = ((s_1, s_2, s_3), \langle a, b \rangle)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_4) = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_5) = 2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Int(D, \{s_4,\ s_5\}) = \{\{s_3,\ s_5\}\}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Обозначения &amp;lt;tex&amp;gt;Int_{a, b}(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int_{a, b}(S, S')&amp;lt;/tex&amp;gt; будут использоваться для описания подмножеств &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt;, состоящих из пересекающихся пар отрезков в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;. Далее скобки &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt; используются для определения неупорядоченных множеств, а скобки &amp;lt;tex&amp;gt;()&amp;lt;/tex&amp;gt; используются для определения упорядоченных множеств.&lt;br /&gt;
&lt;br /&gt;
Введем отношение порядка на множестве отрезков &amp;lt;tex&amp;gt;s_1 &amp;lt;_a s_2&amp;lt;/tex&amp;gt; если оба отрезка пересекают вертикальную линию &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и&lt;br /&gt;
точка пересечения этой прямой с отрезком &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; лежит ниже точки пересечения с &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
''Лестница'' &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; — это пара &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt;, в которой отрезки из множества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; удовлетворяют следующим условиям : &lt;br /&gt;
− любой отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
− нет пересечений отрезков внутри лестницы; &amp;lt;br&amp;gt;&lt;br /&gt;
− &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; упорядочена по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часть отрезков лестницы внутри полосы будем называть '''ступеньками'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем называть лестницу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; '''полной''' относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, если каждый отрезок из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; либо не охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, либо пересекает хотя бы одну из ступенек из множества &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть лестница &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; состоит из отрезков, пересекающих полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;|S| \le Ends_{a, b}(S) + |Int(D, S)|&amp;lt;/tex&amp;gt;,&amp;lt;br&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;Ends_{a, b}(S)&amp;lt;/tex&amp;gt; это число вершин отрезков из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, находящихся в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Если точка &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;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;i + 1&amp;lt;/tex&amp;gt;, тогда число &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; называется ''местоположением'' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на лестнице &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и обозначается как &amp;lt;tex&amp;gt;Loc(D, s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Имея лестницу &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; и множество отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, множество &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; можно найти за время &amp;lt;tex&amp;gt;O(|S| log|Q| + |Int(D, S)|)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;S’&amp;lt;/tex&amp;gt; упорядочено отношением &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x \in [a, b]&amp;lt;/tex&amp;gt;, тогда можно найти &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(|S| + |Q| + |Int(D, S)|)&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;
===Split===&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; разделяет входное множество отрезков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, охватывающих некоторую полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, на подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt; так, что лестница &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Пусть &amp;lt;tex&amp;gt;L = (s_1 ,..., s_k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;s_i &amp;lt;_a s_{i+1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;Split_{a, b}(L, Q, L')&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L' \leftarrow \varnothing; Q \leftarrow \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;j = 1,...,k&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         '''if''' отрезок &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; не пересекает&lt;br /&gt;
         последний отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; внутри полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
         и при этом охватывает её '''then'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;Q;&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''else'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;L';&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция работает за &amp;lt;tex&amp;gt;O(|L|)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
===Search In Strip===&lt;br /&gt;
&lt;br /&gt;
Зная &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; мы можем найти &amp;lt;tex&amp;gt;Int_{a, b}(L)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; используя следующую рекурсивную функцию:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split(L, Q, L');&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;L' = \varnothing&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow Q;&amp;lt;/tex&amp;gt; &lt;br /&gt;
         '''return'''&amp;lt;tex&amp;gt;;&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int_{a, b}(Q, L');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;SearchInStrip_{a, b} (L', R');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R \leftarrow Merge_b(Q, R’);&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь, &amp;lt;tex&amp;gt;Merge_x(S_1, S_2)&amp;lt;/tex&amp;gt; это функция объединения множеств &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;, упорядоченных по отношению &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;. Время выполнения &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; эквивалентно сумме времён каждого её запуска. Очевидно, что время работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той функции, будет равно &amp;lt;tex&amp;gt;O(|L_i| + |Int_{a, b}(Q_i, {L_i}')|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_i, Q_i, {L_i}'&amp;lt;/tex&amp;gt; это соответствующие наборы &amp;lt;tex&amp;gt;(L_0 = L, L_{i+1} = {L_i}')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Учитывая [[#lemma1|лемму]], заключаем, что функция &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(|L| + |Int_{a, b}(L)|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что все отрезки лежат в полосе &amp;lt;tex&amp;gt;\langle a, b\rangle&amp;lt;/tex&amp;gt;. Таким образом в самом начале у нас есть пара &amp;lt;tex&amp;gt;(S, \langle a, b\rangle)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Что же дальше происходит: множество &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; ''распадается'' в подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, после чего лестница &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; становится полной относительно множества &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Необходимо найти пересечения отрезков из &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, затем, все пересечения в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Чтобы найти пересечения отрезков в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, мы ''режем'' полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и множество &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; по вертикале &amp;lt;tex&amp;gt;x = c&amp;lt;/tex&amp;gt; на полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; и множества &amp;lt;tex&amp;gt;S'_{ls}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S'_{rs}&amp;lt;/tex&amp;gt; соответственно, где &amp;lt;tex&amp;gt;c&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;(S'_{ls}, \langle a, c \rangle)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(S'_{rs}, \langle c, b \rangle)&amp;lt;/tex&amp;gt;. Ключевым является тот факт, что согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;|S'| \le Ends_{a, b}(S') + |Int(D, S')|&amp;lt;/tex&amp;gt;, таким образом, число дополнительных отрезков, появляющихся после ''разрезаний'' пропорционально числу найденных пересечений.&lt;br /&gt;
&lt;br /&gt;
===Ключевые моменты===&lt;br /&gt;
&lt;br /&gt;
Давайте разберемся с алгоритмом более подробно:&lt;br /&gt;
&lt;br /&gt;
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы (в конечном счете, их можно будет отсортировать введением дополнительных свойств). Будем рассматривать целые координаты на промежутке &amp;lt;tex&amp;gt;[1, 2N]&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; слева направо конец отрезка множества &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; отрезок, которому он принадлежит соответственно.&lt;br /&gt;
&lt;br /&gt;
Основная задача нашего алгоритма, это рекурсивная функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Соединим каждый вызов функции с узлом некоего двоичного дерева (далее ''рекурсивное дерево''). Соответствующим узлом отметим все значения, множества и параметры вызова. Обозначим множество внутренних вершин за &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0):&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2 \cdot N&amp;lt;/tex&amp;gt; вершин по координатам и&lt;br /&gt;
         найдем &amp;lt;tex&amp;gt;p_i, s(i), i = 1,...,2 \cdot N;\ S_r \leftarrow S_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_r, 1, 2 \cdot N)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(S_v, a, b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow&amp;lt;/tex&amp;gt; отсортируем &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;; &lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Разделим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; так, что лестница&lt;br /&gt;
         &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt; будет полной, относительно множества &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b)/2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделим отрезки из &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; на пересекающих&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{ls}(v)&amp;lt;/tex&amp;gt; и&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{rs}(v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{ls}(v), a, c)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{rs}(v), c, b)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда и дальше &amp;lt;tex&amp;gt;ls(v)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;rs(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;ft(v)&amp;lt;/tex&amp;gt; означают, соответственно, левого сына, правого сына, и отцовскую вершину узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Наша задача показать, что все операции с узлом &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; происходят за &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')| + (a_v - b_v)logN)&amp;lt;/tex&amp;gt;, для этого возьмем во внимание, что &amp;lt;tex&amp;gt;\sum_v |S_v| = O(N \cdot logN + K)&amp;lt;/tex&amp;gt; (очевидно, что &amp;lt;tex&amp;gt;\sum_v |Int(D_v, S_v')| \le K&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Balaban_pic_2.png|280px|thumb|right|&amp;lt;tex&amp;gt;S_v = (s_1, s_2, s_3, s_4, s_5)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L_v = (s_1, s_3)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v = (s_3, s_4)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v = (s_2, s_5)&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; похожа на функцию &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt;. Основная разница заключается в том, что &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; вызывает себя без изменения полосы, когда &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; делит полосу на две части, после чего рекурсивно вызывает себя для них. Другое отличие заключается в том, что множество &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; не упорядочено так же, как &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. В результате мы не можем напрямую использовать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для эффективного деления &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы решить эту проблему, представим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; как объединение трех множеств:&lt;br /&gt;
множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;, неупорядоченного множества &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;, и множества &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_b&amp;lt;/tex&amp;gt;. Расположим отрезки из &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;, пересекающие границу &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, отрезки пересекающие &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, и внутренние отрезки во множество &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; (пример на ''рисунке справа'').&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем вызвать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и построить &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(|L_v|) = O(|S_v|)&amp;lt;/tex&amp;gt; времени. Но мы натыкаемся на новую проблему: передавая множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, необходимо найти соответствующие множества сыновей узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Неупорядоченные множества &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt; строятся легко. Множество &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; будет найдено вызовом функции &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; для нахождения &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt; в функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; за линейное время вставкой (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левая вершина отрезка) или удалением (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; правая вершина отрезка) отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Но как получить &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; без сортировки?&lt;br /&gt;
&lt;br /&gt;
Для листьев мы сделаем проверку вначале, и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; известны, и все сыновья узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; - листья. Для начала запустим функцию &amp;lt;tex&amp;gt;Split(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt;. Теперь мы должны найти &amp;lt;tex&amp;gt;Int(D_s, S_v') = Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v) \cup Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;, но мы не знаем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и, соответственно, можем найти только &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к множеству &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; вставкой или удалением отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;. Теперь можем продолжить вычисление &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; слиянием &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конечная функция будет выглядеть так:&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2N&amp;lt;/tex&amp;gt; концов отрезков по абсциссе&lt;br /&gt;
         и найдем &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;i = 1, ..., 2N&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L_r \leftarrow (s(1))&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;I_r \leftarrow S_0 \setminus (\{s(1)\} \cup \{s(2N)\})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_r, I_r, 1, 2N, R_r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(L_v, I_v, a, b, R_v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b) / 2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделяем отрезки из &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{ls(v)}, I_{ls(v)}, a, c, R_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левый конец отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; вставить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; удалить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{rs(v)}, I_{rs(v)}, c, b, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;s \in I_v&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         Найдем &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; используя двоичный поиск;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, I_v)&amp;lt;/tex&amp;gt; используя значения, полученные шагом выше;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R_v \leftarrow Merge_b(Q_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что нахождение &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; надо делать аккуратно, так как множества &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; могут иметь одни и те же отрезки (которые '''пересекают''' &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;). Мы нашли их пересечения с &amp;lt;tex&amp;gt;D_v&amp;lt;/tex&amp;gt; при поиске &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;, и не должны вывести эти пересечения снова.&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
&lt;br /&gt;
Для начала рассчитаем место, необходимое для выполнения алгоритма. Алгоритм использует рекурсивную функцию &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Последовательность вызовов функции может занять память. Эта последовательность может быть представлена как путь корня рекурсивного дерева, до узла. Соответствующий вызов этого узла занимает &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти, каждый его &amp;quot;предок&amp;quot; занимает &amp;lt;tex&amp;gt;O(|I_v| + |Q_v|)&amp;lt;/tex&amp;gt; памяти, а остальные структуры используют &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;. Очевидно, что любой путь &amp;lt;tex&amp;gt;pt&amp;lt;/tex&amp;gt; от корня рекурсивного дерева до какого-то узла &amp;lt;tex&amp;gt;\sum_{v \in pt}(|I_v + |Q_v|) = O(N)(|I_v| \le b_v - a_v \le \lceil (b_{ft(v)} - a_{ft(v)})/2 \rceil)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге для работы алгоритма требуется &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall v \in V \  |S_v'| \le a_v - b_v + |Int(D_v, S_v')|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma1|первой леммы]] и очевидного факта, что для любого множества &amp;lt;tex&amp;gt;S \subset S_0&amp;lt;/tex&amp;gt;, количество концов отрезков, лежащих в полосе &amp;lt;tex&amp;gt;\langle a_v, b_v \rangle&amp;lt;/tex&amp;gt;, меньше чем  &amp;lt;tex&amp;gt;b_v - a_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#1&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in V} |S_v'| \le 2N \lceil logN + 1 \rceil + K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma2|леммы №2]] и следующего отношения &amp;lt;tex&amp;gt;\sum_v (b_v - a_v) \le 2N \lceil logN + 1 \rceil&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Обозначим множество всех вершин рекурсивного дерева за &amp;lt;tex&amp;gt;RT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le N \lceil 4logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для всех узлов, кроме корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; имеет место выражение &amp;lt;tex&amp;gt;|S_v| \le |S_{ft(v)}'|&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le |S_r| + \sum_{v \in RT \setminus r} |S_{ft(v)}| \le N + 2 \sum_{v \in V} |S_v'| \le N \lceil 4 logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Начальная сортировка и инициализация множеств &amp;lt;tex&amp;gt;L_r&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_r&amp;lt;/tex&amp;gt; может быть произведена за &amp;lt;tex&amp;gt;O(N logN)&amp;lt;/tex&amp;gt; времени. Время работы функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; является суммой длительностей всех его вызовов. Каждый вызов от внешних узлов добавляет к этой сумме &amp;lt;tex&amp;gt;O(|L_v| + |Int_{a, b}(L_v)|)&amp;lt;/tex&amp;gt;. Для внутренних же узлов, время требуемое для поиска &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;O(|I_v| log N)&amp;lt;/tex&amp;gt;, а для остальных &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')|)&amp;lt;/tex&amp;gt;. Если мы все это сложим, то придем к выводу, что наш алгоритм работает за &amp;lt;tex&amp;gt;O(N log^2 N + K)&amp;lt;/tex&amp;gt;. Заметим, что его скорость можно увеличить до &amp;lt;tex&amp;gt;O(N logN + K)&amp;lt;/tex&amp;gt;, если не будем учитывать время нахождения &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Соответственно в оптимальном алгоритме Балабана &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; находится за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33836</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33836"/>
				<updated>2013-11-30T07:54:15Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Рассмотрим несколько самых распространенных алгоритмов:&lt;br /&gt;
&lt;br /&gt;
# Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, и его суть заключается в проверке попарного пересечения отрезков.&lt;br /&gt;
# Сложнее, но эффективнее алгоритм Бентли-Оттмана &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой.&lt;br /&gt;
# Алгоритм, предложенный Чазелле и Едельсбруннером &amp;lt;ref&amp;gt;[http://www.cs.princeton.edu/~chazelle/pubs/IntersectLineSegments.pdf ''An optimal algorithm for intersecting line segments in the plane'']&amp;lt;/ref&amp;gt;, имеет лучшую оценку &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt;, но в отличие от предыдущих методов требует квадратичной памяти.&lt;br /&gt;
# Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти, где К - число пересекающихся отрезков.&lt;br /&gt;
&lt;br /&gt;
При количестве отрезков от 2000, и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма, в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.&lt;br /&gt;
&lt;br /&gt;
==Основные понятия==&lt;br /&gt;
&lt;br /&gt;
Введем некоторые обозначения. Пусть &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; - множество всех точек пересечения отрезков из множества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;K = |Int(S)|&amp;lt;/tex&amp;gt; - количество таких пересечений ;&amp;lt;br&amp;gt;&lt;br /&gt;
Через &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; обозначим вертикальную полосу, которая ограничена прямыми &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s&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;br&amp;gt;&lt;br /&gt;
Рассмотрим взаимное расположение вертикальной полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и отрезка &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем говорить, что отрезок &amp;lt;tex&amp;gt;s&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; : &lt;br /&gt;
- '''охватывает'''(span) полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;l \le a \le b \le r&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
- '''внутренний'''(inner) для полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;a &amp;lt; l &amp;lt; r &amp;lt; b&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
- '''пересекает'''(cross) полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; в других случаях.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Два отрезка &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; называются ''пересекающимися внутри'' полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если их точка пересечения лежит в пределах этой полосы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для двух множеств отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; определим множество &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\{ {s, s'} | (s \in S, s' \in S') \&amp;amp; (s \ intersect \ s') \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Balaban_pic_1.png|280px|thumb|right|&amp;lt;tex&amp;gt;D = ((s_1, s_2, s_3), \langle a, b \rangle)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_4) = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_5) = 2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Int(D, \{s_4,\ s_5\}) = \{\{s_3,\ s_5\}\}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Обозначения &amp;lt;tex&amp;gt;Int_{a, b}(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int_{a, b}(S, S')&amp;lt;/tex&amp;gt; будут использоваться для описания подмножеств &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt;, состоящих из пересекающихся пар отрезков в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;. Далее скобки &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt; используются для определения неупорядоченных множеств, а скобки &amp;lt;tex&amp;gt;()&amp;lt;/tex&amp;gt; используются для определения упорядоченных множеств.&lt;br /&gt;
&lt;br /&gt;
Введем отношение порядка на множестве отрезков &amp;lt;tex&amp;gt;s_1 &amp;lt;_a s_2&amp;lt;/tex&amp;gt; если оба отрезка пересекают вертикальную линию &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и&lt;br /&gt;
точка пересечения этой прямой с отрезком &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; лежит ниже точки пересечения с &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
''Лестница'' &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; — это пара &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt;, в которой отрезки из множества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; удовлетворяют следующим условиям : &lt;br /&gt;
− любой отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
− нет пересечений отрезков внутри лестницы; &amp;lt;br&amp;gt;&lt;br /&gt;
− &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; упорядочена по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часть отрезков лестницы внутри полосы будем называть '''ступеньками'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем называть лестницу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; '''полной''' относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, если каждый отрезок из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; либо не охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, либо пересекает хотя бы одну из ступенек из множества &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть лестница &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; состоит из отрезков, пересекающих полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;|S| \le Ends_{a, b}(S) + |Int(D, S)|&amp;lt;/tex&amp;gt;,&amp;lt;br&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;Ends_{a, b}(S)&amp;lt;/tex&amp;gt; это число вершин отрезков из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, находящихся в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Если точка &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;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;i + 1&amp;lt;/tex&amp;gt;, тогда число &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; называется ''местоположением'' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на лестнице &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и обозначается как &amp;lt;tex&amp;gt;Loc(D, s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Имея лестницу &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; и множество отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, множество &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; можно найти за время &amp;lt;tex&amp;gt;O(|S| log|Q| + |Int(D, S)|)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;S’&amp;lt;/tex&amp;gt; упорядочено отношением &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x \in [a, b]&amp;lt;/tex&amp;gt;, тогда можно найти &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(|S| + |Q| + |Int(D, S)|)&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;
===Split===&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; разделяет входное множество отрезков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, охватывающих некоторую полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, на подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt; так, что лестница &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Пусть &amp;lt;tex&amp;gt;L = (s_1 ,..., s_k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;s_i &amp;lt;_a s_{i+1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;Split_{a, b}(L, Q, L')&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L' \leftarrow \varnothing; Q \leftarrow \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;j = 1,...,k&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         '''if''' отрезок &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; не пересекает&lt;br /&gt;
         последний отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; внутри полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
         и при этом охватывает её '''then'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;Q;&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''else'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;L';&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция работает за &amp;lt;tex&amp;gt;O(|L|)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
===Search In Strip===&lt;br /&gt;
&lt;br /&gt;
Зная &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; мы можем найти &amp;lt;tex&amp;gt;Int_{a, b}(L)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; используя следующую рекурсивную функцию:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split(L, Q, L');&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;L' = \varnothing&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow Q;&amp;lt;/tex&amp;gt; &lt;br /&gt;
         '''return'''&amp;lt;tex&amp;gt;;&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int_{a, b}(Q, L');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;SearchInStrip_{a, b} (L', R');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R \leftarrow Merge_b(Q, R’);&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь, &amp;lt;tex&amp;gt;Merge_x(S_1, S_2)&amp;lt;/tex&amp;gt; это функция объединения множеств &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;, упорядоченных по отношению &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;. Время выполнения &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; эквивалентно сумме времён каждого её запуска. Очевидно, что время работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той функции, будет равно &amp;lt;tex&amp;gt;O(|L_i| + |Int_{a, b}(Q_i, {L_i}')|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_i, Q_i, {L_i}'&amp;lt;/tex&amp;gt; это соответствующие наборы &amp;lt;tex&amp;gt;(L_0 = L, L_{i+1} = {L_i}')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Учитывая [[#lemma1|лемму]], заключаем, что функция &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(|L| + |Int_{a, b}(L)|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что все отрезки лежат в полосе &amp;lt;tex&amp;gt;\langle a, b\rangle&amp;lt;/tex&amp;gt;. Таким образом в самом начале у нас есть пара &amp;lt;tex&amp;gt;(S, \langle a, b\rangle)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Что же дальше происходит: множество &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; ''распадается'' в подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, после чего лестница &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; становится полной относительно множества &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Необходимо найти пересечения отрезков из &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, затем, все пересечения в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Чтобы найти пересечения отрезков в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, мы ''режем'' полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и множество &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; по вертикале &amp;lt;tex&amp;gt;x = c&amp;lt;/tex&amp;gt; на полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; и множества &amp;lt;tex&amp;gt;S'_{ls}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S'_{rs}&amp;lt;/tex&amp;gt; соответственно, где &amp;lt;tex&amp;gt;c&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;(S'_{ls}, \langle a, c \rangle)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(S'_{rs}, \langle c, b \rangle)&amp;lt;/tex&amp;gt;. Ключевым является тот факт, что согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;|S'| \le Ends_{a, b}(S') + |Int(D, S')|&amp;lt;/tex&amp;gt;, таким образом, число дополнительных отрезков, появляющихся после ''разрезаний'' пропорционально числу найденных пересечений.&lt;br /&gt;
&lt;br /&gt;
===Ключевые моменты===&lt;br /&gt;
&lt;br /&gt;
Давайте разберемся с алгоритмом более подробно:&lt;br /&gt;
&lt;br /&gt;
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы (в конечном счете, их можно будет отсортировать введением дополнительных свойств). Будем рассматривать целые координаты на промежутке &amp;lt;tex&amp;gt;[1, 2N]&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; слева направо конец отрезка множества &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; отрезок, которому он принадлежит соответственно.&lt;br /&gt;
&lt;br /&gt;
Основная задача нашего алгоритма, это рекурсивная функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Соединим каждый вызов функции с узлом некоего двоичного дерева (далее ''рекурсивное дерево''). Соответствующим узлом отметим все значения, множества и параметры вызова. Обозначим множество внутренних вершин за &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0):&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2 \cdot N&amp;lt;/tex&amp;gt; вершин по координатам и&lt;br /&gt;
         найдем &amp;lt;tex&amp;gt;p_i, s(i), i = 1,...,2 \cdot N;\ S_r \leftarrow S_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_r, 1, 2 \cdot N)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(S_v, a, b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow&amp;lt;/tex&amp;gt; отсортируем &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;; &lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Разделим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; так, что лестница&lt;br /&gt;
         &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt; будет полной, относительно множества &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b)/2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделим отрезки из &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; на пересекающих&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{ls}(v)&amp;lt;/tex&amp;gt; и&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{rs}(v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{ls}(v), a, c)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{rs}(v), c, b)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда и дальше &amp;lt;tex&amp;gt;ls(v)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;rs(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;ft(v)&amp;lt;/tex&amp;gt; означают, соответственно, левого сына, правого сына, и отцовскую вершину узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Наша задача показать, что все операции с узлом &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; происходят за &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')| + (a_v - b_v)logN)&amp;lt;/tex&amp;gt;, для этого возьмем во внимание, что &amp;lt;tex&amp;gt;\sum_v |S_v| = O(N \cdot logN + K)&amp;lt;/tex&amp;gt; (очевидно, что &amp;lt;tex&amp;gt;\sum_v |Int(D_v, S_v')| \le K&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Balaban_pic_2.png|280px|thumb|right|&amp;lt;tex&amp;gt;S_v = (s_1, s_2, s_3, s_4, s_5)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L_v = (s_1, s_3)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v = (s_3, s_4)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v = (s_2, s_5)&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; похожа на функцию &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt;. Основная разница заключается в том, что &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; вызывает себя без изменения полосы, когда &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; делит полосу на две части, после чего рекурсивно вызывает себя для них. Другое отличие заключается в том, что множество &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; не упорядочено так же, как &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. В результате мы не можем напрямую использовать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для эффективного деления &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы решить эту проблему, представим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; как объединение трех множеств:&lt;br /&gt;
множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;, неупорядоченного множества &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;, и множества &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_b&amp;lt;/tex&amp;gt;. Расположим отрезки из &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;, пересекающие границу &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, отрезки пересекающие &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, и внутренние отрезки во множество &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; (пример на ''рисунке справа'').&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем вызвать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и построить &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(|L_v|) = O(|S_v|)&amp;lt;/tex&amp;gt; времени. Но мы натыкаемся на новую проблему: передавая множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, необходимо найти соответствующие множества сыновей узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Неупорядоченные множества &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt; строятся легко. Множество &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; будет найдено вызовом функции &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; для нахождения &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt; в функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; за линейное время вставкой (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левая вершина отрезка) или удалением (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; правая вершина отрезка) отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Но как получить &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; без сортировки?&lt;br /&gt;
&lt;br /&gt;
Для листьев мы сделаем проверку вначале, и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; известны, и все сыновья узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; - листья. Для начала запустим функцию &amp;lt;tex&amp;gt;Split(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt;. Теперь мы должны найти &amp;lt;tex&amp;gt;Int(D_s, S_v') = Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v) \cup Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;, но мы не знаем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и, соответственно, можем найти только &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к множеству &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; вставкой или удалением отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;. Теперь можем продолжить вычисление &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; слиянием &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конечная функция будет выглядеть так:&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2N&amp;lt;/tex&amp;gt; концов отрезков по абсциссе&lt;br /&gt;
         и найдем &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;i = 1, ..., 2N&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L_r \leftarrow (s(1))&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;I_r \leftarrow S_0 \setminus (\{s(1)\} \cup \{s(2N)\})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_r, I_r, 1, 2N, R_r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(L_v, I_v, a, b, R_v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b) / 2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделяем отрезки из &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{ls(v)}, I_{ls(v)}, a, c, R_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левый конец отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; вставить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; удалить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{rs(v)}, I_{rs(v)}, c, b, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;s \in I_v&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         Найдем &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; используя двоичный поиск;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, I_v)&amp;lt;/tex&amp;gt; используя значения, полученные шагом выше;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R_v \leftarrow Merge_b(Q_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что нахождение &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; надо делать аккуратно, так как множества &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; могут иметь одни и те же отрезки (которые '''пересекают''' &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;). Мы нашли их пересечения с &amp;lt;tex&amp;gt;D_v&amp;lt;/tex&amp;gt; при поиске &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;, и не должны вывести эти пересечения снова.&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
&lt;br /&gt;
Для начала рассчитаем место, необходимое для выполнения алгоритма. Алгоритм использует рекурсивную функцию &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Последовательность вызовов функции может занять память. Эта последовательность может быть представлена как путь корня рекурсивного дерева, до узла. Соответствующий вызов этого узла занимает &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти, каждый его &amp;quot;предок&amp;quot; занимает &amp;lt;tex&amp;gt;O(|I_v| + |Q_v|)&amp;lt;/tex&amp;gt; памяти, а остальные структуры используют &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;. Очевидно, что любой путь &amp;lt;tex&amp;gt;pt&amp;lt;/tex&amp;gt; от корня рекурсивного дерева до какого-то узла &amp;lt;tex&amp;gt;\sum_{v \in pt}(|I_v + |Q_v|) = O(N)(|I_v| \le b_v - a_v \le \lceil (b_{ft(v)} - a_{ft(v)})/2 \rceil)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге для работы алгоритма требуется &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall v \in V \  |S_v'| \le a_v - b_v + |Int(D_v, S_v')|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma1|первой леммы]] и очевидного факта, что для любого множества &amp;lt;tex&amp;gt;S \subset S_0&amp;lt;/tex&amp;gt;, количество концов отрезков, лежащих в полосе &amp;lt;tex&amp;gt;\langle a_v, b_v \rangle&amp;lt;/tex&amp;gt;, меньше чем  &amp;lt;tex&amp;gt;b_v - a_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#1&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in V} |S_v'| \le 2N \lceil logN + 1 \rceil + K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma2|леммы №2]] и следующего отношения &amp;lt;tex&amp;gt;\sum_v (b_v - a_v) \le 2N \lceil logN + 1 \rceil&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Обозначим множество всех вершин рекурсивного дерева за &amp;lt;tex&amp;gt;RT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le N \lceil 4logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для всех узлов, кроме корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; имеет место выражение &amp;lt;tex&amp;gt;|S_v| \le |S_{ft(v)}'|&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le |S_r| + \sum_{v \in RT \setminus r} |S_{ft(v)}| \le N + 2 \sum_{v \in V} |S_v'| \le N \lceil 4 logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Начальная сортировка и инициализация множеств &amp;lt;tex&amp;gt;L_r&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_r&amp;lt;/tex&amp;gt; может быть произведена за &amp;lt;tex&amp;gt;O(N logN)&amp;lt;/tex&amp;gt; времени. Время работы функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; является суммой длительностей всех его вызовов. Каждый вызов от внешних узлов добавляет к этой сумме &amp;lt;tex&amp;gt;O(|L_v| + |Int_{a, b}(L_v)|)&amp;lt;/tex&amp;gt;. Для внутренних же узлов, время требуемое для поиска &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;O(|I_v| log N)&amp;lt;/tex&amp;gt;, а для остальных &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')|)&amp;lt;/tex&amp;gt;. Если мы все это сложим, то придем к выводу, что наш алгоритм работает за &amp;lt;tex&amp;gt;O(N log^2 N + K)&amp;lt;/tex&amp;gt;. Заметим, что его скорость можно увеличить до &amp;lt;tex&amp;gt;O(N logN + K)&amp;lt;/tex&amp;gt;, если не будем учитывать время нахождения &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Соответственно в оптимальном алгоритме Балабана &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; находится за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33835</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=33835"/>
				<updated>2013-11-30T07:36:25Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Split */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Решение задачи по поиску множества пересечений отрезков является одной из главных задач вычислительной геометрии. Рассмотрим несколько самых распространенных алгоритмов:&lt;br /&gt;
&lt;br /&gt;
1.) Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, и его суть заключается в проверке попарного пересечения отрезков.&lt;br /&gt;
&lt;br /&gt;
2.) Сложнее, но эффективнее алгоритм Бентли-Оттмана &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
3.) Алгоритм, предложенный Чазелле и Едельсбруннером &amp;lt;ref&amp;gt;[http://www.cs.princeton.edu/~chazelle/pubs/IntersectLineSegments.pdf ''An optimal algorithm for intersecting line segments in the plane'']&amp;lt;/ref&amp;gt;, имеет лучшую оценку &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt;, но в отличие от предыдущих методов требует квадратичной памяти.&lt;br /&gt;
&lt;br /&gt;
4.) Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти, где К - число пересекающихся отрезков.&lt;br /&gt;
&lt;br /&gt;
При количестве отрезков от 2000, и большому количеству пересечений целесообразно использовать алгоритм Балабана. Однако в результате громоздкости и высокой сложности реализации алгоритма, в большинстве практических задач используется алгоритм заметающей прямой Бентли-Оттмана.&lt;br /&gt;
&lt;br /&gt;
==Основные понятия==&lt;br /&gt;
&lt;br /&gt;
Введем некоторые обозначения. Пусть &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; - множество всех точек пересечения отрезков из множества &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;K = |Int(S)|&amp;lt;/tex&amp;gt; - количество таких пересечений ;&amp;lt;br&amp;gt;&lt;br /&gt;
Через &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; обозначим вертикальную полосу, которая ограничена прямыми &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s&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;br&amp;gt;&lt;br /&gt;
Рассмотрим взаимное расположение вертикальной полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и отрезка &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем говорить, что отрезок &amp;lt;tex&amp;gt;s&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; : &lt;br /&gt;
- '''охватывает'''(span) полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;l \le a \le b \le r&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
- '''внутренний'''(inner) для полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;a &amp;lt; l &amp;lt; r &amp;lt; b&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
- '''пересекает'''(cross) полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; в других случаях.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Два отрезка &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; называются ''пересекающимися внутри'' полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, если их точка пересечения лежит в пределах этой полосы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для двух множеств отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; определим множество &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\{ {s, s'} | (s \in S, s' \in S') \&amp;amp; (s \ intersect \ s') \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Balaban_pic_1.png|280px|thumb|right|&amp;lt;tex&amp;gt;D = ((s_1, s_2, s_3), \langle a, b \rangle)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_4) = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Loc(D, s_5) = 2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Int(D, \{s_4,\ s_5\}) = \{\{s_3,\ s_5\}\}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Обозначения &amp;lt;tex&amp;gt;Int_{a, b}(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int_{a, b}(S, S')&amp;lt;/tex&amp;gt; будут использоваться для описания подмножеств &amp;lt;tex&amp;gt;Int(S)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Int(S, S')&amp;lt;/tex&amp;gt;, состоящих из пересекающихся пар отрезков в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;. Далее скобки &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt; используются для определения неупорядоченных множеств, а скобки &amp;lt;tex&amp;gt;()&amp;lt;/tex&amp;gt; используются для определения упорядоченных множеств.&lt;br /&gt;
&lt;br /&gt;
Введем отношение порядка на множестве отрезков &amp;lt;tex&amp;gt;s_1 &amp;lt;_a s_2&amp;lt;/tex&amp;gt; если оба отрезка пересекают вертикальную линию &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; и&lt;br /&gt;
точка пересечения этой прямой с отрезком &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; лежит ниже точки пересечения с &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|neat=neat&lt;br /&gt;
|definition=&lt;br /&gt;
''Лестница'' &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; — это пара &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt;, в которой отрезки из множества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; удовлетворяют следующим условиям : &lt;br /&gt;
− любой отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;; &amp;lt;br&amp;gt;&lt;br /&gt;
− нет пересечений отрезков внутри лестницы; &amp;lt;br&amp;gt;&lt;br /&gt;
− &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; упорядочена по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часть отрезков лестницы внутри полосы будем называть '''ступеньками'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Будем называть лестницу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; '''полной''' относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, если каждый отрезок из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; либо не охватывает полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, либо пересекает хотя бы одну из ступенек из множества &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть лестница &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; состоит из отрезков, пересекающих полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;|S| \le Ends_{a, b}(S) + |Int(D, S)|&amp;lt;/tex&amp;gt;,&amp;lt;br&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;Ends_{a, b}(S)&amp;lt;/tex&amp;gt; это число вершин отрезков из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, находящихся в пределах полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Если точка &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;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;i + 1&amp;lt;/tex&amp;gt;, тогда число &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; называется ''местоположением'' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; на лестнице &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и обозначается как &amp;lt;tex&amp;gt;Loc(D, s)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Имея лестницу &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; и множество отрезков &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, множество &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; можно найти за время &amp;lt;tex&amp;gt;O(|S| log|Q| + |Int(D, S)|)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;S’&amp;lt;/tex&amp;gt; упорядочено отношением &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x \in [a, b]&amp;lt;/tex&amp;gt;, тогда можно найти &amp;lt;tex&amp;gt;Int(D, S)&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(|S| + |Q| + |Int(D, S)|)&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;
===Split===&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; разделяет входное множество отрезков &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, охватывающих некоторую полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;, на подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt; так, что лестница &amp;lt;tex&amp;gt;(Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; полна относительно множества отрезков &amp;lt;tex&amp;gt;L'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Пусть &amp;lt;tex&amp;gt;L = (s_1 ,..., s_k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;s_i &amp;lt;_a s_{i+1}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;Split_{a, b}(L, Q, L')&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L' \leftarrow \varnothing; Q \leftarrow \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;j = 1,...,k&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         '''if''' отрезок &amp;lt;tex&amp;gt;S_j&amp;lt;/tex&amp;gt; не пересекает&lt;br /&gt;
         последний отрезок из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; внутри полосы &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;&lt;br /&gt;
         и при этом охватывает её '''then'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;Q;&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''else'''&lt;br /&gt;
             добавить &amp;lt;tex&amp;gt;s_j&amp;lt;/tex&amp;gt; в конец &amp;lt;tex&amp;gt;L';&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция работает за &amp;lt;tex&amp;gt;O(|L|)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
===Search In Strip===&lt;br /&gt;
&lt;br /&gt;
Зная &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; мы можем найти &amp;lt;tex&amp;gt;Int_{a, b}(L)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; используя следующую рекурсивную функцию:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split(L, Q, L');&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;L' = \varnothing&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow Q;&amp;lt;/tex&amp;gt; &lt;br /&gt;
         '''return'''&amp;lt;tex&amp;gt;;&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int_{a, b}(Q, L');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;SearchInStrip_{a, b} (L', R');&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R \leftarrow Merge_b(Q, R’);&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь, &amp;lt;tex&amp;gt;Merge_x(S_1, S_2)&amp;lt;/tex&amp;gt; это функция объединения множеств &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;, упорядоченных по отношению &amp;lt;tex&amp;gt;&amp;lt;_x&amp;lt;/tex&amp;gt;. Время выполнения &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; эквивалентно сумме времён каждого её запуска. Очевидно, что время работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той функции, будет равно &amp;lt;tex&amp;gt;O(|L_i| + |Int_{a, b}(Q_i, {L_i}')|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_i, Q_i, {L_i}'&amp;lt;/tex&amp;gt; это соответствующие наборы &amp;lt;tex&amp;gt;(L_0 = L, L_{i+1} = {L_i}')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Учитывая [[#lemma1|лемму]], заключаем, что функция &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L, R)&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(|L| + |Int_{a, b}(L)|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что все отрезки лежат в полосе &amp;lt;tex&amp;gt;\langle a, b\rangle&amp;lt;/tex&amp;gt;. Таким образом в самом начале у нас есть пара &amp;lt;tex&amp;gt;(S, \langle a, b\rangle)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Что же дальше происходит: множество &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; ''распадается'' в подмножества &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, после чего лестница &amp;lt;tex&amp;gt;D = (Q, \langle a, b \rangle)&amp;lt;/tex&amp;gt; становится полной относительно множества &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Необходимо найти пересечения отрезков из &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, затем, все пересечения в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;. Чтобы найти пересечения отрезков в &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, мы ''режем'' полосу &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt; и множество &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt; по вертикале &amp;lt;tex&amp;gt;x = c&amp;lt;/tex&amp;gt; на полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; и множества &amp;lt;tex&amp;gt;S'_{ls}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S'_{rs}&amp;lt;/tex&amp;gt; соответственно, где &amp;lt;tex&amp;gt;c&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;(S'_{ls}, \langle a, c \rangle)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(S'_{rs}, \langle c, b \rangle)&amp;lt;/tex&amp;gt;. Ключевым является тот факт, что согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;|S'| \le Ends_{a, b}(S') + |Int(D, S')|&amp;lt;/tex&amp;gt;, таким образом, число дополнительных отрезков, появляющихся после ''разрезаний'' пропорционально числу найденных пересечений.&lt;br /&gt;
&lt;br /&gt;
===Ключевые моменты===&lt;br /&gt;
&lt;br /&gt;
Давайте разберемся с алгоритмом более подробно:&lt;br /&gt;
&lt;br /&gt;
Не умаляя общности, предположим, что все пересечения и вершины отрезков имеют разные абсциссы (в конечном счете, их можно будет отсортировать введением дополнительных свойств). Будем рассматривать целые координаты на промежутке &amp;lt;tex&amp;gt;[1, 2N]&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; слева направо конец отрезка множества &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt;, а через &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; отрезок, которому он принадлежит соответственно.&lt;br /&gt;
&lt;br /&gt;
Основная задача нашего алгоритма, это рекурсивная функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Соединим каждый вызов функции с узлом некоего двоичного дерева (далее ''рекурсивное дерево''). Соответствующим узлом отметим все значения, множества и параметры вызова. Обозначим множество внутренних вершин за &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0):&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2 \cdot N&amp;lt;/tex&amp;gt; вершин по координатам и&lt;br /&gt;
         найдем &amp;lt;tex&amp;gt;p_i, s(i), i = 1,...,2 \cdot N;\ S_r \leftarrow S_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_r, 1, 2 \cdot N)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(S_v, a, b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow&amp;lt;/tex&amp;gt; отсортируем &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;; &lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Разделим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; так, что лестница&lt;br /&gt;
         &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt; будет полной, относительно множества &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b)/2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделим отрезки из &amp;lt;tex&amp;gt;S_v'&amp;lt;/tex&amp;gt; на пересекающих&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{ls}(v)&amp;lt;/tex&amp;gt; и&lt;br /&gt;
         полосу &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S_{rs}(v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{ls}(v), a, c)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(S_{rs}(v), c, b)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отсюда и дальше &amp;lt;tex&amp;gt;ls(v)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;rs(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;ft(v)&amp;lt;/tex&amp;gt; означают, соответственно, левого сына, правого сына, и отцовскую вершину узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Наша задача показать, что все операции с узлом &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; происходят за &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')| + (a_v - b_v)logN)&amp;lt;/tex&amp;gt;, для этого возьмем во внимание, что &amp;lt;tex&amp;gt;\sum_v |S_v| = O(N \cdot logN + K)&amp;lt;/tex&amp;gt; (очевидно, что &amp;lt;tex&amp;gt;\sum_v |Int(D_v, S_v')| \le K&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Balaban_pic_2.png|280px|thumb|right|&amp;lt;tex&amp;gt;S_v = (s_1, s_2, s_3, s_4, s_5)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;L_v = (s_1, s_3)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v = (s_3, s_4)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v = (s_2, s_5)&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; похожа на функцию &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt;. Основная разница заключается в том, что &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; вызывает себя без изменения полосы, когда &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; делит полосу на две части, после чего рекурсивно вызывает себя для них. Другое отличие заключается в том, что множество &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; не упорядочено так же, как &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;. В результате мы не можем напрямую использовать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для эффективного деления &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы решить эту проблему, представим &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; как объединение трех множеств:&lt;br /&gt;
множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_a&amp;lt;/tex&amp;gt;, неупорядоченного множества &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;, и множества &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; упорядоченного по отношению &amp;lt;tex&amp;gt;&amp;lt;_b&amp;lt;/tex&amp;gt;. Расположим отрезки из &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt;, пересекающие границу &amp;lt;tex&amp;gt;x = a&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, отрезки пересекающие &amp;lt;tex&amp;gt;x = b&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, и внутренние отрезки во множество &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; (пример на ''рисунке справа'').&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем вызвать функцию &amp;lt;tex&amp;gt;Split&amp;lt;/tex&amp;gt; для множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и построить &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(|L_v|) = O(|S_v|)&amp;lt;/tex&amp;gt; времени. Но мы натыкаемся на новую проблему: передавая множества &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;, необходимо найти соответствующие множества сыновей узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Неупорядоченные множества &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt; строятся легко. Множество &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; будет найдено вызовом функции &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; для нахождения &amp;lt;tex&amp;gt;Int(D_v, S_v')&amp;lt;/tex&amp;gt; в функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; за линейное время вставкой (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левая вершина отрезка) или удалением (если &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; правая вершина отрезка) отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Но как получить &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; без сортировки?&lt;br /&gt;
&lt;br /&gt;
Для листьев мы сделаем проверку вначале, и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt; известны, и все сыновья узла &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; - листья. Для начала запустим функцию &amp;lt;tex&amp;gt;Split(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt;. Теперь мы должны найти &amp;lt;tex&amp;gt;Int(D_s, S_v') = Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v) \cup Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;, но мы не знаем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и, соответственно, можем найти только &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)}) \cup Int(D_v, I_v)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к множеству &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;. Множество &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt; вставкой или удалением отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;SearchInStrip&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;L_{rs(v)}&amp;lt;/tex&amp;gt; и найдем &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;. Теперь можем продолжить вычисление &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; и получим &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt; слиянием &amp;lt;tex&amp;gt;Q_v&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Конечная функция будет выглядеть так:&lt;br /&gt;
 &amp;lt;tex&amp;gt;IntersectingPairs(S_0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Отсортируем &amp;lt;tex&amp;gt;2N&amp;lt;/tex&amp;gt; концов отрезков по абсциссе&lt;br /&gt;
         и найдем &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s(i)&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;i = 1, ..., 2N&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;L_r \leftarrow (s(1))&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;I_r \leftarrow S_0 \setminus (\{s(1)\} \cup \{s(2N)\})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_r, I_r, 1, 2N, R_r)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tex&amp;gt;TreeSearch(L_v, I_v, a, b, R_v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;b - a = 1&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
     &amp;lt;tex&amp;gt;\{&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;SearchInStrip_{a, b}(L_v, R_v)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
         '''return''';&lt;br /&gt;
     &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;Split_{a, b}(L_v, Q_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_v \leftarrow (Q_v, \langle a, b \rangle)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     &amp;lt;tex&amp;gt;c \leftarrow \lfloor (a + b) / 2 \rfloor&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Разделяем отрезки из &amp;lt;tex&amp;gt;I_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle a, c \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
        внутренние для полосы &amp;lt;tex&amp;gt;\langle c, b \rangle&amp;lt;/tex&amp;gt; во множество &amp;lt;tex&amp;gt;I_{rs(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{ls(v)}, I_{ls(v)}, a, c, R_{ls(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;p_c&amp;lt;/tex&amp;gt; левый конец отрезка &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; вставить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
         &amp;lt;tex&amp;gt;L_{rs(v)} \leftarrow&amp;lt;/tex&amp;gt; удалить &amp;lt;tex&amp;gt;s(c)&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;R_{ls(v)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;TreeSearch(L_{rs(v)}, I_{rs(v)}, c, b, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;s \in I_v&amp;lt;/tex&amp;gt; '''do'''&lt;br /&gt;
         Найдем &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; используя двоичный поиск;&lt;br /&gt;
     Найдем &amp;lt;tex&amp;gt;Int(D_v, I_v)&amp;lt;/tex&amp;gt; используя значения, полученные шагом выше;&lt;br /&gt;
     &amp;lt;tex&amp;gt;R_v \leftarrow Merge_b(Q_v, R_{rs(v)})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что нахождение &amp;lt;tex&amp;gt;Int(D_v, R_{rs(v)})&amp;lt;/tex&amp;gt; надо делать аккуратно, так как множества &amp;lt;tex&amp;gt;R_{rs(v)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;L_{ls(v)}&amp;lt;/tex&amp;gt; могут иметь одни и те же отрезки (которые '''пересекают''' &amp;lt;tex&amp;gt;\langle a, b \rangle&amp;lt;/tex&amp;gt;). Мы нашли их пересечения с &amp;lt;tex&amp;gt;D_v&amp;lt;/tex&amp;gt; при поиске &amp;lt;tex&amp;gt;Int(D_v, L_{ls(v)})&amp;lt;/tex&amp;gt;, и не должны вывести эти пересечения снова.&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
&lt;br /&gt;
Для начала рассчитаем место, необходимое для выполнения алгоритма. Алгоритм использует рекурсивную функцию &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt;. Последовательность вызовов функции может занять память. Эта последовательность может быть представлена как путь корня рекурсивного дерева, до узла. Соответствующий вызов этого узла занимает &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти, каждый его &amp;quot;предок&amp;quot; занимает &amp;lt;tex&amp;gt;O(|I_v| + |Q_v|)&amp;lt;/tex&amp;gt; памяти, а остальные структуры используют &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;. Очевидно, что любой путь &amp;lt;tex&amp;gt;pt&amp;lt;/tex&amp;gt; от корня рекурсивного дерева до какого-то узла &amp;lt;tex&amp;gt;\sum_{v \in pt}(|I_v + |Q_v|) = O(N)(|I_v| \le b_v - a_v \le \lceil (b_{ft(v)} - a_{ft(v)})/2 \rceil)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В итоге для работы алгоритма требуется &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma2&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall v \in V \  |S_v'| \le a_v - b_v + |Int(D_v, S_v')|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma1|первой леммы]] и очевидного факта, что для любого множества &amp;lt;tex&amp;gt;S \subset S_0&amp;lt;/tex&amp;gt;, количество концов отрезков, лежащих в полосе &amp;lt;tex&amp;gt;\langle a_v, b_v \rangle&amp;lt;/tex&amp;gt;, меньше чем  &amp;lt;tex&amp;gt;b_v - a_v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#1&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in V} |S_v'| \le 2N \lceil logN + 1 \rceil + K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение напрямую вытекает из [[#lemma2|леммы №2]] и следующего отношения &amp;lt;tex&amp;gt;\sum_v (b_v - a_v) \le 2N \lceil logN + 1 \rceil&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Обозначим множество всех вершин рекурсивного дерева за &amp;lt;tex&amp;gt;RT&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
#2&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le N \lceil 4logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для всех узлов, кроме корня &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; имеет место выражение &amp;lt;tex&amp;gt;|S_v| \le |S_{ft(v)}'|&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;\sum_{v \in RT} |S_v| \le |S_r| + \sum_{v \in RT \setminus r} |S_{ft(v)}| \le N + 2 \sum_{v \in V} |S_v'| \le N \lceil 4 logN + 5 \rceil + 2K&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Начальная сортировка и инициализация множеств &amp;lt;tex&amp;gt;L_r&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;I_r&amp;lt;/tex&amp;gt; может быть произведена за &amp;lt;tex&amp;gt;O(N logN)&amp;lt;/tex&amp;gt; времени. Время работы функции &amp;lt;tex&amp;gt;TreeSearch&amp;lt;/tex&amp;gt; является суммой длительностей всех его вызовов. Каждый вызов от внешних узлов добавляет к этой сумме &amp;lt;tex&amp;gt;O(|L_v| + |Int_{a, b}(L_v)|)&amp;lt;/tex&amp;gt;. Для внутренних же узлов, время требуемое для поиска &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;O(|I_v| log N)&amp;lt;/tex&amp;gt;, а для остальных &amp;lt;tex&amp;gt;O(|S_v| + |Int(D_v, S_v')|)&amp;lt;/tex&amp;gt;. Если мы все это сложим, то придем к выводу, что наш алгоритм работает за &amp;lt;tex&amp;gt;O(N log^2 N + K)&amp;lt;/tex&amp;gt;. Заметим, что его скорость можно увеличить до &amp;lt;tex&amp;gt;O(N logN + K)&amp;lt;/tex&amp;gt;, если не будем учитывать время нахождения &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Соответственно в оптимальном алгоритме Балабана &amp;lt;tex&amp;gt;Loc(D_v, s)&amp;lt;/tex&amp;gt; находится за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=32860</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=32860"/>
				<updated>2013-09-26T11:20:00Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Методы поиска пересечений отрезков разделяются на детерминированные и недетерминированные. Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; и суть его заключается в проверке попарного пересечения отрезков.&lt;br /&gt;
&lt;br /&gt;
Сложнее, но эффективнее алгоритм Бентли-Отмена &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
Алгоритм, предложенный Чазеле и Едельсбруннером &amp;lt;ref&amp;gt;[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия (стр. 348 - 350)'']&amp;lt;/ref&amp;gt;, имеет лучшую оценку &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt;, но в отличие от предыдущих методов требует квадратичной памяти.&lt;br /&gt;
&lt;br /&gt;
Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=32859</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=32859"/>
				<updated>2013-09-26T11:09:29Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Методы поиска пересечений отрезков разделяются на детерминированные и недетерминированные. Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; и суть его заключается в проверке попарного пересечения отрезков. Сложнее, но эффективнее алгоритм Бентли-Отмена &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой. Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''Т.Вознюк, В.Терещенко {{---}} К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
[http://booksshare.net/books/math/preparata-f/1989/files/vichgeometr.pdf ''Ф.Препарата, М.Шеймос {{---}} Вычислительная геометрия'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=32858</id>
		<title>Алгоритм Балабана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%B0%D0%BB%D0%B0%D0%B1%D0%B0%D0%BD%D0%B0&amp;diff=32858"/>
				<updated>2013-09-26T11:05:45Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: add ''in creating'' lable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
&lt;br /&gt;
'''Алгоритм Балабана''' {{---}} детерминированный алгоритм, позволяющий по множеству отрезков на плоскости получить множество точек, в которых эти отрезки пересекаются &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
&lt;br /&gt;
Методы поиска пересечений отрезков разделяются на детерминированные и недетерминированные. Тривиальный детерминированный алгоритм имеет временную сложность &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; и суть его заключается в проверке попарного пересечения отрезков. Сложнее, но эффективнее алгоритм Бентли-Отмена &amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=Алгоритм_Бентли-Оттмана ''Алгоритм Бентли-Оттмана'']&amp;lt;/ref&amp;gt; с оценкой сложности &amp;lt;tex&amp;gt;O((n + k)\ log(n)+k)&amp;lt;/tex&amp;gt;, в основе которого лежит метод заметающей прямой. Оптимальный детерминированный алгоритм был предложен Балабаном &amp;lt;ref&amp;gt;[http://www.cs.sfu.ca/~binay/813.2011/Balaban.pdf ''I.J. Balaban. An optimal algorithm for finding segments intersections. In Proceedings of the Eleventh Annual Symposium on Computational Geometry, ACM Press, New York, 1995. - pp. 211–219.'']&amp;lt;/ref&amp;gt; с временной оценкой сложности &amp;lt;tex&amp;gt;O(n\ log(n) + k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
[http://www.graphicon.ru/proceedings/2010/conference/RU/Se4/021.pdf ''К построению эффективного решения задачи пересечения отрезков'']&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80&amp;diff=31023</id>
		<title>Сопряжённый оператор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80&amp;diff=31023"/>
				<updated>2013-06-06T11:33:03Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Сопряженный оператор */&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;
&amp;lt;tex&amp;gt; E^* &amp;lt;/tex&amp;gt; {{---}} множество линейных непрерывных функционалов над &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; E^* &amp;lt;/tex&amp;gt; называют пространством, сопряженным к &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично, &amp;lt;tex&amp;gt; E^{**} &amp;lt;/tex&amp;gt; {{---}} пространство, сопряженное к &amp;lt;tex&amp;gt; E^* &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Между &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; E^{**} &amp;lt;/tex&amp;gt; существует так называемый '''естественный изоморфизм''', сохраняющий норму точки. {{TODO|t=?}}&lt;br /&gt;
&lt;br /&gt;
Введем &amp;lt;tex&amp;gt; F_x &amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt; F_x (f) = f(x), f \in E^{*} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F_x : E^{*} \to \mathbb{R} &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt; F_x \in E^{**} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда само &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; отображает &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; E^{**} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; линейно: &amp;lt;tex&amp;gt; F_{\alpha x_1 + \beta x_2} = \alpha F_{x_1} + \beta F_{x_2} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; | F_x(f) | = |f(x)| \le \| f \| \| x \| &amp;lt;/tex&amp;gt;, откуда &amp;lt;tex&amp;gt; \| F_x \| \le \| x \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, по теореме Хана-Банаха, &amp;lt;tex&amp;gt; \forall x_0 \in E, \exists f_0 \in E^* &amp;lt;/tex&amp;gt;, что выполняются два условия:&lt;br /&gt;
# &amp;lt;tex&amp;gt; f_0(x_0) = \| x_0 \| &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \| f_0 \| = 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; | F_{x_0} (f_0) | = f_0 (x_0) = \| x_0 \|, \| f_0 \| = 1 &amp;lt;/tex&amp;gt;, потому получаем, что &amp;lt;tex&amp;gt; \| F_{x_0} \| \ge \| x_0 \| \implies \| F_{x_0} \| = \| x_0 \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, получившееся преобразование &amp;lt;tex&amp;gt; x \mapsto F_x &amp;lt;/tex&amp;gt; {{---}} изометрия, &amp;lt;tex&amp;gt; \| x \| = \| F_x \| &amp;lt;/tex&amp;gt;, получили '''естественное вложение''' &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; E^{**} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; называется '''рефлексивным''', если &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; будет совпадать с &amp;lt;tex&amp;gt; E^{**} &amp;lt;/tex&amp;gt; при таком отображении.&lt;br /&gt;
&lt;br /&gt;
Например, гильбертово пространство &amp;lt;tex&amp;gt; H &amp;lt;/tex&amp;gt; рефлексивно (следует из теоремы Рисса об общем виде линейного функционала).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; C[0, 1] &amp;lt;/tex&amp;gt; {{---}} не является рефлексивным.&lt;br /&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; E &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt;, и функционал &amp;lt;tex&amp;gt; \varphi &amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt; F^* &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt; f(x) = \varphi (Ax), | f(x) | \le \| \varphi \| \| A \| \| x \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получили новый функционал &amp;lt;tex&amp;gt; f &amp;lt;/tex&amp;gt;, принадлежащий &amp;lt;tex&amp;gt; E^* &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; \varphi \mapsto \varphi A &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \varphi A = A^* (\varphi), A^* : F^* \to E^* &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; A^* &amp;lt;/tex&amp;gt; {{---}} '''сопряженный оператор''' к &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} линейный ограниченный оператор, то &amp;lt;tex&amp;gt; \| A^* \| = \| A \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Возьмем &amp;lt;tex&amp;gt; x \in E, \varphi \in F^* &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; | A^* (\varphi, x) | = | \varphi (Ax) | \le \| A \| \| \varphi \| \| x \| &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Получили, что &amp;lt;tex&amp;gt; \| A^* (\varphi) \| \le \| A \| \| \varphi \| &amp;lt;/tex&amp;gt;, откуда &amp;lt;tex&amp;gt; \| A^* \| \le \| A \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для доказательства в обратную сторону используем теорему Хана-Банаха:&lt;br /&gt;
&lt;br /&gt;
По определению нормы: &amp;lt;tex&amp;gt; \forall \varepsilon &amp;gt; 0 \, \exists x: \| x \| = 1 \implies \| A \| - \varepsilon &amp;lt; \| Ax \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; Ax \in F &amp;lt;/tex&amp;gt;, по теореме Хана-Банаха подберем &amp;lt;tex&amp;gt; \varphi_0 \in F^*, \| \varphi_0 \| = 1: \varphi_0 (Ax) = \| Ax \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \| A^*(\varphi_0, x) \| = | \varphi_0(Ax) | = \| Ax \| &amp;gt; \| A \| - \varepsilon &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \| A^*(\varphi_0, x) \| \le \| A^*(\varphi_0) \| \| x \| = \| A^*(\varphi_0) \| \le \| A^* \| \| \varphi_0 \| = \| A^* \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Соединяя эти два неравенства, получаем, что &amp;lt;tex&amp;gt; \forall \varepsilon &amp;gt; 0: \| A^* \| &amp;gt; \| A \| - \varepsilon &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Устремляя &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; к нулю, получаем, что &amp;lt;tex&amp;gt; \| A^* \| \ge \| A \| &amp;lt;/tex&amp;gt;, и, окончательно, &amp;lt;tex&amp;gt; \| A^* \| = \| A \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры сопряженных операторов ==&lt;br /&gt;
&lt;br /&gt;
Возьмем любое гильбертово пространство &amp;lt;tex&amp;gt; H &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; A : H \to H &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \forall \varphi \in H^* &amp;lt;/tex&amp;gt; по теореме Рисса об общем виде линейного функционала в &amp;lt;tex&amp;gt; H &amp;lt;/tex&amp;gt; существует &lt;br /&gt;
&amp;lt;tex&amp;gt; z : \varphi (y) = \langle y, z \rangle, \| \varphi \| = \| z \| &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt; x \mapsto \varphi (Ax) &amp;lt;/tex&amp;gt; также является линейным функционалом &amp;lt;tex&amp;gt; H \to H &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; \varphi (Ax) = \langle Ax, z \rangle = \langle x, y \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; y &amp;lt;/tex&amp;gt; не зависит от &amp;lt;tex&amp;gt; x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Имеем отображение &amp;lt;tex&amp;gt; z \mapsto y &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt; y = A^*(z) &amp;lt;/tex&amp;gt;, и окончательно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \langle Ax, z \rangle = \langle x, A^*z \rangle &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В гильбертовом пространстве &amp;lt;tex&amp;gt; H &amp;lt;/tex&amp;gt; сопряженный оператор {{---}} тот оператор, который позволяет писать равенство выше.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Оператор &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; называется '''самосопряженным''', если &amp;lt;tex&amp;gt; A = A^* &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В случае &amp;lt;tex&amp;gt; \mathbb{R}^n &amp;lt;/tex&amp;gt; (частный случай &amp;lt;tex&amp;gt; H &amp;lt;/tex&amp;gt;) оператор &amp;lt;tex&amp;gt; A : \mathbb{R}^n \to \mathbb{R}^n &amp;lt;/tex&amp;gt; представляет собой матрицу размером &amp;lt;tex&amp;gt; n \times n &amp;lt;/tex&amp;gt;. Сопряженный к &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; оператор получается транспонированием соответствующей матрицы: &amp;lt;tex&amp;gt; A^* = A^T &amp;lt;/tex&amp;gt;. Для симметричной матрицы &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; получается &amp;lt;tex&amp;gt; A^* = A^T = A &amp;lt;/tex&amp;gt;, то есть, если &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} симметричная матрица, то &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} самосопряженный оператор.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим теперь пространство &amp;lt;tex&amp;gt; E = L_p [0, 1] &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; K(u, v) : [0, 1] \times [0, 1] \to \mathbb{R} &amp;lt;/tex&amp;gt; {{---}} непрерывная функция на &amp;lt;tex&amp;gt; [0, 1] \times [0, 1] &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; x \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Интегральный оператор''' &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;, действующий из &amp;lt;tex&amp;gt; L_p [0, 1] &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; L_p [0, 1] &amp;lt;/tex&amp;gt; определяется так: &amp;lt;tex&amp;gt; A(x, s) = (Ax)(s) = \int\limits_0^1 K(s, t) x(t) dt &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; Ax \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Построим сопряженный оператор:&lt;br /&gt;
&lt;br /&gt;
По теореме об общем виде линейного функционала в &amp;lt;tex&amp;gt; L_p &amp;lt;/tex&amp;gt; {{TODO|t=ее у нас в курсе не было. КАК НЕ БЫЛО-ТО???777 НИЧЕГО ШТО ЭТО ГИЛЬБЕРТОВО ПРОСТРАНСТВО!!?? -- Вот только &amp;lt;tex&amp;gt;L_p&amp;lt;/tex&amp;gt; не совсем гильбертово, ага? (&amp;lt;tex&amp;gt;p \neq 2&amp;lt;/tex&amp;gt;)}},&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \forall \varphi \in E^*, x \in E: \varphi(x) = \int\limits_0^1 y(t) x(t) dt, y \in L_q &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; \frac 1p + \frac 1q = 1 &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; называются '''сопряженными показателями''').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; L_p^* = L_q &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; A^*(\varphi, x) = \varphi (Ax) = \int\limits_0^1 y(s) (Ax)(s) ds = \int\limits_0^1 y(s) (\int\limits_0^1 K(s, t) x(t) dt) ds = &amp;lt;/tex&amp;gt; (по теореме Фубини поменяем порядок интегрирования) &amp;lt;tex&amp;gt; = \int\limits_0^1 ( \int\limits_0^1 K(s, t) y(s) ds) x(t) dt &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получили, что &amp;lt;tex&amp;gt; A^*(\varphi, x) = \int\limits_0^1 ( \int\limits_0^1 K(s, t) y(s) ds) x(t) dt &amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt; z(t) = \int\limits_0^1 K(s, t) y(s) ds &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt; A^* (\varphi) \equiv z &amp;lt;/tex&amp;gt;, аналогично &amp;lt;tex&amp;gt; \varphi \equiv y &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; A^* &amp;lt;/tex&amp;gt; {{---}} интегральный оператор из &amp;lt;tex&amp;gt; L_q &amp;lt;/tex&amp;gt;, имеющий ядро &amp;lt;tex&amp;gt; K^*(s, t) = K(t, s) &amp;lt;/tex&amp;gt;. В частности, если ядро симметрично (&amp;lt;tex&amp;gt; K(s, t) = K(t, s) &amp;lt;/tex&amp;gt;), и &amp;lt;tex&amp;gt; k = 2 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; A = A^* &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ортогональное дополнение ==&lt;br /&gt;
&lt;br /&gt;
Важное значение имеет '''ортогональное дополнение''' (в любом нормированном пространстве):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt; {{---}} НП, &amp;lt;tex&amp;gt; S \subset E^* &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; S^{\bot} = \{ x \in E \mid \forall f \in S: f(x) = 0 \} &amp;lt;/tex&amp;gt; {{---}} ортогональное дополнение &amp;lt;tex&amp;gt; S \subset E^* &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично определяется для &amp;lt;tex&amp;gt; T \subset E : T^{\bot} = \{ f \in E^* \mid \forall x \in T: f(x) = 0 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt; \{ 0 \} = (E^*)^{\bot}, \{ 0 \} = E^{\bot} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Оба включения &amp;lt;tex&amp;gt; \subset &amp;lt;/tex&amp;gt; очевидны по определению. В обратную сторону:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x \in (E^*)^{\bot} &amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt; \forall f \in E^*: f(x) = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt; x \neq 0 &amp;lt;/tex&amp;gt;, тогда по теореме Хана-Банаха, &amp;lt;tex&amp;gt; \exists f: f(x) = \| x \| \neq 0 &amp;lt;/tex&amp;gt;, получили противоречие, что &amp;lt;tex&amp;gt; x \in (E^*)^{\bot} &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;
{{TODO|t=придумать нормальный заголовок}}&lt;br /&gt;
&lt;br /&gt;
=== Теорема 1 ===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt; A \in \mathcal{L}(E,F) \implies \operatorname{Cl} R(A) = (\operatorname{Ker} A^*)^\perp &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = {{TODO | t = написать доказательство}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Теорема 2 ===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= &amp;lt;tex&amp;gt; A \in \mathcal{L}(E,F),~R(A) = \operatorname{Cl} R(A) \implies  R(A^*) = (\operatorname{Ker} )^\perp &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = {{TODO | t = написать доказательство}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30617</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30617"/>
				<updated>2013-03-18T11:03:00Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Экспандер графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30616</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30616"/>
				<updated>2013-03-18T11:02:30Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Экспандер графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30615</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30615"/>
				<updated>2013-03-18T11:01:55Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Препроцессинг */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30614</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30614"/>
				<updated>2013-03-18T11:01:06Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Усиление */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30584</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30584"/>
				<updated>2013-03-12T06:07:36Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Композиция */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30583</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30583"/>
				<updated>2013-03-12T06:06:41Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30582</id>
		<title>PCP-теорема</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0&amp;diff=30582"/>
				<updated>2013-03-12T06:05:22Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: очепятка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|id=pcp_th&lt;br /&gt;
|about=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}[\log n, O(1)] = \mathrm{NP}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Классическое доказательство [[Класс PCP|&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;]] теоремы громоздкое и довольно сложное для восприятия, &lt;br /&gt;
рассмотрим вариант докаательства, предложенный Динуром. Оно основано на том, что &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-теорема [[Эквивалентность_PCP-теоремы_и_теоремы_о_трудности_аппроксимации | эквивалентна &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;\rho-GAPqCSP&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Лемма об эквивалентности PCP теоремы и NP-трудности GAP-3SAT==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктами&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT&amp;lt;/tex&amp;gt; &amp;amp;mdash; максимальное количество дизъюнктов, которые могуг быть удовлетворены одновременно&lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT = m \Rightarrow YES&amp;lt;/tex&amp;gt; &lt;br /&gt;
* &amp;lt;tex&amp;gt;OPT &amp;lt; sm \Rightarrow NO&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;sm &amp;lt; OPT &amp;lt; m &amp;lt;/tex&amp;gt; &amp;amp;mdash; нет ограничений на вывод&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема эквивалентна вопросу принадлежности&lt;br /&gt;
&amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; классу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудных задач для некоторого &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Сначала докажем, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачи &amp;lt;tex&amp;gt;3-Color&amp;lt;/tex&amp;gt; существует сведение &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из принадлежности &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует, что существует &lt;br /&gt;
доказательство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;. Обозначим &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й бит доказательства (не его значение), будем рассматривать &amp;lt;tex&amp;gt;\pi_i&amp;lt;/tex&amp;gt; как переменные в &amp;lt;tex&amp;gt;3SAT&amp;lt;/tex&amp;gt; формуле.&lt;br /&gt;
&lt;br /&gt;
По данному графу &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; нумерует все &amp;lt;tex&amp;gt;N = 2^Q = 2^{O(\log n} = poly(n)&amp;lt;/tex&amp;gt; возможные&lt;br /&gt;
случайные строки, которые может выбрать верифаер &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Обозначим их &amp;lt;tex&amp;gt;Q_1 ... Q_{poly(n)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждая строка &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; дает нам &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; позиций в доказательстве и предикат &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; &lt;br /&gt;
строит &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулу для каждого &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; функция от &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; пременных,&lt;br /&gt;
построенная &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt;K=C2^C&amp;lt;/tex&amp;gt; дизъюнктов. Для упрощения будем считать, что формула содержит &lt;br /&gt;
&amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; дизъюнктов. &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt; возвращает конъюнкцию всех полученных формул, содержащую &amp;lt;tex&amp;gt;m=NK&amp;lt;/tex&amp;gt; дизъюнктов.&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что из &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теореме следует, что существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;, &lt;br /&gt;
удовлетворяющее всем проверкам &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Таким образом все &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; дизъюнктов могут быть  удовлетворены и &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;, что и требуется для корректности сведения &amp;lt;tex&amp;gt;\mathcal{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, если &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;, хотя бы &amp;lt;tex&amp;gt;\frac N 2&amp;lt;/tex&amp;gt; проверок &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; должны привести к отрицательному результату. Если &amp;lt;tex&amp;gt;Q_i&amp;lt;/tex&amp;gt; приводит к отрицательному ответу, &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формула, построенная по соответствующему&lt;br /&gt;
предикату &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; должна быть неудовлетворимой, значит не больше &amp;lt;tex&amp;gt;K-1&amp;lt;/tex&amp;gt; дизъюнктов могут быть удовлетворены. &lt;br /&gt;
Суммарное количество дизъюнктов, которое может быть удовлетворено:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac N 2 (K-1) + \frac N 2 K = \frac N 2 K(1- \frac 1 K) + \frac N 2 K = NK(1 - \frac 1 {2K}) = m(1 - \frac 1 {2k}) = sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы показали, что из &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы следует &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Теперь&lt;br /&gt;
покажем, что из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теорема.&lt;br /&gt;
&lt;br /&gt;
В предположении &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt; любая &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полная задача, например &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; может быть сведена к &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;. Таким образом мы можем свести &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формуле такой &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \in 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; G \notin 3Color \Rightarrow R(G)&amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt;OPT&amp;lt;sm&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имея такое сведение мы построим &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; и доказательство прувера &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; для&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm {PCP}&amp;lt;/tex&amp;gt; системы. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; запускает функцию сведения во время предподсчета,&lt;br /&gt;
доказателтьство &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; для данной &amp;lt;tex&amp;gt;R(G)=\psi&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3CNF&amp;lt;/tex&amp;gt; формулы представляет собой значения пременных &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; случайно выбирает дизъюнкт &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; из &lt;br /&gt;
&amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; и проверяет, что он удовлетворяется &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Понятно, что если &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt;, то по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt; любой дизъюнкт, выбранный&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; будет удовлетворен, поскольку &amp;lt;tex&amp;gt;OPT=m&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;G \notin 3Color&amp;lt;/tex&amp;gt;,&lt;br /&gt;
мы знаем, что &amp;lt;tex&amp;gt;OPT &amp;lt; sm&amp;lt;/tex&amp;gt;, опять же по определению &amp;lt;tex&amp;gt;R(G)&amp;lt;/tex&amp;gt;. Тaким образом вероятность того, &lt;br /&gt;
что &amp;lt;tex&amp;gt;\mathcal{V}&amp;lt;/tex&amp;gt; выберет удовлетворенный дизъюнкт меньше &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; &amp;amp;mdash; &lt;br /&gt;
константа, повторяя процесс мы можем сделать вероятность меньше &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы показали эвивалентность &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt; теоремы вопросу &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудности задачи &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Определения и леммы, используемые в доказательстве==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c_1,..., c_n\rbrace&amp;lt;/tex&amp;gt; назовем множеством условий над &lt;br /&gt;
множеством переменных &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Число неудовлетворенности &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})&amp;lt;/tex&amp;gt; &amp;amp;mdash; минимальное подмножество неудовлетворенных условий для любых возможных назначений &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;.  &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; удовлетворимо тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C})=0&amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt;\mathcal{C}&amp;lt;/tex&amp;gt; неудовлетворимо, тогда &amp;lt;tex&amp;gt;UNSAT(\mathcal{C}) \ge \frac 1 n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Графы условий===&lt;br /&gt;
Нам понадобятся графы ограничений для двух переменных, которые определяются следующим образом:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt; называется графом условий, если:&lt;br /&gt;
* &amp;lt;tex&amp;gt;(V,E)&amp;lt;/tex&amp;gt; &amp;amp;mdash; неориентированный граф, называемый графом, леащим в основе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Множество &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; также представляется в виде множества переменных принимающих значениями из алфавита &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Каждое ребро &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; содержит условие &amp;lt;tex&amp;gt;c(e) \subseteq \Sigma^2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{C}=\lbrace c(e)\rbrace_{e \in E}&amp;lt;/tex&amp;gt;. Условие &amp;lt;tex&amp;gt;c(e)&amp;lt;/tex&amp;gt; называется удовлетворенным парой &amp;lt;tex&amp;gt;(a, b)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;(a, b) \in c(e)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Присваивание это отображение &amp;lt;tex&amp;gt;\sigma:V \rightarrow \Sigma&amp;lt;/tex&amp;gt;, которое назначает каждой вершине из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;&lt;br /&gt;
значение из &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;. Для любого присвоения &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; определим &amp;lt;tex&amp;gt;UNSAT_\sigma(G) = \operatorname*{Pr}\limits_{(u,v)\in E} [(\sigma(u),\sigma(v)) \notin c(e)]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;UNSAT(G) = \operatorname*{min}\limits_\sigma UNSAT_\sigma(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Назовем &amp;lt;tex&amp;gt;UNSAT(G)&amp;lt;/tex&amp;gt; числом неудовлетворенности графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Размером графа будем считать размер его описания &amp;lt;tex&amp;gt;size(G)=O(|V|+|E| \cdot |\Sigma|^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Для заданного графа условий &amp;lt;tex&amp;gt;G=\left\langle(V,E,\Sigma,\mathcal{C}\right\rangle&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt; проверка утверждения &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; &amp;amp;mdash; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная задача.&lt;br /&gt;
|proof=&lt;br /&gt;
Сведем &amp;lt;tex&amp;gt;3Color&amp;lt;/tex&amp;gt; к нашей задаче. Дан граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, алфавит &amp;lt;tex&amp;gt;\Sigma=\lbrace 1,2,3 \rbrace&amp;lt;/tex&amp;gt; для трех цветов. Оснастим ребра условиями неравенства. Очевидно, что &amp;lt;tex&amp;gt;G \in 3Color&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;tex&amp;gt; (Иногда удобно использовать одно и то же обозначение &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; для графа условий и графа, лежащего в его основе).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Экспандер графы===&lt;br /&gt;
Экспандер графы играют важную роль во многих теоретических результатах.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= &amp;lt;tex&amp;gt;G=(V,E)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф. Положим &amp;lt;tex&amp;gt;E(S,\overline{S})=|(S \times \overline{S}) \cap E|&amp;lt;/tex&amp;gt; равным количеству ребер их подмножества &amp;lt;tex&amp;gt;S\in V&amp;lt;/tex&amp;gt; в его дополнение. Определим реберное расширение как &lt;br /&gt;
&amp;lt;tex&amp;gt;h(G)=\operatorname*{min}\limits_{S:|S|&amp;lt;\frac {|V|} 2} \frac {E(S, \overline S)} {|S|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О экспандерах&lt;br /&gt;
|statement=Существует &amp;lt;tex&amp;gt;d_0 \in \mathbb{N}&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;h_0 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что есть построимое за полиномиальное время семейство &amp;lt;tex&amp;gt;\lbrace X_n\rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_0&amp;lt;/tex&amp;gt;-регулярных графов &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинами таких, что &amp;lt;tex&amp;gt;h(X_n) \ge h_0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф, а &amp;lt;tex&amp;gt;h(G)&amp;lt;/tex&amp;gt; его реберное расширение. Тогда &amp;lt;tex&amp;gt;\lambda(G) \le d - \frac {h(G)^2} d&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Собственным числом графа &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; называют собственное число его матрицы смежности.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф со вторым по величине собственным числом &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;F \subseteq E&amp;lt;/tex&amp;gt; множество ребер. Вероятность &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; того, что случайный путь, начинающийся со случайного ребра из &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;i+1&amp;lt;/tex&amp;gt; шаге попадет &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ограничена &amp;lt;tex&amp;gt;\frac {|F|} {|E|} + \left({\frac {|\lambda|} d}\right)^i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Вероятности===&lt;br /&gt;
Следующее неравенство в стиле неравенства Чебышева удобно использовать, чтобы показать что для неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X &amp;gt; 0] \approx \mathbb{E}[X]&amp;lt;/tex&amp;gt; когда &amp;lt;tex&amp;gt;\mathbb{E}[X] \approx \mathbb{E}[X^2]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Для любой неотрицательной случайной величины &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;Pr[X&amp;gt;0] \ge \mathbb{E}[X^2] / \mathbb{E}[X]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Коды с коррекцией ошибок===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Кодом с коррекцией ошибок называется набор строк &amp;lt;tex&amp;gt;C \subset \Sigma^n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; некоторый конечный алфавит. &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; называется размером блока, а &amp;lt;tex&amp;gt;\log_{|\Sigma|}|C|&amp;lt;/tex&amp;gt; уровнем кода. Расстоянием кода называется &amp;lt;tex&amp;gt;min_{x \neq y \in C} dist(x,y)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist(\cdot,\cdot)&amp;lt;/tex&amp;gt; &amp;amp;mdash; расстояние Хэмминга.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Взаимнооднознаячное отображение &amp;lt;tex&amp;gt;e:D \rightarrow \Sigma^n&amp;lt;/tex&amp;gt; также иногда называют кодом с коррекцией ошибок. Его уровень и расстояние определяются как уровени и расстояние его образа &amp;lt;tex&amp;gt;e(D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Известно, что существуют семейства кодов &amp;lt;tex&amp;gt;\lbrace C_n \subset \lbrace 0,1 \rbrace^n \rbrace_{n \in \mathbb{N}}&amp;lt;/tex&amp;gt;, для которых уровень и расстояние равны &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и существует схема полиномиального размера, проверяющая &amp;lt;tex&amp;gt;x \in C_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
!--&amp;gt;&lt;br /&gt;
==Операции на графах условий==&lt;br /&gt;
Для доказательства &amp;lt;tex&amp;gt;\mathrm{PCP}&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;
|about=Препроцессинг&lt;br /&gt;
|statement= существуют константы &amp;lt;tex&amp;gt;0 &amp;lt; \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что любой граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в граф условий &amp;lt;tex&amp;gt;G'=prep(G)&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;size(G') = O(size(G))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что третий пункт теммы гарантирует поддержание полноты, т.е. если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то и &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;. Доказательство этой леммы состоит из двух следующих лемм (&amp;lt;tex&amp;gt;\beta_1=c \cdot \frac d {d + d_0 + 1}&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Константная степень&lt;br /&gt;
|statement=Любой граф условий &amp;lt;tex&amp;gt;G = \langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;(d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G'=\langle (V',E'),\Sigma,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;|V'|&amp;lt;/tex&amp;gt;=2|E|&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;c \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;. Для некоторых заданных констант &amp;lt;tex&amp;gt;d_0,c&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эта лемма известна как экспандер-замена(expander-replacement transformation). &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=О расширении&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;d_0, h_0 &amp;gt;0&amp;lt;/tex&amp;gt; некоторые константы. Любой &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный граф условий &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(d + d_0 + 1)&amp;lt;/tex&amp;gt;-регулярный, имеет собственные циклы и &amp;lt;tex&amp;gt;\lambda(G') \le d + d_0 + 1 - \frac {h_0^2} {d + d_0 + 1} &amp;lt; deg(G')&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G')=O(size(G))&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac d {d + d_0 + 1} \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Усиление===&lt;br /&gt;
Это новая операция на системах условий, которая увеличивает число неудовлетворенности.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G=\langle (V,E),\Sigma,\mathcal{C}\rangle&amp;lt;tex&amp;gt; граф условий, &amp;lt;tex&amp;gt;t \in \mathbb{N}&amp;lt;/tex&amp;gt;. Определим &amp;lt;tex&amp;gt;G^t=\langle (V,\mathbf{E}),\Sigma^{d^{\lceil t/2\rceil}}, \mathcal{C}^t \rangle&amp;lt;/tex&amp;gt; как следующий граф условий:&lt;br /&gt;
* Веришины &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; совпадают с вершинами &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Ребра: &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; соединены &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ребрами в &amp;lt;tex&amp;gt;\mathbf{E}&amp;lt;/tex&amp;gt;, если количество путей длины &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Алфавит: алфавит графа &amp;lt;tex&amp;gt;G^t&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t/2\rceil}}&amp;lt;/tex&amp;gt;, где каждой вершине сопоставлены значения ее соседей, достижимых за &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; шагов. &lt;br /&gt;
* Условия: Условия сопоставленные ребру &amp;lt;tex&amp;gt;e=(u,v) \in \mathbf{E}&amp;lt;/tex&amp;gt; удовлетворены, если назначения для &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; согласованы с назначениями, удовлетворяющими условия, порожденные &amp;lt;tex&amp;gt;\frac t 2&amp;lt;/tex&amp;gt; соседями &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt; тогда очевидно &amp;lt;tex&amp;gt;UNSAT(G^t)=0&amp;lt;/tex&amp;gt;. Интереснее доказательство того, что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t} \cdot UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Усиление&lt;br /&gt;
|statement= Пусть &amp;lt;tex&amp;gt;\lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; произвольные константы. Тогда существует константа &amp;lt;tex&amp;gt;\beta_2=\beta_2(\lambda,d,|\Sigma|)&amp;gt;0&amp;lt;/rex&amp;gt; такая, что для любого &amp;lt;tex&amp;gt;t \in \mathbb N&amp;lt;/tex&amp;gt; и для любого &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; с собственными циклами и &amp;lt;tex&amp;gt;\lambda(G)\le \lambda&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;UNSAT(G^t) \ge \beta_2 \sqrt{t} \cdot min \left({UNSAT(G), \frac 1 t}\right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;tex&amp;gt;UNSAT(G) \le \frac 1 t&amp;lt;/tex&amp;gt;, из жтой леммы следует что &amp;lt;tex&amp;gt;UNSAT(G^t) \ge O(\sqrt{t}) \cdot UNSAT(G)&amp;lt;/tex&amp;gt;. Это основная техническая лемма.&lt;br /&gt;
===Композиция===&lt;br /&gt;
{{Определение&lt;br /&gt;
|about=Тестер присвоений&lt;br /&gt;
|definition=Тестер присвоений с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt; и вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; это полиномиальное преобразование &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, принимающее на вход схему &amp;lt;tex&amp;gt;\Phi&amp;lt;/tex&amp;gt; над будевыми переменными &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и дающую на выходе граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma_0,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;V \subset X&amp;lt;/tex&amp;gt;(в условном графе &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; играет одновременно две роли: переменных и вершин. &amp;lt;tex&amp;gt;Y \subset X&amp;lt;/tex&amp;gt; подразумевает, что некоторые вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; определены с помощью переменных &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;). Пусть &amp;lt;tex&amp;gt;V'=V \setminus X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a : X \rightarrow \lbrace 0,1 \rbrace&amp;lt;/tex&amp;gt; &amp;amp;mdash; присваивание.&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;a \in SAT(\Phi)&amp;lt;/tex&amp;gt; то существует &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt; такое, что &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G)=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) Если &amp;lt;tex&amp;gt;a \notin SAT(\Phi)&amp;lt;/tex&amp;gt; то для всех &amp;lt;tex&amp;gt;b : V' \rightarrow \Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT_{a\cup{b}}(G) \ge \epsilon \cdot dist(a, SAT(\Phi))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что не накладывается никаких ограничений ни на время работы &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; ни на &amp;lt;tex&amp;gt;size(G)&amp;lt;/tex&amp;gt;. Мы игнорируем размер схемы &amp;lt;Tex&amp;gt;\Phi&amp;lt;/tex&amp;gt;, которая может быть экспоненциальна относительно &amp;lt;tex&amp;gt;|X|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=Композиция&lt;br /&gt;
|statement=Пусть существует тестер присвоений &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt; с константной вероятностью отклонения &amp;lt;tex&amp;gt;\epsilon &amp;gt; 0&amp;lt;/tex&amp;gt; и алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma_0|=O(1)&amp;lt;/tex&amp;gt;. Тогда существует &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0&amp;lt;/tex&amp;gt;, зависящая только от &amp;lt;tex&amp;gt;\mathcal{P}&amp;lt;/tex&amp;gt;, такая что любой граф условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; может быть преобразован в &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt;, обозначаемый &amp;lt;tex&amp;gt;G \circ \mathcal{C}&amp;lt;/tex&amp;gt;, такой что &amp;lt;tex&amp;gt;size(G')=M(|\Sigma|) \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(G) \le UNSAT(G') \le UNSAT(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=см. The PCP Theorem by Gap Amplification, Irit Dinur, 2005&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Основная теорема==&lt;br /&gt;
Основываясь на операциях с графами условий мы можем доказать основную теорему.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=Основная теорема&lt;br /&gt;
|statement=Для любого &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|\Sigma|=O(1)&amp;lt;/tex&amp;gt; существуют константы &amp;lt;tex&amp;gt;C &amp;gt; 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0 &amp;lt; \alpha &amp;lt; 1&amp;lt;/tex&amp;gt; такие, что для данного графа условий &amp;lt;tex&amp;gt;G=\langle(V,E),\Sigma,\mathcal{C}\rangle&amp;lt;/tex&amp;gt; за полиномиальное время можно построить граф условий &amp;lt;tex&amp;gt;G'=\langle(V',E'),\Sigma_0,\mathcal{C}'\rangle&amp;lt;/tex&amp;gt; такой, что:&lt;br /&gt;
* &amp;lt;tex&amp;gt;size(G') \le C \cdot size(G)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|\Sigma_0| = O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Полнота) Если &amp;lt;tex&amp;gt;UNSAT(G)=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G')=0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* (Обоснованность) &amp;lt;tex&amp;gt;UNSAT(G') \ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;G'=(prep(G))^t \circ \mathcal{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Препроцессинг) Пусть &amp;lt;tex&amp;gt;H_1=prep(G)&amp;lt;/tex&amp;gt;. Существуют некоторые глобальные константы &amp;lt;tex&amp;gt;\lambda &amp;lt; d &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 &amp;gt;0&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;H_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;-регулярный, имеет тот же алфавит, что и &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\lambda(H_1) \le \lambda &amp;lt; d&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta_1 \cdot UNSAT*G( \le UNSAT(H_1) \le UNSAT(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Усиление) Пусть &amp;lt;tex&amp;gt;H_2=(H_1)^t&amp;lt;/tex&amp;gt; для достаточно большой константы &amp;lt;tex&amp;gt; t &amp;gt; 1&amp;lt;/tex&amp;gt;, которую определим ниже. Существует некоторая константа &amp;lt;tex&amp;gt;\beta_2=\beta(\lambda, d, |\Sigma|) &amp;gt; 0&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;UNSAT(H_2) \ge \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;. Однако, алфавит вырос до &amp;lt;tex&amp;gt;\Sigma^{d^{\lceil t / 2 \rceil}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# (Композиция) Пусть &amp;lt;tex&amp;gt;G'=H_2 \circ \mathcal{P}&amp;lt;/tex&amp;gt;. Это уменьшит алфавит до &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;\beta_3 \cdot UNSAT(H_2) \le UNSAT(G') \le UNSAT(H_2)&amp;lt;/tex&amp;gt; для некоторой &amp;lt;tex&amp;gt;\beta_3 &amp;gt; 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверим выполнение условий теоремы. Размер &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; линеен относительно размера&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поскольку на каждом шагу увеличивался линейно. Полнота явно поддерживается на каждом шаге. Теперь выберем &amp;lt;tex&amp;gt;t=\left\lceil\left({\frac 2 {\beta_1\beta_2\beta_3}}\right)^2\right\rceil&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\alpha=\frac {\beta_3\beta_2} {sqrt{t}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Таким образом, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;UNSAT(G') \ge \beta_3 \cdot UNSAT(H_2)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(UNSAT(H_1), \frac 1 t)&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge \beta_3 \cdot \beta_2 \sqrt{t} \cdot min(\beta_1 UNSAT(G_, \frac 1 t) &amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tex&amp;gt;\ge min(2 \cdot UNSAT(G), \alpha)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Доказательство PCP теоремы===&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=Следствием из основной теоремы является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудность &amp;lt;tex&amp;gt;GAP-3SAT_s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Сведем удовлетворимость графа условий к нашей задаче. Пусть &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; задача удовлетворимости некоторого графа с &amp;lt;tex&amp;gt;|\Sigma|=3&amp;lt;/tex&amp;gt;. Идей состоит в повторении применения основной теоремы до тех пор, пока число неудовлетворенности не станет постоянным.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G_0 = G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_i(i \ge 1)&amp;lt;/tex&amp;gt; &amp;amp;mdash; результат применения основной теоремы к &amp;lt;tex&amp;gt;G_{i-1}&amp;lt;/tex&amp;gt;. Тогда для &amp;lt;tex&amp;gt;i \ge 1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;amp;mdash; граф условий с алфавитом &amp;lt;tex&amp;gt;\Sigma_0&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;E_0&amp;lt;/tex&amp;gt; &amp;amp;mdash; множество ребер &amp;lt;tex&amp;gt;G_0&amp;lt;tex&amp;gt; и &amp;lt;tex&amp;gt;k=\log|E_0|=O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полнота показывается тривиально: если &amp;lt;tex&amp;gt;UNSAT(G_0)=0&amp;lt;/tex&amp;gt;, то для всех &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)=0&amp;lt;/tex&amp;gt;. Для обоснованности рассмотрим &amp;lt;tex&amp;gt;UNSAT(G_0) &amp;gt; 0&amp;lt;/tex&amp;gt;. Если для некоторого &amp;lt;tex&amp;gt;i*&amp;lt;k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;UNSAT(G_{i*}) \ge \frac \alpha 2&amp;lt;/tex&amp;gt;, то из основной теоремы следует, что для всех &amp;lt;tex&amp;gt;i&amp;gt;i*&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;UNSAT(G_i)\ge \alpha&amp;lt;/tex&amp;gt;. На остальные &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; это распространяется по индукции &amp;lt;tex&amp;gt;UNSAT(G_i) \ge min(2^i UNSAT(G_0), \alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;UNSAT(G_0)&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;UNSAT(G_0)\ge \frac 1 {|E_0|}&amp;lt;/tex&amp;gt;. Конечно, &amp;lt;tex&amp;gt;2^k UNSAT(G_0) &amp;gt; \alpha&amp;lt;/tex&amp;gt;. Таким образом &amp;lt;tex&amp;gt;UNSAT(G_k) \ge \alpha&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такми образом &amp;lt;tex&amp;gt;\rho -GAP2CSP&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-трудная. Достичь обоснованности &amp;lt;tex&amp;gt;\frac 1 2&amp;lt;/tex&amp;gt; можно последовательным повторением &amp;lt;tex&amp;gt;u=\frac 1 {\log(\frac 1 {1 - \alpha})} &amp;lt;/tex&amp;gt; раз. Тоесть создать новые условия, представляющие собой &amp;lt;tex&amp;gt;AND&amp;lt;/tex&amp;gt; всех возможных &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;-наборов прежних условий. Конечно, при этом количество запросов на условие увеличится до &amp;lt;tex&amp;gt;2u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Дополнительные материалы==&lt;br /&gt;
* [http://www.math.ias.edu/boaz/ExpanderCourse/|N. Linial and A. Wigderson. Expander graphs and their applications. Lecture notes of a course, 2003].&lt;br /&gt;
* Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6, part 1):1710–1722, 1996. Codes and complexity.&lt;br /&gt;
* C. Papadimitriou and M. Yannakakis. Optimization, approximation and complexity classes. Journal of Computer and System Sciences, 3:425–440, 1991.&lt;br /&gt;
* Irit Dinur and Omer Reingold. Assignment testers: Towards combinatorial proofs of the PCP theorem. In Proceedings of the 45th Symposium on Foundations of Computer Science (FOCS), 2004.&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://eccc.hpi-web.de/report/2005/046 |The PCP Theorem by Gap Amplification, Irit Dinur, 2005].&lt;br /&gt;
* [http://www.cs.utah.edu/~alfeld/LecturePDFs/pcp.pdf |The PCP Theorem, Notes by Scott Alfeld, 2008].&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Yurik&amp;diff=27490</id>
		<title>Участник:Yurik</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Yurik&amp;diff=27490"/>
				<updated>2012-12-11T07:43:49Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: Новая страница: «Александров Юрий, 2537»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Александров Юрий, 2537&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24524</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24524"/>
				<updated>2012-06-09T08:57:32Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Время работы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока в сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 \le t_2 \le ... \le t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие утверждения эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, а значит, получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Лабетоуль (Labetoulle J.), Лаулер (Lawler E.L.), Ленстра (Lenstra. J.K.), и Ринной Кан (Rinnooy Kan A.H.G.) разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24521</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24521"/>
				<updated>2012-06-09T08:48:25Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Алгоритм решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока в сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 \le t_2 \le ... \le t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие утверждения эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, а значит, получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24520</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24520"/>
				<updated>2012-06-09T08:46:36Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Алгоритм решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока в сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 &amp;lt; t_2 &amp;lt;...&amp;lt; t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие утверждения эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, а значит, получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24518</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24518"/>
				<updated>2012-06-09T08:45:22Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Время работы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 &amp;lt; t_2 &amp;lt;...&amp;lt; t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие утверждения эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, а значит, получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24517</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24517"/>
				<updated>2012-06-09T08:43:08Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Алгоритм решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 &amp;lt; t_2 &amp;lt;...&amp;lt; t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие утверждения эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, значит получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24515</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24515"/>
				<updated>2012-06-09T08:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Алгоритм решения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 &amp;lt; t_2 &amp;lt;...&amp;lt; t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие свойства эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, значит получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24513</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=24513"/>
				<updated>2012-06-09T08:10:16Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Время работы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# У нас есть несколько станков, работающих параллельно. У всех станков разные скорости выполнения работ.&lt;br /&gt;
# Есть несколько заданий, каждое имеет своё время появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и время окончания &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Работа может быть прервана и продолжена позже.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать максимальное опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
Как в задаче [[PprecriLmax|&amp;lt;tex&amp;gt;P \mid pmtn, r_i \mid L_{max}&amp;lt;/tex&amp;gt;]] сведем задачу к поиску потока сети. Также будем использовать бинарный поиск.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 &amp;lt; t_2 &amp;lt;...&amp;lt; t_r &amp;lt;/tex&amp;gt; упорядоченная последовательность всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим произвольный интервал-узел на исходной сети (Рис. 1) &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим эту сеть. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширение сети показано на Рис. 2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;\nu = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_\nu}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с пропускной способностью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;. Это выполняется для каждой вершины &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; пропускной способностью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие свойства эквивалентны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a)&amp;lt;/tex&amp;gt; Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(b)&amp;lt;/tex&amp;gt; В расширенной сети существует поток от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^n p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|proof=&amp;lt;tex&amp;gt;(b) \Rightarrow (a):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Рассмотрим в расширенной сети поток величиной &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n {p_i}&amp;lt;/tex&amp;gt;. Обозначим через &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; общий поток, который идет от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;\sum\limits_{i = 1}^n \sum\limits_{K = 2}^r x_{iK} = \sum\limits_{i = 1}^n p_i&amp;lt;/tex&amp;gt;. Достаточно показать, что для каждого подмножества &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; выполняется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt;h(A) = &lt;br /&gt;
\begin{cases}&lt;br /&gt;
 S_{|A|}, &amp;amp; \text{if }|A| \le m \\&lt;br /&gt;
 S_m, &amp;amp; \text{otherwise}&lt;br /&gt;
\end{cases} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это означает, что условие &amp;lt;tex&amp;gt;\sum\limits_{i \in A} p_i \le Th(A), \forall A \subseteq \{ 1, ... , n \}&amp;lt;/tex&amp;gt; выполняется  и требования к обработке &amp;lt;tex&amp;gt;x_{1K}, . . . , x_{nK}&amp;lt;/tex&amp;gt; могут быть запланированы как &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt;. Рассмотрим подсеть в расширенной сети в подмножестве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и соответствующие части потока. Фрагмент частичного потока, который проходит через &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; ограничен&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\min \{ j(s_j −- s_{j + 1})T_K, |A|(s_j - s_{j+1})T_K \} = T_K(s_j - s_{j+1}) \min \{ j, |A| \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы имеем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \ge T_K \sum\limits_{j = 1}^m(s_j −- s_{j+1}) \min \{ j, |A| \} = T_Kh(A)&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То, что равенство &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt; справедливо, может рассматриваться как следствие. Если &amp;lt;tex&amp;gt;|A| &amp;gt; m&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - 3s_4 + ... + ms_s - ms_{m+1} =\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S_m = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В противном случае&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{j = 1} \min \{ j, |A| \}(s_j - s_{j + 1}) = s_1 - s_2 + 2s_2 - 2s_3 + 3s_3 - ... + (|A| - 1)s_{|A| - 1} -\ &amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;(|A| - 1)s_{|A|} + |A|(s_{|A|} - s_{|A| - 1} - ... - s_m + s_m - s_{m + 1}) = S_{|A|} = h(A)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;(a) \Rightarrow (b):&amp;lt;/tex&amp;gt;&lt;br /&gt;
Предположим, что допустимое расписание существует. Для &amp;lt;tex&amp;gt;i = 1, ... , n &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; пусть &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; является &amp;quot;объемом работ&amp;quot;, который будет выполняться в интервале &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в соответствии с нашим возможным расписанием. Тогда для всех &amp;lt;tex&amp;gt;K = 2, ..., r&amp;lt;/tex&amp;gt; и произвольных наборов &amp;lt;tex&amp;gt;A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt;, неравенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_Kh(A)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
выполняется. Кроме того, для &amp;lt;tex&amp;gt;i = 1, . . . , n&amp;lt;/tex&amp;gt; у нас &amp;lt;tex&amp;gt;p_i = \sum\limits_{K = 2}^r s_{iK}&amp;lt;/tex&amp;gt;. Остается показать, что можно отправить &amp;lt;tex&amp;gt;x_{iK}&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(i = 1, . . . , n; K = 2, . . . , r)&amp;lt;/tex&amp;gt; в расширенной сети. Такой поток существует, если &amp;lt;tex&amp;gt;\forall A \subseteq \{ 1, . . . , n \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K = 2, . . . , r&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK}&amp;lt;/tex&amp;gt; ограничено величиной минимального разреза части сети с истоками &amp;lt;tex&amp;gt;J_i(i \in A)&amp;lt;/tex&amp;gt; и стоком &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;. Тем не менее, это значение&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T_K\sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt; и правую часть &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, получаем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{i \in A} x_{iK} \le T_K h(A) = T_K \sum\limits_{j = 1}^m \min \{ j, |A| \}(s_j - s_{j+1})&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;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q \mid pmtn; r_{i} \mid L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, значит получаем алгоритм с &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-приближенной  сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log(1 / \varepsilon) + log(\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid C_{max}&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q \mid pmtn; r_i \mid L_{max}&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_NP,_coNP,_%CE%A3%E2%82%81,_%CE%A0%E2%82%81&amp;diff=24057</id>
		<title>Классы NP, coNP, Σ₁, Π₁</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_NP,_coNP,_%CE%A3%E2%82%81,_%CE%A0%E2%82%81&amp;diff=24057"/>
				<updated>2012-06-05T13:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определение ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{NP}=\bigcup\limits_{p(n) \in poly}\mathrm{NTIME}(p(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
То есть &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; — это множество языков, разрешимых недетерминированной программой за полиномиальное время.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{\Sigma_1}=\{L\bigm|\exists R(x,y)\in \tilde{\mathrm{P}}, p(n) - poly:x\in L\Leftrightarrow\exists y : |y|\le p(|x|), R(x,y)=1\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Нестрого говоря, &amp;lt;tex&amp;gt;\mathrm{\Sigma_1}&amp;lt;/tex&amp;gt; — это множество языков, для которых существует работающая за полиномиальное время детерминированная программа-верификатор &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt;, а для каждого слова из языка (и только для слова из языка) можно предъявить сертификат полиномиальной длины, подтверждающий принадлежность слова языку и проверяемый верификатором.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{\Sigma_1}=\mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathrm{\Sigma_1} \subset \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L \in \mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;. Тогда существуют &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt; и полином &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; из определения &amp;lt;tex&amp;gt;\mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;. Построим недетерминированную программу &amp;lt;tex&amp;gt;q(x)&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
  q(x):&lt;br /&gt;
    y &amp;lt;tex&amp;gt;\leftarrow?\{0,1\}^{\le p(|x|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    return &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Если &amp;lt;tex&amp;gt;x\in L&amp;lt;/tex&amp;gt;, то программа сможет «угадать» подходящий сертификат. Если &amp;lt;tex&amp;gt;x\notin L&amp;lt;/tex&amp;gt;, то подходящего сертификата не существует по определению. Таким образом, &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; разрешает &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, следовательно &amp;lt;tex&amp;gt;L\in \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
*&amp;lt;tex&amp;gt;\mathrm{NP} \subset \mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L\in \mathrm{NP}&amp;lt;/tex&amp;gt;. Тогда существует недетерминированная программа &amp;lt;tex&amp;gt;q(x)&amp;lt;/tex&amp;gt;, разрешающая этот язык. Построим верификатор &amp;lt;tex&amp;gt;R(x,y)&amp;lt;/tex&amp;gt;. В качестве сертификата будем использовать последовательность выборов в программе &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, приводящую к допуску слова (такой сертификат имеет полиномиальную длину, поскольку выборов в &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; может быть сделано не более, чем время ее работы, то есть не более, чем полином). Верификатор будет аналогичен программе &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, только вместо каждого недетерминированного выбора он будет присваивать значение, указанное в сертификате. Если &amp;lt;tex&amp;gt;x\in L&amp;lt;/tex&amp;gt;, то в &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; существует последовательность выборов таких, что &amp;lt;tex&amp;gt;q(x)=1&amp;lt;/tex&amp;gt;, следовательно существует и верный сертификат. Если &amp;lt;tex&amp;gt;x\notin L&amp;lt;/tex&amp;gt;, то для любой последовательности выборов &amp;lt;tex&amp;gt;q(x)=0&amp;lt;/tex&amp;gt;, следовательно подходящего сертификата не существует. Таким образом, &amp;lt;tex&amp;gt;L \in \mathrm{\Sigma_1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
'''Примечание:''' определение &amp;lt;tex&amp;gt;\mathrm{\Sigma_1}&amp;lt;/tex&amp;gt; часто называют также «определением NP на языке сертификатов».&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;L_1,L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;. Тогда:&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1\cap L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1\cup L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1L_2\in \mathrm{NP}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
#&amp;lt;tex&amp;gt;L_1^*\in \mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; разрешает &amp;lt;tex&amp;gt;L_1&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt; разрешает &amp;lt;tex&amp;gt;L_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1\cap L_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  r(x):&lt;br /&gt;
   return p(x) &amp;lt;tex&amp;gt;\&amp;amp;\&amp;amp;&amp;lt;/tex&amp;gt; q(x) &lt;br /&gt;
2. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1\cup L_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  r(x):&lt;br /&gt;
   return p(x) &amp;lt;tex&amp;gt;||&amp;lt;/tex&amp;gt; q(x) &lt;br /&gt;
3. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1L_2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  r(x):&lt;br /&gt;
    n &amp;lt;tex&amp;gt;\leftarrow|x|&amp;lt;/tex&amp;gt;&lt;br /&gt;
    mid &amp;lt;tex&amp;gt;\leftarrow?&amp;lt;/tex&amp;gt; {1..n}&lt;br /&gt;
    return p(x[1..mid]) &amp;lt;tex&amp;gt;\&amp;amp;\&amp;amp;&amp;lt;/tex&amp;gt; q(x[mid+1..n])&lt;br /&gt;
4. Построим программу &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt;, разрешающую &amp;lt;tex&amp;gt;L_1^*&amp;lt;/tex&amp;gt;:&lt;br /&gt;
  r(x):&lt;br /&gt;
    n &amp;lt;tex&amp;gt;\leftarrow|x|&amp;lt;/tex&amp;gt;&lt;br /&gt;
    prev &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 1&lt;br /&gt;
    do&lt;br /&gt;
      cur &amp;lt;tex&amp;gt;\leftarrow?&amp;lt;/tex&amp;gt; {prev..n}&lt;br /&gt;
      if (!p(x[prev..cur]))&lt;br /&gt;
        return false&lt;br /&gt;
      prev &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; cur+1&lt;br /&gt;
    while (cur != n)&lt;br /&gt;
    return true&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры NP-языков ==&lt;br /&gt;
* Язык раскрасок графа в &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; цветов;&lt;br /&gt;
* Задача о клике;&lt;br /&gt;
* [http://arxiv.org/abs/cs.CC/0210020 Тетрис]&lt;br /&gt;
Все эти языки также являются [[Примеры_NP-полных_языков._Теорема_Кука|&amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полными]]. О существовании &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt; языка, не являющегося &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полным гласит [[Теорема Ладнера|теорема Ладнера]].&lt;br /&gt;
&lt;br /&gt;
== Связь P и NP ==&lt;br /&gt;
Очевидно, что &amp;lt;tex&amp;gt;\mathrm{P} \subseteq \mathrm{NP}&amp;lt;/tex&amp;gt;, так как детерминированные программы можно рассматривать как недетерминированные, в которых не используется недетерминированный выбор. Вопрос о равенстве данных классов до сих пор остается открытым. Были осуществлены различные подходы к разрешению этой задачи: попытка найти [[Теорема_Махэни|редкий &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полный язык]]; было доказано, что [[Теорема_Бейкера_—_Гилла_—_Соловэя|доказательство должно быть нерелятивизующимся]]; различные попытки найти полиномиальные решения для задач из &amp;lt;tex&amp;gt;\mathrm{NPC}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
*[http://arxiv.org/abs/1011.3944 «решение» 3SAT за полиномиальное время];&lt;br /&gt;
*[http://www.cse.yorku.ca/~aaw/Zambito/TSP_Survey.pdf задача о коммивояжере].&lt;br /&gt;
&lt;br /&gt;
Некоторые задачи из &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt; очень похожи на задачи из &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;. В каждой из приведенных ниже пар задач первая разрешима за полиномиальное время, а вторая является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной. При этом различие между задачами кажется совершенно незначительным.&lt;br /&gt;
*Поиск [[Обход_в_ширину|самых коротких]] и самых длинных простых путей;&lt;br /&gt;
*[[Эйлеров_цикл,_Эйлеров_путь,_Эйлеровы_графы,_Эйлеровость_орграфов|Эйлеров]] и [[Гамильтоновы_графы|гамильтонов]] циклы;&lt;br /&gt;
*2-CNF и 3-CNF выполнимость.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Недетерминированные вычисления]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0&amp;diff=24051</id>
		<title>PCP-система</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0&amp;diff=24051"/>
				<updated>2012-06-05T11:42:07Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Теория сложности]]&lt;br /&gt;
'''PCP(probabilistically checkable proof)''' - вид доказательства, проверяемого рандомизированным алгоритмом, использующим ограниченное число случайных бит и читающим ограниченное число бит доказательства. Такой алгоритм должен с достаточно высокими вероятностями принимать корректные доказательства и отвергать ошибочные.&lt;br /&gt;
&lt;br /&gt;
== Определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;'''-системой''' (системой вероятностно проверяемых доказательств) с полнотой &amp;lt;tex&amp;gt;c(n)&amp;lt;/tex&amp;gt; и обоснованностью &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; над алфавитом &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; для языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;0 \le s(n) \le c(n) \le 1&amp;lt;/tex&amp;gt;, называется верификатор &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} [[Вероятностные вычисления. Вероятностная машина Тьюринга#Основные определения|вероятностная машина Тьюринга]], имеющая доступ к доказательству &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; {{---}} цепочке из &amp;lt;tex&amp;gt;\Sigma^{*}&amp;lt;/tex&amp;gt;, удовлетворяющая следующим свойствам:&lt;br /&gt;
* '''Полнота''': если &amp;lt;tex&amp;gt;x \in L&amp;lt;/tex&amp;gt;, то вероятность того, что &amp;lt;tex&amp;gt;V^{\pi}&amp;lt;/tex&amp;gt; допустит &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, не меньше &amp;lt;tex&amp;gt;c(n)&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* '''Обоснованность''': если &amp;lt;tex&amp;gt;x \notin L&amp;lt;/tex&amp;gt;, то вероятность того, что &amp;lt;tex&amp;gt;V^{\pi}&amp;lt;/tex&amp;gt; допустит &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, не больше &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Randomness complexity''' (вероятностной сложностью) &amp;lt;tex&amp;gt;r(n)&amp;lt;/tex&amp;gt; верификатора &amp;lt;tex&amp;gt;V&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;
|definition =&lt;br /&gt;
'''Query complexity''' (запросной сложностью) &amp;lt;tex&amp;gt;q(n)&amp;lt;/tex&amp;gt; верификатора &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; называется число запросов битов из &amp;lt;tex&amp;gt;\pi&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;
|definition =&lt;br /&gt;
Верификатор &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; называется '''non-adaptive''' (неадаптивным), если при отправке запроса не использует ответы на предыдущие. Иными словами, его работа не изменится, если все запросы отправить одновременно.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Сложностный класс &amp;lt;tex&amp;gt;\mathrm{PCP}_{c(n), s(n)}[r(n), q(n)]&amp;lt;/tex&amp;gt; {{---}} это объединение всех языков, для которых существует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-система над бинарным алфавитом с полнотой &amp;lt;tex&amp;gt;c(n)&amp;lt;/tex&amp;gt; и обоснованностью &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt;, в которой неадаптивный верификатор &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; работает за полиномиальное время и имеет вероятностную и запросную сложности соответственно &amp;lt;tex&amp;gt;r(n)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q(n)&amp;lt;/tex&amp;gt;, а доказательства имеют экспоненциальную длину.&amp;lt;br/&amp;gt;&lt;br /&gt;
Часто &amp;lt;tex&amp;gt;\mathrm{PCP}_{1, \frac{1}{2}}[r(n), q(n)]&amp;lt;/tex&amp;gt; обозначают как &amp;lt;tex&amp;gt;\mathrm{PCP}[r(n), q(n)]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PCP}[0, 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{PCP}[O(\log(n)), 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{PCP}[0, O(\log(n))]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PCP}[0, 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;: вероятностная МТ не использует случайные биты и не обращается к доказательству, то есть работает как детерминированная МТ, работающая за полиномиальное время.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PCP}[O(\log(n)), 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;: доступ к &amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt; случайных бит не меняет ситуации, так как все возможные битовые цепочки логарифмической длины детерминированная МТ может сгенерировать и проверить за полиномиальное время.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PCP}[0, O(\log(n))]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;: так как доступа к случайным битам нет, &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; можно рассматривать как битовую цепочку логарифмической длины. Все возможные такие цепочки детерминированная МТ может сгенерировать и проверить за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PCP}[poly(n), 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{coRP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Очевидно следует из [[Вероятностные вычисления. Вероятностная машина Тьюринга#Вероятностные сложностные классы|определения coRP]].&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PCP}[0, poly(n)]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Очевидно следует из [[Классы_NP_и_Σ₁|определения Σ₁]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = '''Graph Nonisomorphism(GNI)''' &amp;lt;tex&amp;gt;\in \mathrm{PCP}[poly(n), O(1)]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
&amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt; {{---}} графы на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинах. Требуется проверить, неизоморфны ли они друг другу. &amp;lt;br/&amp;gt;&lt;br /&gt;
Сперва пронумеруем все возможные графы на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинах. Не умаляя общности, будем считать, что &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; над троичным алфавитом. &amp;lt;br/&amp;gt;&lt;br /&gt;
Будем считать корректной &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\pi[k] = 0&amp;lt;/tex&amp;gt; тогда и только тогда, когда граф номер &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; изоморфен &amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\pi[k] = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда граф номер &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; изоморфен &amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и неизоморфен &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\pi[k] = 2&amp;lt;/tex&amp;gt; тогда и только тогда, когда граф номер &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; неизоморфен &amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и изоморфен &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Верификатором &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; будет вероятностная МТ, работающая эквивалентно следующему псевдокоду:&amp;lt;br/&amp;gt;&lt;br /&gt;
  p(&amp;lt;tex&amp;gt;\langle G_1, G_2 \rangle&amp;lt;/tex&amp;gt;) {&lt;br /&gt;
    i = random{1, 2};&lt;br /&gt;
    &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; = random permutation{1..n};&lt;br /&gt;
    &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\phi(G_i)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
    if (&amp;lt;tex&amp;gt;\pi[\#H]&amp;lt;/tex&amp;gt; == 0) or (&amp;lt;tex&amp;gt;\pi[\#H]&amp;lt;/tex&amp;gt; == 3-i) {&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
    // &amp;lt;tex&amp;gt;\pi[\#H]&amp;lt;/tex&amp;gt; == i&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
Проверим полноту и обоснованность:&lt;br /&gt;
* '''Полнота''': если графы неизоморфны, то существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; такая, что всякий её символ равен 1 или 2 и задан корректно. Тогда на этой &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; верификатор всегда вернёт 1;&lt;br /&gt;
* '''Обоснованность''': если графы изоморфны, то фиксируем &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; {{---}} это множество всех конфигураций случайной ленты, с которой работает &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Заметим, что все конфигурации из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; будут переданы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; с равными вероятностями. Теперь рассмотрим произвольную конфигурацию типа &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;, то есть конфигурацию, на которой &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; допускает &amp;lt;tex&amp;gt;\langle G_1, G_2 \rangle&amp;lt;/tex&amp;gt;. Заметим, что для каждой такой конфигурации существует однозначно определяемая конфигурация типа &amp;lt;tex&amp;gt;\overline \psi&amp;lt;/tex&amp;gt;, отличающаяся от &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; только первым битом и также принадлежащая &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;. Запустившись на &amp;lt;tex&amp;gt;\overline \psi&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, очевидно, отвергнет &amp;lt;tex&amp;gt;\langle G_1, G_2 \rangle&amp;lt;/tex&amp;gt;. Таким образом, конфигураций типа &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; не больше половины. Как уже отмечалось, конфигурации из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; подаются &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; с равными вероятностями, а конфигураций не из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;, по определению, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; не подаётся. Таким образом, вероятность ошибки не превышает &amp;lt;tex&amp;gt;\frac{1}{2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0&amp;diff=24049</id>
		<title>PCP-система</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=PCP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0&amp;diff=24049"/>
				<updated>2012-06-05T11:40:11Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Теория сложности]]&lt;br /&gt;
'''PCP(probabilistically checkable proof)''' - вид доказательства, проверяемого рандомизированным алгоритмом, использующим ограниченное число случайных бит и читающим ограниченное число бит доказательства. Такой алгоритм должен с достаточно высокими вероятностями принимать корректные доказательства и отвергать ошибочные.&lt;br /&gt;
&lt;br /&gt;
== Определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;'''-системой''' (системой вероятностно проверяемых доказательств) с полнотой &amp;lt;tex&amp;gt;c(n)&amp;lt;/tex&amp;gt; и обоснованностью &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; над алфавитом &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; для языка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;0 \le s(n) \le c(n) \le 1&amp;lt;/tex&amp;gt;, называется верификатор &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} [[Вероятностные вычисления. Вероятностная машина Тьюринга#Основные определения|вероятностная машина Тьюринга]], имеющая доступ к доказательству &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; {{---}} цепочке из &amp;lt;tex&amp;gt;\Sigma^{*}&amp;lt;/tex&amp;gt;, удовлетворяющая следующим свойствам:&lt;br /&gt;
* '''Полнота''': если &amp;lt;tex&amp;gt;x \in L&amp;lt;/tex&amp;gt;, то вероятность того, что &amp;lt;tex&amp;gt;V^{\pi}&amp;lt;/tex&amp;gt; допустит &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, не меньше &amp;lt;tex&amp;gt;c(n)&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* '''Обоснованность''': если &amp;lt;tex&amp;gt;x \notin L&amp;lt;/tex&amp;gt;, то вероятность того, что &amp;lt;tex&amp;gt;V^{\pi}&amp;lt;/tex&amp;gt; допустит &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, не больше &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Randomness complexity''' (вероятностной сложностью) &amp;lt;tex&amp;gt;r(n)&amp;lt;/tex&amp;gt; верификатора &amp;lt;tex&amp;gt;V&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;
|definition =&lt;br /&gt;
'''Query complexity''' (запросной сложностью) &amp;lt;tex&amp;gt;q(n)&amp;lt;/tex&amp;gt; верификатора &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; называется число запросов битов из &amp;lt;tex&amp;gt;\pi&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;
|definition =&lt;br /&gt;
Верификатор &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; называется '''non-adaptive''' (неадаптивным), если при отправке запроса не использует ответы на предыдущие. Иными словами, его работа не изменится, если все запросы отправить одновременно.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Сложностный класс &amp;lt;tex&amp;gt;\mathrm{PCP}_{c(n), s(n)}[r(n), q(n)]&amp;lt;/tex&amp;gt; {{---}} это объединение всех языков, для которых существует &amp;lt;tex&amp;gt;\mathrm{PCP}&amp;lt;/tex&amp;gt;-система над бинарным алфавитом с полнотой &amp;lt;tex&amp;gt;c(n)&amp;lt;/tex&amp;gt; и обоснованностью &amp;lt;tex&amp;gt;s(n)&amp;lt;/tex&amp;gt;, в которой неадаптивный верификатор &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; работает за полиномиальное время и имеет вероятностную и запросную сложности соответственно &amp;lt;tex&amp;gt;r(n)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q(n)&amp;lt;/tex&amp;gt;, а доказательства имеют экспоненциальную длину.&amp;lt;br/&amp;gt;&lt;br /&gt;
Часто &amp;lt;tex&amp;gt;\mathrm{PCP}_{1, \frac{1}{2}}[r(n), q(n)]&amp;lt;/tex&amp;gt; обозначают как &amp;lt;tex&amp;gt;\mathrm{PCP}[r(n), q(n)]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PCP}[0, 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{PCP}[O(log(n)), 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{PCP}[0, O(log(n))]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PCP}[0, 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;: вероятностная МТ не использует случайные биты и не обращается к доказательству, то есть работает как детерминированная МТ, работающая за полиномиальное время.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PCP}[O(\log(n)), 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;: доступ к &amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt; случайных бит не меняет ситуации, так как все возможные битовые цепочки логарифмической длины детерминированная МТ может сгенерировать и проверить за полиномиальное время.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PCP}[0, O(\log(n))]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{P}&amp;lt;/tex&amp;gt;: так как доступа к случайным битам нет, &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; можно рассматривать как битовую цепочку логарифмической длины. Все возможные такие цепочки детерминированная МТ может сгенерировать и проверить за полиномиальное время.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PCP}[poly(n), 0]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{coRP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Очевидно следует из [[Вероятностные вычисления. Вероятностная машина Тьюринга#Вероятностные сложностные классы|определения coRP]].&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PCP}[0, poly(n)]&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Очевидно следует из [[Классы_NP_и_Σ₁|определения Σ₁]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = '''Graph Nonisomorphism(GNI)''' &amp;lt;tex&amp;gt;\in \mathrm{PCP}[poly(n), O(1)]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
&amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt; {{---}} графы на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинах. Требуется проверить, неизоморфны ли они друг другу. &amp;lt;br/&amp;gt;&lt;br /&gt;
Сперва пронумеруем все возможные графы на &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершинах. Не умаляя общности, будем считать, что &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; над троичным алфавитом. &amp;lt;br/&amp;gt;&lt;br /&gt;
Будем считать корректной &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\pi[k] = 0&amp;lt;/tex&amp;gt; тогда и только тогда, когда граф номер &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; изоморфен &amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\pi[k] = 1&amp;lt;/tex&amp;gt; тогда и только тогда, когда граф номер &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; изоморфен &amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и неизоморфен &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt;\pi[k] = 2&amp;lt;/tex&amp;gt; тогда и только тогда, когда граф номер &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; неизоморфен &amp;lt;tex&amp;gt;G_1&amp;lt;/tex&amp;gt; и изоморфен &amp;lt;tex&amp;gt;G_2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Верификатором &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; будет вероятностная МТ, работающая эквивалентно следующему псевдокоду:&amp;lt;br/&amp;gt;&lt;br /&gt;
  p(&amp;lt;tex&amp;gt;\langle G_1, G_2 \rangle&amp;lt;/tex&amp;gt;) {&lt;br /&gt;
    i = random{1, 2};&lt;br /&gt;
    &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt; = random permutation{1..n};&lt;br /&gt;
    &amp;lt;tex&amp;gt;H&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\phi(G_i)&amp;lt;/tex&amp;gt;;&lt;br /&gt;
    if (&amp;lt;tex&amp;gt;\pi[\#H]&amp;lt;/tex&amp;gt; == 0) or (&amp;lt;tex&amp;gt;\pi[\#H]&amp;lt;/tex&amp;gt; == 3-i) {&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
    // &amp;lt;tex&amp;gt;\pi[\#H]&amp;lt;/tex&amp;gt; == i&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
Проверим полноту и обоснованность:&lt;br /&gt;
* '''Полнота''': если графы неизоморфны, то существует &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; такая, что всякий её символ равен 1 или 2 и задан корректно. Тогда на этой &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt; верификатор всегда вернёт 1;&lt;br /&gt;
* '''Обоснованность''': если графы изоморфны, то фиксируем &amp;lt;tex&amp;gt;\pi&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; {{---}} это множество всех конфигураций случайной ленты, с которой работает &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;. Заметим, что все конфигурации из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; будут переданы &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; с равными вероятностями. Теперь рассмотрим произвольную конфигурацию типа &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;, то есть конфигурацию, на которой &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; допускает &amp;lt;tex&amp;gt;\langle G_1, G_2 \rangle&amp;lt;/tex&amp;gt;. Заметим, что для каждой такой конфигурации существует однозначно определяемая конфигурация типа &amp;lt;tex&amp;gt;\overline \psi&amp;lt;/tex&amp;gt;, отличающаяся от &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; только первым битом и также принадлежащая &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;. Запустившись на &amp;lt;tex&amp;gt;\overline \psi&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, очевидно, отвергнет &amp;lt;tex&amp;gt;\langle G_1, G_2 \rangle&amp;lt;/tex&amp;gt;. Таким образом, конфигураций типа &amp;lt;tex&amp;gt;\psi&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; не больше половины. Как уже отмечалось, конфигурации из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; подаются &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; с равными вероятностями, а конфигураций не из &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt;, по определению, &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; не подаётся. Таким образом, вероятность ошибки не превышает &amp;lt;tex&amp;gt;\frac{1}{2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_PH,_%CE%A3_%D0%B8_%CE%A0&amp;diff=24035</id>
		<title>Классы PH, Σ и Π</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_PH,_%CE%A3_%D0%B8_%CE%A0&amp;diff=24035"/>
				<updated>2012-06-05T09:27:28Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Классы Σ и Π ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\Sigma_{i} = \{L \bigm| \exists R(x,y_{1},\cdots,y_{i}) \in \mathrm{P}, p&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;poly : \forall x \in L \Leftrightarrow \exists y_{1} \forall y_{2} \exists y_{3} \cdots Q y_{i} : \forall j |y_{j}|~\le~p(|x|), R(x,y_{1},\cdots,y_{i})\},&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; — формальный язык &amp;lt;tex&amp;gt;,Q = \exists&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 2k$-$1,&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;Q = \forall&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 2k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\Pi_{i} = \{L \bigm| \exists R(x, y_{1},\cdots,y_{i}) \in \mathrm{P}, p&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;poly : \forall x \in L \Leftrightarrow \forall y_{1} \exists y_{2} \forall y_{3} \cdots Q y_{i} : \forall j |y_{j}|~\le~p(|x|), R(x, y_{1}, \cdots, y_{i}) \},&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; — формальный язык &amp;lt;tex&amp;gt;,Q = \forall&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 2k$-$1,&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;Q = \exists&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 2k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Соотношения между классами Σ и Π ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\Sigma_{i} \subset \Sigma_{i+1} \cap \Pi_{i+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = Пусть &amp;lt;tex&amp;gt;L \in \Sigma_{i} \Rightarrow \exists R : x \in L \Leftrightarrow \exists y_{1} \cdots Q y_{i} : R(x,y_{1},\cdots,y_{i}), \forall j |y_{j}| \le poly(|x|)&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Проверим, что &amp;lt;tex&amp;gt;L \in \Sigma_{i+1} \Leftrightarrow \exists R' : x \in L \Leftrightarrow \exists y_{1} \cdots Q y_{i} \bar{Q} y_{i+1} : R'(x,y_{1},\cdots,y_{i},y_{i+1})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;tex&amp;gt;R'(x,y_{1},\cdots,y_{i+1})&amp;lt;/tex&amp;gt; {&lt;br /&gt;
    return &amp;lt;tex&amp;gt;R(x,y_{1},\cdots,y_{i})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
  }&lt;br /&gt;
Проверим, что &amp;lt;tex&amp;gt;L \in \Pi_{i+1} \Leftrightarrow \exists R'' : x \in L \Leftrightarrow \forall y_{0} \exists y_{1} \cdots Q y_{i} : R''(x,y_{0},y_{1},\cdots,y_{i})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;tex&amp;gt;R''(x,y_{0},y_{1},\cdots,y_{i})&amp;lt;/tex&amp;gt; {&lt;br /&gt;
    return &amp;lt;tex&amp;gt;R(x,y_{1},\cdots,y_{i})&amp;lt;/tex&amp;gt;;&lt;br /&gt;
  }&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;\Sigma_{i} \subset \Sigma_{i+1}, \Sigma_{i} \subset \Pi_{i+1} \Rightarrow \Sigma_{i} \subset \Sigma_{i+1} \cap \Pi_{i+1}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\Sigma_{i} = \mathrm{co\Pi_{i}}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = &amp;lt;tex&amp;gt;\mathrm{co\Pi_{i}} = \{L \bigm| \exists R(x,y_{1},\cdots,y_{i}) \in \mathrm{P}, p&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;poly: x \in L \Leftrightarrow \exists y_{1} \forall y_{2} \cdots Q y_{i} : \forall j |y_j|~\le~p(|x|), R(x,y_{1},\cdots,y_{i})\}.&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Из самого выражения для &amp;lt;tex&amp;gt;\mathrm{co\Pi_{i}}&amp;lt;/tex&amp;gt; очевидно равенство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример Σ и Π-полных задач ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Задачей &amp;lt;tex&amp;gt;\mathrm{QBF^{\Sigma}_{k}}&amp;lt;/tex&amp;gt; называется объединение удовлетворимых булевых формул с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; изменениями кванторов, где первым квантором является &amp;lt;tex&amp;gt;\exists&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{QBF^{\Sigma}_{k}} = \{\phi \bigm| \exists X_{1} \forall X_{2} \exists X_{3} \cdots : \phi(X_{1} \cdots X_{k})\}&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;X_{i}&amp;lt;/tex&amp;gt; {{---}} попарно непересекающиеся множества аргументов &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{QBF^{\Sigma}_{k}}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;\mathrm{\Sigma_{k}}&amp;lt;/tex&amp;gt;-полная задача (доказательство аналогично доказательству [[Теорема Бермана — Форчуна|coNP-полноты TAUT]]).&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Задачей &amp;lt;tex&amp;gt;\mathrm{QBF^{\Pi}_{k}}&amp;lt;/tex&amp;gt; называется объединение удовлетворимых булевых формул с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; изменениями кванторов, где первым квантором является &amp;lt;tex&amp;gt;\forall&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{QBF^{\Pi}_{k}} = \{\phi \bigm| \forall X_{1} \exists X_{2} \forall X_{3} \cdots : \phi(X_{1} \cdots X_{k})\}&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
где &amp;lt;tex&amp;gt;X_{i}&amp;lt;/tex&amp;gt; {{---}} попарно непересекающиеся множества аргументов &amp;lt;tex&amp;gt;\phi&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Аналогично предыдущей, &amp;lt;tex&amp;gt;\mathrm{QBF^{\Pi}_{k}}&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;\mathrm{\Pi_{k}}&amp;lt;/tex&amp;gt;-полная задача.&lt;br /&gt;
&lt;br /&gt;
== Класс PH ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{PH} = {\bigcup \atop {i \in \mathbb{N}}} \Sigma_{i}&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Замечание: иногда удобнее пользоваться альтернативными определениями &amp;lt;tex&amp;gt;\mathrm{PH}&amp;lt;/tex&amp;gt;. Например:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PH} = {\bigcup \atop {i \in \mathbb{N}}} \Pi_{i}&amp;lt;/tex&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathrm{PH} = {\bigcup \atop {i \in \mathbb{N}}} (\Sigma_{i} \cup \Pi_{i})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = &amp;lt;tex&amp;gt;\mathrm{PH} \subset \mathrm{PS}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = Пусть &amp;lt;tex&amp;gt;L \in \Sigma_{i} \Rightarrow \exists R : x \in L \Leftrightarrow \exists y_{1} \cdots Q y_{i} : R(x,y_{1},\cdots,y_{i}), \forall j |y_{j}| \le poly(|x|)&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
То есть, для перебора всех возможных значений &amp;lt;tex&amp;gt;y_{j}&amp;lt;/tex&amp;gt; потребуется не более, чем &amp;lt;tex&amp;gt;i \cdot poly(|x|)&amp;lt;/tex&amp;gt; памяти. Заметим, что &amp;lt;tex&amp;gt;i \cdot poly(|x|)&amp;lt;/tex&amp;gt; тоже полином.&lt;br /&gt;
Таким образом, для любого формального языка из &amp;lt;tex&amp;gt;\mathrm{PH}&amp;lt;/tex&amp;gt; существует программа, разрешающая его на полиномиальной памяти. То есть, любой формальный язык из &amp;lt;tex&amp;gt;\mathrm{PH}&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\mathrm{PS}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория сложности]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19513</id>
		<title>СНМ (наивные реализации)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19513"/>
				<updated>2012-03-15T13:22:36Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* С помощью списка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
| definition =&lt;br /&gt;
Система непересекающихся множеств (disjoint set union, DSU) {{ --- }} структура данных, поддерживающая операции union(x, y) {{ --- }} объединения множеств, содержащих x и y, и find(k) {{ --- }} поиск множества, которому принадлежит элемент k.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Пример работы == &lt;br /&gt;
[[Файл:DSU_1_Example.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Реализации ==&lt;br /&gt;
=== С помощью массива ===&lt;br /&gt;
'''Оценка работы:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |init&lt;br /&gt;
 |find&lt;br /&gt;
 |union&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;!-- Введем массив s, в s[i] будет храниться номер множества, к которому принадлежит i. Этот номер является идентификатором множества. Тогда find, очевидно, будет работать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть в массиве s хранятся номера множеств, в s[i] будет храниться номер множества, к которому принадлежит i. Этот номер отождествляет множество, find возвращает именно его. Тогда find, очевидно, будет работать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы объединить множества x и y, надо изменить все s[i], равные номеру множества x, на номер y. Тогда union работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Псевдокод:'''&lt;br /&gt;
 int s[n]&lt;br /&gt;
 init():&lt;br /&gt;
     for i = 0 to n - 1:&lt;br /&gt;
         s[i] = i // сначала каждый элемент лежит в своем множестве&lt;br /&gt;
 &lt;br /&gt;
 find(k):&lt;br /&gt;
     return s[k]&lt;br /&gt;
 &lt;br /&gt;
 union(x, y):&lt;br /&gt;
     if s[x] == s[y]:&lt;br /&gt;
         return&lt;br /&gt;
     else:&lt;br /&gt;
         t = s[y]&lt;br /&gt;
         for i = 0 to n - 1:&lt;br /&gt;
             if s[i] == t:&lt;br /&gt;
                 s[i] = s[x]&lt;br /&gt;
&lt;br /&gt;
=== С помощью списка ===&lt;br /&gt;
'''Оценка работы:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |init&lt;br /&gt;
 |find&lt;br /&gt;
 |union&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
Будем хранить множество в виде списка. Вначале создается n списков, в котором каждый элемент является представителем своего множества. Для каждого элемента списка будем хранить ссылку на следующий элемент (next) и ссылку на голову (head). Причем ссылка на head будет корректна только у элемента-представителя. Тогда для объединения множеств надо будет просто перекинуть ссылку next на начало другого множества. Таким образом, union работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы найти элемент в одном из множеств, надо идти по ссылкам next, пока он не указывает на null {{ --- }} тогда мы нашли элемент-представитель. Таким образом, find работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод:&lt;br /&gt;
 s[n]&lt;br /&gt;
 init():&lt;br /&gt;
     for i = 0 to n - 1:&lt;br /&gt;
         s[i].set = i&lt;br /&gt;
         s[i].next = null&lt;br /&gt;
         s[i].head = s[i]&lt;br /&gt;
 &lt;br /&gt;
 find(x): // подразумевается, что x {{ --- }} ссылка на один из элементов&lt;br /&gt;
     while x.next != null:&lt;br /&gt;
         x = x.next&lt;br /&gt;
     return x.set&lt;br /&gt;
 &lt;br /&gt;
 union(x, y): // здесь важно, что x и y {{ --- }} представители множеств&lt;br /&gt;
     if x == y:&lt;br /&gt;
         return&lt;br /&gt;
     else:&lt;br /&gt;
         x.next = y.head // соединили списки&lt;br /&gt;
         y.head = x.head // сделали корректную ссылку на голову для представителя нового списка&lt;br /&gt;
&lt;br /&gt;
'''Пример работы:'''&lt;br /&gt;
&lt;br /&gt;
Два списка до операции union:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_X.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_Y.png]]&lt;br /&gt;
&lt;br /&gt;
Два списка после операции union:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_XY.png]]&lt;br /&gt;
&lt;br /&gt;
== Другие реализации ==&lt;br /&gt;
* [[СНМ(списки с весовой эвристикой)]]&lt;br /&gt;
* [[СНМ(реализация с помощью леса корневых деревьев)]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Т. Кормен - Алгоритмы, построение и анализ. Второе издание. Часть V. Глава 21.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств и её применения]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19511</id>
		<title>СНМ (наивные реализации)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19511"/>
				<updated>2012-03-15T13:17:09Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* С помощью массива */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
| definition =&lt;br /&gt;
Система непересекающихся множеств (disjoint set union, DSU) {{ --- }} структура данных, поддерживающая операции union(x, y) {{ --- }} объединения множеств, содержащих x и y, и find(k) {{ --- }} поиск множества, которому принадлежит элемент k.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Пример работы == &lt;br /&gt;
[[Файл:DSU_1_Example.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Реализации ==&lt;br /&gt;
=== С помощью массива ===&lt;br /&gt;
'''Оценка работы:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |init&lt;br /&gt;
 |find&lt;br /&gt;
 |union&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;!-- Введем массив s, в s[i] будет храниться номер множества, к которому принадлежит i. Этот номер является идентификатором множества. Тогда find, очевидно, будет работать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть в массиве s хранятся номера множеств, в s[i] будет храниться номер множества, к которому принадлежит i. Этот номер отождествляет множество, find возвращает именно его. Тогда find, очевидно, будет работать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы объединить множества x и y, надо изменить все s[i], равные номеру множества x, на номер y. Тогда union работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Псевдокод:'''&lt;br /&gt;
 int s[n]&lt;br /&gt;
 init():&lt;br /&gt;
     for i = 0 to n - 1:&lt;br /&gt;
         s[i] = i // сначала каждый элемент лежит в своем множестве&lt;br /&gt;
 &lt;br /&gt;
 find(k):&lt;br /&gt;
     return s[k]&lt;br /&gt;
 &lt;br /&gt;
 union(x, y):&lt;br /&gt;
     if s[x] == s[y]:&lt;br /&gt;
         return&lt;br /&gt;
     else:&lt;br /&gt;
         t = s[y]&lt;br /&gt;
         for i = 0 to n - 1:&lt;br /&gt;
             if s[i] == t:&lt;br /&gt;
                 s[i] = s[x]&lt;br /&gt;
&lt;br /&gt;
=== С помощью списка ===&lt;br /&gt;
'''Оценка работы:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |init&lt;br /&gt;
 |find&lt;br /&gt;
 |union&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
Будем хранить множество в виде списка. Вначале создается n списков, в котором каждый элемент является представителем своего множества. Для каждого списка будем хранить ссылку на следующий элемент (next) и ссылку на голову (head). Тогда для объединения множеств надо будет просто перекинуть ссылку next на начало другого множества. Таким образом, union работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы найти элемент в одном из множеств, надо идти по ссылкам next, пока он не указывает на null {{ --- }} тогда мы нашли элемент-представитель. Таким образом, find работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод:&lt;br /&gt;
 s[n]&lt;br /&gt;
 init():&lt;br /&gt;
     for i = 0 to n - 1:&lt;br /&gt;
         s[i].set = i&lt;br /&gt;
         s[i].next = null&lt;br /&gt;
         s[i].head = s[i]&lt;br /&gt;
 &lt;br /&gt;
 find(x): // подразумевается, что x {{ --- }} ссылка на один из элементов&lt;br /&gt;
     while x.next != null:&lt;br /&gt;
         x = x.next&lt;br /&gt;
     return x.set&lt;br /&gt;
 &lt;br /&gt;
 union(x, y): // здесь важно, что x и y {{ --- }} представители множеств&lt;br /&gt;
     if x == y:&lt;br /&gt;
         return&lt;br /&gt;
     else:&lt;br /&gt;
         x.next = y.head // соединили списки&lt;br /&gt;
         y.head = x.head // сделали корректную ссылку на голову для представителя нового списка&lt;br /&gt;
&lt;br /&gt;
'''Пример работы:'''&lt;br /&gt;
&lt;br /&gt;
Два списка до операции union:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_X.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_Y.png]]&lt;br /&gt;
&lt;br /&gt;
Два списка после операции union:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_XY.png]]&lt;br /&gt;
&lt;br /&gt;
== Другие реализации ==&lt;br /&gt;
* [[СНМ(списки с весовой эвристикой)]]&lt;br /&gt;
* [[СНМ(реализация с помощью леса корневых деревьев)]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Т. Кормен - Алгоритмы, построение и анализ. Второе издание. Часть V. Глава 21.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств и её применения]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19510</id>
		<title>СНМ (наивные реализации)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%9D%D0%9C_(%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19510"/>
				<updated>2012-03-15T13:16:35Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
| definition =&lt;br /&gt;
Система непересекающихся множеств (disjoint set union, DSU) {{ --- }} структура данных, поддерживающая операции union(x, y) {{ --- }} объединения множеств, содержащих x и y, и find(k) {{ --- }} поиск множества, которому принадлежит элемент k.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Пример работы == &lt;br /&gt;
[[Файл:DSU_1_Example.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Реализации ==&lt;br /&gt;
=== С помощью массива ===&lt;br /&gt;
'''Оценка работы:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |init&lt;br /&gt;
 |find&lt;br /&gt;
 |union&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&amp;lt;!-- Введем массив s, в s[i] будет храниться номер множества, к которому принадлежит i. Этот номер является идентификатором множества. Тогда find, очевидно, будет работать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Пусть в массиве s хранятся номера множеств, в s[i] будет храниться номер множества, к которому принадлежит i. Этот номер отождествляет множество, find возвращает именно его. Тогда find, очевидно, будет работать за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы объединить множества x и y, надо изменить все s[i], равные номеру множества x, на номер y. Тогда union работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Псевдокод:'''&lt;br /&gt;
 int s[n]&lt;br /&gt;
 init():&lt;br /&gt;
     for i = 0 to n - 1:&lt;br /&gt;
         s[i] = i // сначала каждый элемент лежит в своем множестве&lt;br /&gt;
 &lt;br /&gt;
 find(k):&lt;br /&gt;
     return s[k]&lt;br /&gt;
 &lt;br /&gt;
 union(x, y):&lt;br /&gt;
     if s[x] == s[y]:&lt;br /&gt;
         return&lt;br /&gt;
     else:&lt;br /&gt;
         t = s[y]&lt;br /&gt;
         for i = 0 to n - 1:&lt;br /&gt;
             if s[i] == t:&lt;br /&gt;
                 s[i] = s[x]&lt;br /&gt;
&lt;br /&gt;
=== С помощью списка ===&lt;br /&gt;
'''Оценка работы:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |init&lt;br /&gt;
 |find&lt;br /&gt;
 |union&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
Будем хранить множество в виде списка. Вначале создается n списков, в котором каждый элемент является представителем своего множества. Для каждого списка будем хранить ссылку на следующий элемент (next) и ссылку на голову (head). Тогда для объединения множеств надо будет просто перекинуть ссылку next на начало другого множества. Таким образом, union работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы найти элемент в одном из множеств, надо идти по ссылкам next, пока он не указывает на null {{ --- }} тогда мы нашли элемент-представитель. Таким образом, find работает за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод:&lt;br /&gt;
 s[n]&lt;br /&gt;
 init():&lt;br /&gt;
     for i = 0 to n - 1:&lt;br /&gt;
         s[i].set = i&lt;br /&gt;
         s[i].next = null&lt;br /&gt;
         s[i].head = s[i]&lt;br /&gt;
 &lt;br /&gt;
 find(x): // подразумевается, что x {{ --- }} ссылка на один из элементов&lt;br /&gt;
     while x.next != null:&lt;br /&gt;
         x = x.next&lt;br /&gt;
     return x.set&lt;br /&gt;
 &lt;br /&gt;
 union(x, y): // здесь важно, что x и y {{ --- }} представители множеств&lt;br /&gt;
     if x == y:&lt;br /&gt;
         return&lt;br /&gt;
     else:&lt;br /&gt;
         x.next = y.head // соединили списки&lt;br /&gt;
         y.head = x.head // сделали корректную ссылку на голову для представителя нового списка&lt;br /&gt;
&lt;br /&gt;
'''Пример работы:'''&lt;br /&gt;
&lt;br /&gt;
Два списка до операции union:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_X.png]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_Y.png]]&lt;br /&gt;
&lt;br /&gt;
Два списка после операции union:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DSU_1_XY.png]]&lt;br /&gt;
&lt;br /&gt;
== Другие реализации ==&lt;br /&gt;
* [[СНМ(списки с весовой эвристикой)]]&lt;br /&gt;
* [[СНМ(реализация с помощью леса корневых деревьев)]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Т. Кормен - Алгоритмы, построение и анализ. Второе издание. Часть V. Глава 21.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://habrahabr.ru/blogs/algorithm/104772/ Система непересекающихся множеств и её применения]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D0%BA%D0%B0%D1%82_%22%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%22&amp;diff=18782</id>
		<title>Предикат &quot;левый поворот&quot;</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D0%BA%D0%B0%D1%82_%22%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%22&amp;diff=18782"/>
				<updated>2012-03-05T06:17:22Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Даны два отрезка, которые задаются начальной и конечной точками &amp;lt;tex&amp;gt;a,b\ \mathcal{2}\ \mathbb R^2&amp;lt;/tex&amp;gt; и определяются как множества точек &amp;lt;tex&amp;gt;s\ =\ \{(1-t)a + tb,\ t\ \mathcal{2}\ [0;1]\}&amp;lt;/tex&amp;gt;. Требуется проверить существование множества их общих точек. Для определения этого факта в вычислительной геометрии используется предикат &amp;quot;левый поворот&amp;quot; (или &amp;quot;по часовой стрелке&amp;quot;).&lt;br /&gt;
Рассмотрим возможные расположения точек и самих отрезков относительно друг друга:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Cross.png]]&lt;br /&gt;
[[Файл:Two_segments.png]]&lt;br /&gt;
[[Файл:Touch.jpg]]&lt;br /&gt;
&lt;br /&gt;
Определим, лежат ли точки концов отрезков по разные стороны от другого отрезка.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
&amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;&lt;br /&gt;
$$&lt;br /&gt;
Left\_Turn(a, b, c) =\left\{&lt;br /&gt;
\begin{array}{rl}&lt;br /&gt;
-1 &amp;amp;\mbox{, for}\ (b - a)\times(c - a) &amp;lt; 0\\&lt;br /&gt;
0 &amp;amp;\mbox{, for}\ (b - a)\times(c - a) = 0\\&lt;br /&gt;
1 &amp;amp;\mbox{, for}\ (b - a)\times(c - a) &amp;gt; 0&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
$$&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Распишем подробнее:&lt;br /&gt;
&amp;lt;tex dpi = 120&amp;gt;(b - a)\times(c - a) = (b_x - a_x)(c_y - a_y) - (b_y - a_y)(c_x - a_x) = A - B&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;
&amp;lt;tex dpi = &amp;quot;150&amp;quot;&amp;gt; \delta (b - a)\times(c - a) = A \varepsilon (\frac{(b_x + a_x)}{(b_x \cdot a_x)} + \frac{(c_y + a_y)}{(c_y \cdot a_y)}) + B \varepsilon (\frac{(b_y + a_y)}{(b_y \cdot a_y)} + \frac{(c_x + a_x)}{(c_x \cdot a_x)})&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что все координаты (а значит и наши вычисления) производятся в вещественных числах, а это значит, что при вычислениях мы можем допустить ошибку. Более точно определить знак нашего выражения поможет вычисление с [[Интервальная арифметика |&amp;quot;интервальной арифметикой&amp;quot;]]. Все исходные переменные будут вырожденными интервалами. Из-за погрешностей, возникающих при округлении вещественных чисел, истинные значения операций нам будут  неизвестны, но они обязательно будет содержаться в посчитанных интервалах. Для точного вычисления необходимо&lt;br /&gt;
фильтрованное вычисление предикатов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = 140&amp;gt;\overbrace {(b - a)\times(c - a)}^{v} \approx \overbrace{(b_x \ominus a_x)\otimes(c_y \ominus a_y) \ominus (b_y \ominus a_y)\otimes(c_x \ominus a_x)}^{\tilde{v}} =&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = 130&amp;gt;= \big((b_x - a_x)(c_y - a_y)(1 + \delta_1)(1 + \delta_2)(1 + \delta_3)\ -&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = 130&amp;gt;-\ (b_y - a_y)(c_x - a_x)(1 + \delta_4)(1 + \delta_5)(1 + \delta_6)\big)(1 + \delta_7)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex dpi = 130&amp;gt;\mid\delta_i\mid \le \varepsilon&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Именно поэтому, когда угол между отрезками АВ и АС КРАЙНЕ МАЛ, мы можем получить неверное значение предиката.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Tiny_angle.jpg]]&lt;br /&gt;
&lt;br /&gt;
=Bounding box=&lt;br /&gt;
Ещё следует обратить внимание на граничные случаи, когда какие-то точки попадают на саму прямую. При этом возникает единственный особый случай, когда вышеописанные проверки ничего не дадут — случай, когда оба отрезка лежат на одной прямой. Этот случай надо рассмотреть отдельно. Для этого достаточно проверить, что проекции этих двух отрезков на оси X и Y пересекаются (часто эту проверку называют &amp;quot;проверкой на bounding box&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Bounting_box().png]]&lt;br /&gt;
[[Файл:Bounting_box_.png]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*&amp;diff=18463</id>
		<title>Алгоритм A*</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*&amp;diff=18463"/>
				<updated>2012-02-28T09:44:17Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Алгоритм '''А*'''(&amp;quot;A star&amp;quot;, &amp;quot;А звёздочка&amp;quot;) {{---}} алгоритм поиска, который находит во взвешенном графе маршрут наименьшей стоимости от начальной вершины до выбранной конечной.&lt;br /&gt;
==Описание==&lt;br /&gt;
В процессе работы алгоритма для вершин рассчитывается функция &amp;lt;tex&amp;gt;f(v) = g(v) + h(v)&amp;lt;/tex&amp;gt;, где &lt;br /&gt;
*&amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; {{---}} наименьшая стоимость пути в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из стартовой вершины, &lt;br /&gt;
*&amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; {{---}} эвристическое приближение стоимости пути от &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до конечной цели. &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; должна быть эвристически допустимой, то есть не должна переоценивать рассояние до цели. &lt;br /&gt;
Чем меньше , тем раньше вершина будет открыта и исследована алгоритмом. Таким образом открытые алгоритмом вершины хранятся в очереди с приоритетом по значению &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt;. А* действует подобно [[Алгоритм Дейкстры | алгоритму Дейкстры]] и просматривает среди всех маршрутов ведущих к цели сначала те, которые благодаря имеющейся информации(эвристическая функция) в данный момент являются наилучшими. &lt;br /&gt;
&lt;br /&gt;
Поведение алгоритма сильно зависит от того, какая эвристика используется. В свою очередь, выбор эвристики зависит[[Файл:Diagonal.png|thumb|right|Пример А* на сетке с возможностью ходить в восьми напрвлениях]] от постановки задачи. Часто А* используется для моделирования перемещения по поверхности, покрытой [http://deep-beta.co.uk/wp-content/uploads/2010/11/terrain.0.3+grid.png координатной сеткой].&lt;br /&gt;
&lt;br /&gt;
* Если мы можем перемещаться в четырех направлениях, в качестве эвристики стоит выбрать [http://en.wikipedia.org/wiki/Manhattan_distance манхэттенское расстояние]&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = |{v.x-goal.x}| + |{v.y-goal.y}|&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Расстояние_Чебышева Расстояние Чебышева]  применяется когда к четырем направлениям добавляются диагонали:&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = \max{(|{v.x-goal.x}|, |{v.y-goal.y}|)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если передвижение не ограниченно сеткой, то можно использовать евклидово расстояние по прямой:&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = \sqrt{(v.x-goal.x)^2 + (v.y-goal.y)^2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также стоит обратить внимание на то как соотносятся &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt;. Если они измеряются в разных величинах (например, &amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; {{---}} это расстояние в километрах, а &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; {{---}} оценка времени пути в часах) А* может выдать некорректный результат.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Astar_progress_animation.gif|thumb|right|Пример работы А*. Пустые кружки принадлежат к открытому списку, а окрашенные к закрытому.]]&lt;br /&gt;
 void A*(start,goal) &lt;br /&gt;
     closed := {}; // Множество вершин расстояние до которых мы уже оценили&lt;br /&gt;
     open.push(start);// Очередь с приоритетом &lt;br /&gt;
     f[start] = g[start] + h[start];&lt;br /&gt;
     parent[start] = start;&lt;br /&gt;
     while (open.size() != 0) &lt;br /&gt;
         x := open.pop(); &lt;br /&gt;
         if (x == goal) &lt;br /&gt;
             return succsess(x);// Кратчайший путь найден         &lt;br /&gt;
         closed.push(x);   &lt;br /&gt;
         for (y : xy in E) &lt;br /&gt;
             if (y in closed)      &lt;br /&gt;
                 continue;&lt;br /&gt;
             tmp := g[x] + d[x,y]  // Стоимость пути до y через х&lt;br /&gt;
             if (y not in open) &lt;br /&gt;
                 open.push(y);&lt;br /&gt;
                 tentative_is_better = true;&lt;br /&gt;
             else            &lt;br /&gt;
                 if (tmp &amp;lt; g[y]) // можно улучшить расстояние до y                &lt;br /&gt;
                     tentative_is_better = true   &lt;br /&gt;
                 else&lt;br /&gt;
                     tentative_is_better = false  &lt;br /&gt;
             if (tentative_is_better == true) // найден новый, более короткий путь до y                          &lt;br /&gt;
                 parent[y] = x;&lt;br /&gt;
                 g[y] = tmp;&lt;br /&gt;
                 f[y] = g[y] + h[y];            &lt;br /&gt;
     return failure; // Наша цель недостижима из start&lt;br /&gt;
&lt;br /&gt;
==Свойства==&lt;br /&gt;
===Корректность=== &lt;br /&gt;
Если &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; всегда меньше либо равна истинной стоимости пути до цели, то А* гарантированно найдет кратчайший путь, причем чем меньше разница между эвристикой и истинной стоимостью, тем меньше вершин рассмотрит алгоритм.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть G - граф, h(v) - допустимая эвристическая функция. Тогда после завершения работы будет найдено кратчайшее расстояние до целевой вершины.&lt;br /&gt;
|proof=Когда A* завершает поиск, он, согласно определению, нашёл путь, истинная стоимость которого меньше, чем оценка стоимости любого пути через любой открытый узел. Но поскольку эти оценки являются оптимистичными, соответствующие узлы можно без сомнений отбросить. Иначе говоря, A* никогда не упустит возможности минимизировать длину пути, и потому является допустимым.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Оптимальность===&lt;br /&gt;
Любой другой алгоритм, использующий ту же эвристическую функцию &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt;, рассмотрит не меньше вершин, чем А*. &lt;br /&gt;
==Ссылки==&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Алгоритм_поиска_A* Википедия:Алгоритм_поиска_A*]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/A*_search_algorithm Wikipedia:A*_search_algorithm]&lt;br /&gt;
*[http://theory.stanford.edu/~amitp/GameProgramming/ Статья о поиске кратчайших путей]&lt;br /&gt;
*[http://dl.acm.org/citation.cfm?id=3830&amp;amp;coll=portal&amp;amp;dl=ACM Generalized best-first search strategies and the optimality of A*]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*&amp;diff=18462</id>
		<title>Алгоритм A*</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*&amp;diff=18462"/>
				<updated>2012-02-28T09:42:10Z</updated>
		
		<summary type="html">&lt;p&gt;194.85.161.34: /* Корректность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Алгоритм '''А*'''(&amp;quot;A star&amp;quot;, &amp;quot;А звёздочка&amp;quot;) {{---}} алгоритм поиска, который находит во взвешенном графе маршрут наименьшей стоимости от начальной вершины до выбранной конечной.&lt;br /&gt;
==Описание==&lt;br /&gt;
В процессе работы алгоритма для вершин рассчитывается функция &amp;lt;tex&amp;gt;f(v) = g(v) + h(v)&amp;lt;/tex&amp;gt;, где &lt;br /&gt;
*&amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; {{---}} наименьшая стоимость пути в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из стартовой вершины, &lt;br /&gt;
*&amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; {{---}} эвристическое приближение стоимости пути от &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; до конечной цели. &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; должна быть эвристически допустимой, то есть не должна переоценивать рассояние до цели. &lt;br /&gt;
Чем меньше , тем раньше вершина будет открыта и исследована алгоритмом. Таким образом открытые алгоритмом вершины хранятся в очереди с приоритетом по значению &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt;. А* действует подобно [[Алгоритм Дейкстры | алгоритму Дейкстры]] и просматривает среди всех маршрутов ведущих к цели сначала те, которые благодаря имеющейся информации(эвристическая функция) в данный момент являются наилучшими. &lt;br /&gt;
&lt;br /&gt;
Поведение алгоритма сильно зависит от того, какая эвристика используется. В свою очередь, выбор эвристики зависит[[Файл:Diagonal.png|thumb|right|Пример А* на сетке с возможностью ходить в восьми напрвлениях]] от постановки задачи. Часто А* используется для моделирования перемещения по поверхности, покрытой [http://deep-beta.co.uk/wp-content/uploads/2010/11/terrain.0.3+grid.png координатной сеткой].&lt;br /&gt;
&lt;br /&gt;
* Если мы можем перемещаться в четырех направлениях, в качестве эвристики стоит выбрать [http://en.wikipedia.org/wiki/Manhattan_distance манхэттенское расстояние]&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = |{v.x-goal.x}| + |{v.y-goal.y}|&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Расстояние_Чебышева Расстояние Чебышева]  применяется когда к четырем направлениям добавляются диагонали:&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = \max{(|{v.x-goal.x}|, |{v.y-goal.y}|)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Если передвижение не ограниченно сеткой, то можно использовать евклидово расстояние по прямой:&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;h(v) = \sqrt{(v.x-goal.x)^2 + (v.y-goal.y)^2}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также стоит обратить внимание на то как соотносятся &amp;lt;tex&amp;gt;f(v)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt;. Если они измеряются в разных величинах (например, &amp;lt;tex&amp;gt;g(v)&amp;lt;/tex&amp;gt; {{---}} это расстояние в километрах, а &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; {{---}} оценка времени пути в часах) А* может выдать некорректный результат.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 &lt;br /&gt;
[[Файл:Astar_progress_animation.gif|thumb|right|Пример работы А*. Пустые кружки принадлежат к открытому списку, а окрашенные к закрытому.]]&lt;br /&gt;
 void A*(start,goal) &lt;br /&gt;
 {&lt;br /&gt;
     closed := {}; // Множество вершин расстояние до которых мы уже оценили&lt;br /&gt;
     open.push(start);// Очередь с приоритетом &lt;br /&gt;
     f[start] = g[start] + h[start];&lt;br /&gt;
     parent[start] = start;&lt;br /&gt;
     while (open.size() != 0) &lt;br /&gt;
     {&lt;br /&gt;
         x := open.pop(); &lt;br /&gt;
         if (x == goal) &lt;br /&gt;
             return succsess(x);// Кратчайший путь найден         &lt;br /&gt;
         closed.push(x);   &lt;br /&gt;
         for (y : xy in E) &lt;br /&gt;
         {&lt;br /&gt;
             if (y in closed)      &lt;br /&gt;
                 continue;&lt;br /&gt;
             tmp := g[x] + d[x,y]  // Стоимость пути до y через х&lt;br /&gt;
             if (y not in open) &lt;br /&gt;
             {&lt;br /&gt;
                 open.push(y);&lt;br /&gt;
                 tentative_is_better = true;&lt;br /&gt;
             }&lt;br /&gt;
             else            &lt;br /&gt;
                 if (tmp &amp;lt; g[y]) // можно улучшить расстояние до y                &lt;br /&gt;
                     tentative_is_better = true   &lt;br /&gt;
                 else&lt;br /&gt;
                     tentative_is_better = false  &lt;br /&gt;
             if (tentative_is_better == true) // найден новый, более короткий путь до y&lt;br /&gt;
             {                              &lt;br /&gt;
                 parent[y] = x;&lt;br /&gt;
                 g[y] = tmp;&lt;br /&gt;
                 f[y] = g[y] + h[y];&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return failure; // Наша цель недостижима из start&lt;br /&gt;
 }&lt;br /&gt;
==Свойства==&lt;br /&gt;
===Корректность=== &lt;br /&gt;
Если &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt; всегда меньше либо равна истинной стоимости пути до цели, то А* гарантированно найдет кратчайший путь, причем чем меньше разница между эвристикой и истинной стоимостью, тем меньше вершин рассмотрит алгоритм.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть G - граф, h(v) - допустимая эвристическая функция. Тогда после завершения работы будет найдено кратчайшее расстояние до целевой вершины.&lt;br /&gt;
|proof=Когда A* завершает поиск, он, согласно определению, нашёл путь, истинная стоимость которого меньше, чем оценка стоимости любого пути через любой открытый узел. Но поскольку эти оценки являются оптимистичными, соответствующие узлы можно без сомнений отбросить. Иначе говоря, A* никогда не упустит возможности минимизировать длину пути, и потому является допустимым.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Оптимальность===&lt;br /&gt;
Любой другой алгоритм, использующий ту же эвристическую функцию &amp;lt;tex&amp;gt;h(v)&amp;lt;/tex&amp;gt;, рассмотрит не меньше вершин, чем А*. &lt;br /&gt;
==Ссылки==&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Алгоритм_поиска_A* Википедия:Алгоритм_поиска_A*]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/A*_search_algorithm Wikipedia:A*_search_algorithm]&lt;br /&gt;
*[http://theory.stanford.edu/~amitp/GameProgramming/ Статья о поиске кратчайших путей]&lt;br /&gt;
*[http://dl.acm.org/citation.cfm?id=3830&amp;amp;coll=portal&amp;amp;dl=ACM Generalized best-first search strategies and the optimality of A*]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>194.85.161.34</name></author>	</entry>

	</feed>