Алгоритм решает задачу за полиномиальное время, если его временная эффективность в наихудшем случае принадлежит классу O(P(n)), где P(n) — полином от размера входных данных n.
Так как мы используем запись с большим "О", задачи, решаемые за логарифмическое время, включаются в O(P(n)).
Задачу, которая может быть решена за полиномиальное время, будем называть легкой, а задачу, которая не может быть решена за полиномиальное время, — трудной.
Задачи принятия решения представляют собой задачи, ответ на которые — "да" либо "нет".
Класс P представляет собой класс задач принятия решения, которые могут быть решены (детерминистическим) алгоритмом за полиномиальное время. Этот класс задач называется полиномиальным.
Ограничение класса P только задачами принятия решения можно объяснить следующими причинами.
Например, вместо выяснения, какое наименьшее количество цветов надо для раскраски вершин графа, так, чтобы никакие две смежные вершины не были одного цвета, мы можем выяснять, существует ли такая раскраска вершин графа не более чем m цветами при m=1,2,....
Некоторые задачи принятия решения не могут быть решены вообще, никаким алгоритмом. Такие задачи называются неразрешимыми. Например, задача останова: для данной компьютерной программы и входных данных определить, завершится ли выполнение программы или она будет выполняться бесконечно.
Существуют задачи разрешимые, но трудные. Но для многих важных задач не был найден алгоритм с полиномиальным временем работы, но и не доказана невозможность его существования. Например, задача коммивояжера, задача о рюкзаке, упаковка корзин, раскраска графа, целочисленное линейное программирование.
Задача обхода всех ребер по одному разу (эйлеров цикл) может быть решена за O(n^2) в отличие от похожей задачи о цикле, обходящем по одному разу все вершины (гамильтонов цикл), для которой не найдено полиномиальное решение.
При том, что решение задач может быть вычислительно сложным, проверка предложенного решения обычно достаточно проста и может быть выполнена за полиномиальное время.
Недетерминистическим алгоритмом называется двухэтапная процедура, которая получает в качестве входа экземпляр I задачи принятия решения и делает следующее.
Недетерминистический алгоритм является недетерминистическим полиномиальным, если временная эффективность этапа проверки полиномиальная.
Класс NP — это класс задач принятия решения, которые могут быть решены недетерминистическим полиномиальным алгоритмом. Этот класс задач называется недетерминистическим полиномиальным.
Большинство задач принятия решения принадлежат классу NP. Прежде всего этот класс включает все задачи класса P: P sube NP. С другой стороны, задача останова не входит в класс NP.
Наиболее важный открытый вопрос теоретической информатики: является ли класс P истинным подмножеством NP или на самом деле оба эти класса совпадают?
Некоторые известные задачи принятия решения являются NP-полными. NP-полная задача — это задача класса NP, которая так же сложна, как и любая другая задача этого класса, поскольку по определению любая другая задача класса NP может быть приведена к ней за полиномиальное время.
Из определения NP-полноты следует, что если будет найден детерминистический алгоритм решения одной из NP-полных задач, то все задачи в NP могут быть решены за полиномиальное время при помощи детерминистического алгоритма, следовательно, P = NP.
Первой найденной в 1971г. задачей из класса NP-полных стала задача CNF-выполнимости, в которой спрашивается, можно ли назначить переменным в булевом выражении значения true и false так, чтобы результат вычисления всего выражения был равен true.
С того времени были найдены сотни других примеров NP-полных задач. Известно, однако, что если P!=NP, то должны существовать NP-задачи, которые не являются ни P-задачами, ни NP-полными задачами.
Много лет ведущим кандидатом в примеры такой задачи была задача определения того, является ли заданное число простым или составным, но в 2002 был открыт детерминистический полиномиальный алгоритм для проверки простоты числа.
На сегодняшний день знание того, что задача является NP-полной, имеет важные практические следствия. Это означает, что, столкнувшись с NP-полной задачей, не стоит устраивать революцию в информатике, разрабатывая полиномиальный алгоритм. Вместо этого следует сконцентрироваться на нескольких подходах поиска уменьшения сложности стоящей перед вами задачи.