- •Теория np-полноты Труднорешаемые задачи
 - •Нерешенные проблемы теории np-полноты
 - •Полиномиальная сводимость и np-полные задачи
 - •Примеры np-полных задач
 - •1. Задача выполнимость
 - •2. Задача 3-выполнимость
 - •3. Задача о клике
 - •4. Задача о вершинном покрытии
 - •Приближенные алгоритмы решения np-полных задач Оценка качества приближенных алгоритмов
 - •Приближенный алгоритм решения задачи о вершинном покрытии
 
Теория np-полноты Труднорешаемые задачи
Рассмотренные ранее алгоритмы были полиномиальными.
Полиномиальным алгоритмом (или алгоритмом полиномиальной временной сложности) называется алгоритм, временная сложность которого равна O(p(n)), где p(n) – некоторая полиномиальная функция, а n – входная длина.
Множество полиномиальных алгоритмов образует класс полиномиальных алгоритмов – класс Р.
Всякая ли задача может быть решена за полиномиальное время? Ответ отрицательный, так как существуют вообще неразрешимые задачи, и есть задачи разрешимые, но за более чем полиномиальное время. Примеры:
Решение задачи об укладке рюкзака. При условии, что каждый из n предметов может быть упакован или не упакован в рюкзак, всего будет 2n вариантов взятых предметов.
Решение задачи коммивояжера сводится в худшем случае к перебору всех возможных маршрутов, а их всего существует (n-1)!. Это зависимость не может быть выражена полиномиальной функцией, причем можно заметить, что n≥2n
Задачи, для решения которых не существует полиномиального алгоритма, но существует экспоненциальный алгоритм (O(an)), называют труднорешаемыми.
Отличие полиномиальных и экспоненциальных алгоритмов будет более ощутимо, если обратиться к таблице, в которой отображено время работы алгоритма на компьютере, выполняющем 1000000 оп/с:
n O(n)  | 
		10  | 
		20  | 
		30  | 
		40  | 
		50  | 
		60  | 
	
n  | 
		0.00001 c  | 
		0.00002 c  | 
		0.00003 c  | 
		0.00004 c  | 
		0.00005 c  | 
		0.00006 c  | 
	
n2  | 
		0.0001 c  | 
		0.0004 c  | 
		0.0009 c  | 
		0.0016 c  | 
		0.0025 c  | 
		0.0036 c  | 
	
n5  | 
		0.1 c  | 
		3.2 c  | 
		24.3 c  | 
		1.7 мин  | 
		5.2 мин  | 
		13 мин  | 
	
2n  | 
		0.001 c  | 
		1 c  | 
		17.9 мин  | 
		12.7 дней  | 
		35.7 лет  | 
		366 столет.  | 
	
3n  | 
		0.059 c  | 
		58 мин  | 
		6.5 лет  | 
		3855 стол.  | 
		2∙108 стол.  | 
		1.3∙1013ст.  | 
	
n!  | 
		3.6 c  | 
		771,5 стол.  | 
		8∙1016стол  | 
		…  | 
		…  | 
		…  | 
	
Таким образом, понятие полиномиально разрешимой задачи принято считать уточнением идеи «практически разрешимой» задачи:
Полиномиальные алгоритмы действительно работают быстро, а полиномы больших степеней (n100) и полиномы с большим коэффициентом пропорциональности (1099·na) на практике встречаются крайне редко.
Полиномиальные алгоритмы не зависят от выбора конкретной модели вычислений (Pпо Тьюрингу= Pна МПД= P для параллельных вычислений).
Класс Р обладает свойством замкнутости (композиция двух полиномиальных алгоритмов дает алгоритм также полиномиальный, так как сумма, произведение и композиция многочленов, тоже являются многочленами).
Нерешенные проблемы теории np-полноты
К
  
ак
соотносятся классы P
и NP?
Так как любая задача класса Р
проверяема за полиномиальное время, то
очевидно следующее включение. 
Однако не известно, совпадают ли классы P и NP, но большинство специалистов считает, что нет. Интуитивно класс Р можно представить себе как класс задач, которые можно быстро решить, а класс NP – как класс задач, решение которых можно быстро проверить.
Существуют и другие открытые вопросы относительно класса NP:
Вопрос эквивалентности классов P и NP.
Вопрос замкнутости класса NP относительно дополнения, т. е. верно ли, что если L
NP,
	то и 
	
NP.
	Множество всех задач L,
	для которых это условие выполняется,
	назовем классом co-NP.
Так как класс Р замкнут относительно дополнения, то возможны следующие соотношения классов.
