====== NP класс и NP-полные задачи ======
===== Вопросы и ответы про $NP, P$ и т.д. =====
==== Что такое класс $P$? ====
$P$ -- класс задач, //решаемых// за **полиномиальное** (от размера входа) время. Примеры таких задач: задача о существовании пути в графе, задача о взаимно простых числах и т.д.
==== Что такое полиномиальное время? ====
Говорят, что алгоритм работает за полиномиальное время, если время работы //ограничено сверху// многочленом от размера входа алгоритма, то есть $T(n)=O(n^k)$ для некоторой константы $k$.
(Примерами задач являются целочисленное сложение, умножение, деление, взятие остатка от деления, умножения матриц, выяснение связности графов, сортировка множества из $n$ чисел, нахождение эйлерова цикла на графе из $m$ рёбер, обнаружение в тексте длиной $n$ некоторого слова, построение покрывающего дерева минимальной стоимости)
==== Что такое класс $NP$? ====
$NP$ -- класс задач, //верифицируемых// (проверяемых) за **полиномиальное** время. Альтернативное определение: класс задач, решаемых за полиномиальное время на //недетерминированной машине Тьюринга//. Примеры таких задач: задача о выполнимости булевой формулы, задача о вершинном покрытии, задача о клике и т.д.
==== Как доказать, что задача принадлежит классу $NP$? ====
Существует два варианта:
- Привести алгоритм решения задачи, работающий полиномиальное время на недетерминированной машине Тьюринга.
- Описать сертификат и привести алгоритм верификации, работающий полиномиальное время на детерминированной машине Тьюринга.
**Сертификат** -- дополнительная информация, позволяющая быстро решить задачу. Важно помнить, что размер сертификата должен быть полиномиален относительно размера самой задачи.
**Алгоритм верификации** -- принимает на вход //экземпляр// задачи и сертификат к нему, а возвращает ответ к задаче, 0 или 1.
Грубо говоря, к классу $NP$ относятся те задачи, правильность решения которых можно проверить быстро (за полиномиальное время). К классу $P$ относятся задачи, которые можно быстро решить. Далее рассмотрим подробнее задачи, связанные с классом $NP$.
В тексте есть слова, выделенные //курсивом//. Убедитесь, что хорошо понимаете их значение, порой оно связано со смежными науками.
----
==== Какие задачи называются $NP$-трудными? ====
Это задачи, к которым //сводимы// все задачи из класса $NP$ за полиномиальное время. При этом не требуется, чтобы сама задача принадлежала классу $NP$, она может быть более сложной.
==== Что значит, что одна задача водима к другой за полиноминальное время? ====
Это значит, что существует полиномиальная функция, которая //отображает// экземпляр первой задачи в экземпляр второй задачи. Если входная задача соответствует положительному решению, то и выходная задача соответствует положительному решению. Если входная задача соответствует отрицательному решению, то и решение выходной задачи отрицательно.
==== Какие подходы к решению $NP$-трудных задач? ====
* Полный перебор (Brute force)
* Приближенное решение (с оценкой точности и с вероятностью ошибки)
* Стремление к полиномиальному решению в среднем (в худшем случае задача остается нерешаемой за полиномиальное время)
==== Какие задачи называются $NP$-полными? ====
$NP$-трудные задачи, принадлежащие классу $NP$.
**Примеры:** 3Sat, задача о вершинном покрытии (множество вершин, такое, что, у каждого ребра графа хотя бы один из концов входит в вершину из него) и т.д.
==== Как доказать, что задача является $NP$-трудной? ====
Существует два варианта:
- (Практически никогда не используется) Доказать, что все задачи из класса $NP$ сводится к данной. Таким способом была определена первая $NP$-трудная (и -полная) задача -- Sat.
- (Основной) Доказать, что к данной задаче сводится (за полиномиальное время) какая-нибудь $NP$-трудная задача. Отсюда следует, что все задачи можно свести к данной, так как любую задачу из $NP$ можно свести к $NP$-трудной задаче, а ее в свою очередь к данной.
==== Как доказать, что задача является $NP$-полной? ====
* Доказать, что она $NP$-трудная.
* Доказать, что она принадлежит $NP$.
===== Общая схема и проблема $NP=P$ =====
==== Гипотеза $NP=P$ ====
Существует гипотеза $P=NP$ (одна из центральных проблем теории алгоритмов). Гипотеза гласит, что **если решение задачи можно быстро проверить, то саму задачу можно быстро решить**. Гипотезу не могут ни опровергнуть, ни доказать уже более 30 лет.
Данная проблема является одной из задач тысячелетия. За ее решение Математический институт Клэя назначил премию в миллион долларов США.
==== Общая схема классов ====
{{:courses:algorithms_building_and_analysis:materials:np-class.png?720|}}
Обратим внимание на знаки **==?** на рисунке. Если хотя бы одна **$NP$-полная** (иначе говоря NPC) задача будет принадлежать классу $P$, то все остальные задачи из класса $NP$ также будут принадлежать классу $P$. Говоря на "языке рисунка": //из синей стрелки следуют синие пунктирные стрелки//. Именно так должно доказываться равенство $NP=P$.
Но тем не менее, ни одной $NP$-полной задачи, которая принадлежала бы классу $P$, не было найдено.
--- //[[kirvant31580@gmail.com|Облизанов Александр]]//