Косовская Татьяна Матвеевна
О КЛАССАХ СЛОЖНОСТИ АЛГОРИТМОВ
В предыдущем номере журнала [1] было дано понятие временной сложности алгоритма как количества шагов его работы в зависимости от длины записи исходных данных и определены два класса предикатов. Класс P - класс предикатов, проверка истинности которых на детерминированной машине Тьюринга может быть осуществлена с количеством шагов, не превосходящим некоторого полинома от длины записи исходных данных. Класс NP - класс предикатов, проверка истинности которых на недетерминированной машине Тьюринга может быть осуществлена с количеством шагов, не превосходящим некоторого полинома от длины записи исходных данных. Было показано, что P с NP и сформулирована.
Теорема. Если задача принадлежит классу NP, то существует решающий ее алгоритм, реализованный на детерминированной машине Тьюринга, заканчивающей работу с числом шагов, не превосходящим 2 p(n), где p(n) - некоторый полином от длины записи исходных данных n.
То есть в настоящее время для задач из класса NP можно гарантировать только экспоненциальное время ее решения. Одной из самых сложных и актуальных проблем математики в настоящее время признана проблема совпадения или несовпадения классов P и NP.
Напомним, что если функция временной сложности ограничена многочленом от длины записи исходных данных, то говорят, что алгоритм имеет полиномиальную
сложность. Если же функция временной сложности ограничена степенной функцией (или функцией вида а?(п), где /(п) > пк, а > 1, к >0) от длины записи исходных данных, то алгоритм имеет экспоненциальную сложность.
ОТ-ПОЛНЫ1Е ЗАДАЧИ
Для решения вопроса о совпадении или различии классов Р и NP было введено понятие полиномиальной сводимости задач. Строгое определение можно посмотреть, например, в [2]. По сути дела задача Р1 полиномиально сводится к задаче Р2, если любые исходные данные задачи Р1 можно быстро (за полином шагов от длины их записи) переформулировать в исходные данные для Р2, причем обе задачи на этих парах исходных данных имеют (или не имеют) решения одновременно. Примерами таких задач являются, например, задачи «Коммивояжер» и «Гамильтонов цикл». Ниже через Х+ будет обозначаться множество целых положительных чисел.
Коммивояжер
Дано: С = {с1, ..., сп} - множество городов, ¿(с, с) е X - расстояния между
1 ] +
городами, В е .
Вопрос: существует ли маршрут, проходящий через все города из С, длина которого не превосходит В?
То есть существует ли последовательность городов с^, ..., сп, элементов из С, такая что %=1п-1 ¿(с1Г +1)) + ¿(си ^ £ В?
умела ао&вр&ю Ле В?
Гамильтонов цикл (ГЦ)
Дано: граф О = (V, Е) .
Вопрос: существует ли в О гамильтонов цикл?
То есть существует ли последовательность различных вершин графа ул, уп , такая что п - количество вершин в графе и каждая пара соседних вершин этой последовательности (а также первая и последняя) соединены ребром?
Задача «ГЦ» полиномиально сводится к задаче «Коммивояжер» следующим образом. Пусть заданы исходные данные для задачи «ГЦ» - множество вершин графа V и множество его ребер Е. Исходные данные для задачи «Коммивояжер» будут следующими. В качестве множества городов С берем множество V. Расстояниям присваиваем значения 1 или 2 по следующему правилу: если {у., у) е Е, то ¿(у., у) = 1; в противном случае ¿(у ., у) = 2. В качестве чис-1 ]
ла В берем количество вершин в графе.
Можно убедиться, что по всяким исходным данным для задачи «ГЦ» полиномиально быстро строятся исходные данные для задачи «Коммивояжер». Время требуется только на выписывание матрицы расстояний, а это квадрат от количества вершин графа. При этом на этих парах исходных данных задачи имеют (или не имеют) решение одновременно, так как маршрут для коммивояжера длины не более чем п может проходить только по ребрам графа.
Кроме того, если для решения задачи «Коммивояжер» имеется быстрый (полиномиальный) алгоритм, то и для решения задачи «ГЦ» также имеется быстрый (полиномиальный) алгоритм, время работы которого больше времени работы исходного алгоритма только на время записи новых исходных данных. К сожалению, полиномиальные алгоритмы для решения этих задач в настоящее время неизвестны, несмотря на практическую полезность задачи «Коммивояжер» и разнообразие методов, разработанных для ее решения.
Задача называется NP-полной, если она принадлежит классу NP и любая задача из класса NP полиномиально сводится к ней.
Надеюсь, что из рассмотренного примера должно быть ясно, что
- если для какой-либо NP-полной задачи доказано существование полиномиального алгоритма, то тем самым доказано, что P = ОТ;
- если же хоть для одной №-полной задачи будет доказано, что не существует решающего ее полиномиального алгоритма (то есть любой алгоритм, решающий ее, работает за время, большее любого полинома от длины записи исходных данных), то будет доказано, что P Ф №.
В настоящее время доказана № -полнота тысяч задач распознавания. Обширный список, содержащий более трехсот NP-пол-ных задач, приведен в [2]. Эти задачи относятся к самым различным областям математики и информатики: теория графов и построение сетей, множества и разбиения, хранение и поиск данных, теория расписаний, математическое программирование, алгебра и теория чисел, логика, теория автоматов и языков, оптимизация программ, игры и головоломки.
До сих пор ни для одной №-полной задачи не найден полиномиальный алгоритм. Среди математиков имеется достаточное основание предполагать, что таких алгоритмов и не существует. Но что же делать, если на практике требуется решать №-полную задачу для многих различных исходных данных? Неужели ждать завершения работы программы сотни лет?
К счастью, «Бог изощрен, но не злонамерен». Для различных исходных данных одной и той же длины время решения задачи различно. Лет тридцать назад некоторые математики «развлекались» тем, что для алгоритма, решающего NP-полную задачу, находили такие исходные данные, на которых число шагов работы алгоритма действительно экспоненциально. Это была не очень простая задача. При решении огромного количества практических задач их исходные данные таковы, что время работы алгоритма над этими исходными данными не столь велико, как могло бы быть. Но это далеко не для всех задач.
АНАЛИЗ ПОДЗАДАЧ
Подзадачей данной задачи называется такая задача, которая получается из исходной наложением некоторых ограничений на ее исходные данные. Например, подзадачей простейшей задачи наличия вещественных корней квадратного трехчлена с коэффициентами а, Ь, с $ х (ах2 + Ьх + с = 0) является задача наличия вещественных корней квадратного трехчлена с коэффициентами а, Ь, с при условии, что ас <0 $ х (ах2 + Ьх + с = 0 & ас <0). Исходная задача хоть и не сложна, но требует некоторых вычислений. Ее подзадача же тривиальна, так как такие квадратные трехчлены всегда имеют вещественные корни.
Анализ подзадач NP-полной задачи имеет важное практическое значение при ответе на вопрос, будет ли решающая поставленную задачу программа работать приемлемое время или нет.
Приведем несколько примеров NP-полных задач и их подзадач.
Выполнимость (Вып)
Дано: и = {ир ..., ип} - множество пропозициональных (булевских) переменных, С = {с1, ..., ст} - множество предложений (простых дизъюнкций, то есть дизъюнкций переменных и/или их отрицаний) над и.
Вопрос: Существует ли набор значений переменных, выполняющий каждое предложение из С? (То есть такой набор
...«■ог ъс^ощргЯ, Но Не¿моНяжергЯ»...
значений переменных, на котором каждое предложение из С истинно?)
3-Выполнимость (3-Вып)
Дано: и = {и1, ..., ип} - множество пропозициональных (булевских) переменных, С = {с1, ..., ст} - множество предложений (простых дизъюнкций) над и, каждое из которых содержит ровно три переменные.
Вопрос: Существует ли набор значений переменных, выполняющий каждое предложение из С?
2-Выполнимость (2-Вып)
Дано: и = {и1, ..., ип} - множество пропозициональных (булевских) переменных, С = {с1, ..., ст} - множество предложений (простых дизъюнкций) над и, каждое из которых содержит ровно две переменные.
Вопрос: Существует ли набор значений переменных, выполняющий каждое предложение из С?
1-Выполнимость (1-Вып)
Дано: и = {и1, ..., ип} - множество пропозициональных (булевских) переменных, С = {с1, ..., ст} - множество предложений (простых конъюнкций) над и, каждое из которых содержит ровно одну переменную.
Вопрос: Существует ли набор значений переменных, выполняющий каждое предложение из С?
Первые две задачи №-полны, хотя задача «3-Вып» и является подзадачей задачи «Вып» и полиномиальные алгоритмы их решения неизвестны. Задачи «2-Вып» и «1-Вып» тоже являются подзадачами задачи «Вып»,
ли Набор, ¿.НлгеНий аеремеЯЯш, &шоол№ющий каффое арефлофеНие С?
но для «2-Вып» известен полиномиальный алгоритм, а задача «1-Вып» легко решается непосредственным просмотром множества С.
Эти примеры могут показаться слишком абстрактными и не имеющими практического применения (хотя это и не так). Практическая полезность следующей NP-полной задачи, по-видимому, видна всем.
Расписание для мультипроцессорной системы
Дано: Конечное множество А «заданий», «длительности» 1(а) е для всех а е А, число т е «процессоров» и «директивный срок» D е
Вопрос: Существует ли разбиение А = А, и А0 и ... и А множества А на т
12 т
...ма^Аа ли распределила Осе fAgaftufr ...
гЛаби к <риреи%иОАому сраку Осе би О-шимАеАи?
непересекающихся множеств, такое что max < < S e . l(a) < D ?
1 < i < m a e A^ 4 '
То есть можно ли распределить все задания на m процессоров так, чтобы к директивному сроку все задания были бы выполнены?
Задача NP-полна, и полиномиальный алгоритм ее решения неизвестен. Но если требуется распределение на 2 процессора, на 3 процессора или даже на 100 процессоров (все это подзадачи исходной задачи), то такие подзадачи могут быть решены за время, не превосходящее некоторого полинома от длины записи исходных данных (число процессоров m в этих подзадачах исходными данными не являются). Конечно же, для каждого конкретного фиксированного количества процессоров m эти полиномы будут иметь различную степень, причем с ростом количества процессоров эта степень будет расти. Стоит задуматься о том, какая функция временной сложности - 2n (экспоненциальная сложность) или n100 (полиномиальная сложность) более приемлема для ваших исходных данных, если длина их записи n не превосходит 10, или 100, или 10 000.
Таким образом, первая рекомендация к тому, что же делать, если требуется многократно с исходными данными большой длины решать задачу, про которую вам кажется, что она NP-полна, заключается в следующем: проверьте, действительно ли исходные данные, которые будут подвергаться обработке, - это исходные данные для известной вам NP-полной задачи, а не для какой-то ее подзадачи.
ПСЕВДОПОЛИНОМИАЛЬНЫЕ ЗАДАЧИ
В некоторых случаях в качестве исходных данных для задачи выступают числа. Если временная сложность решения такой задачи не превосходит полинома от этих чисел (а не от длины их записи) и длины записи остальных исходных данных, то такая задача называется псевдополиномиальной. Среди псевдополиномиальных задач есть и NP-полные. Примером такой псев-дополиномиальнойи NP-полной задачи является задача «Разбиение».
Разбиение
Дано: Конечное множество A, для каждого а е A его «вес» s(a) е Z+.
Вопрос: Существует ли подмножество A' с A такое, что
Sa е A S(a) = Sa е (A \ A') s(a) ?
То есть можно ли разбить множество A на два подмножества одинакового веса?
Для этой задачи известен решающий ее алгоритм, который использует не более чем nB операций сложения (здесь B - сумма весов всех элементов из A, n - количество элементов в A). То есть временная сложность этого алгоритма ограничена полиномом от длины записи множества A (число n) и суммы числовых параметров задачи (число B).
Почему же эта задача псевдополино-миальна, а не полиномиальна? Вспомним, что временная сложность задачи - это функция от длины записи исходных данных. А всякое целое положительное число N может быть записано как N » 2log N » 2INI. Здесь |N| - длина записи числа N в двоичной системе счисления, запись логарифмической функции без указания основания подразумевает, что ее основание равно двум. То есть перед нами на самом деле экспоненциальный алгоритм.
Но у псевдополиномиальных задач есть одно преимущество - числовые параметры обычно не имеют очень большой длины записи. Например, трудно себе представить, чтобы вес многотонныхглыб измерялся в граммах. В крайнем случае, это будут килограммы.
Вот и вторая рекомендация к тому, что делать, если требуется многократно решать задачу, которая NP-полна. Проверьте, не является ли она псевдополиномиальной. И если длина записи числовых параметров, которые придется обрабатывать, не слишком велика, то смело пишите программу, предназначенную для многократного использования с различными исходными данными.
Ну а для NP-полных задач, в которых нечисловые параметры могут принимать самые различные значения, обычно используют приближенные методы их решения,
...мофЯо ли рауби&ь мЯофеай&о A Нл фвл о^иНлко4ого ß&M?
алгоритмы для которых иногда оказываются полиномиальными.
НЕКОТОРЫЕ ДРУГИЕ КЛАССЫ СЛОЖНОСТИ
До сих пор мы все время говорили о временной сложности алгоритмов, то есть о такой функции от длины записи исходных данных, что число шагов работы алгоритма (число шагов машины Тьюринга) с исходными данными заданной длины не превосходит значения этой функции. Однако достаточно часто встает вопрос о памяти, необходимой для решения той или иной задачи.
Под ёмкостной (или зональной) сложностью алгоритма A обычно понимают функцию, зависящую от длины записи исходных данных и выражающую верхнюю оценку памяти, необходимой для работы алгоритма.
В названиях классов сложности для различения временной или зональной сложности используют обозначения TIME и SPACE соответственно. При этом в случае, когда не может возникнуть неоднозначного прочтения, слово TIME может быть опущено.
Для обозначения того, какая модель машины Тьюринга использована в определении класса сложности - классическая (детерминированная) или недетерминированная, в начале названия класса ставят букву D или N соответственно, при этом буква D, как правило, опускается.
.. .gacfûaffanfai глс&а ê&ûœiû ¿опрос л плм^ойи, fteo6xofUMio& решения ЛлЛ или иНсй
В зависимости от того, какой функцией ограничены время или память вычислений, используют следующие обозначения: LOG - logarithmical - логарифмический; LIN - linear - линейный; P - polynomial - полиномиальный; EXP - exponential - экспоненциальный.
Так, например, полным названием класса P будет D-P-TIME (детерминированное полиномиальное время).
Если известна временная сложность алгоритма T(n), то всегда можно (достаточно грубо) оценить его зональную сложность S(n) и наоборот. Несложно доказать следующие неравенства. S(n) < T(n) и T(n) < 2CS (n), где C - некоторая константа.
Между классами сложности имеются некоторые включения, причем для ряда классов проблема об их совпадении или несовпадении остается открытой и является сложной математической задачей. Ниже приведем некоторые включения, при этом знак с будет использоваться для строгого
включения (то есть классы не совпадают), а для открытых проблем, то есть когда доказано нестрогое включение с, но неизвестно, совпадают классы или нет, будет использовано обозначение ? (см. схему 1).
^-ТРУДНЫЕ И Р-8РЛСЕ-ТРУДНЫЕ ЗАДАЧИ
Перечисленные выше классы сложности определены для задач распознавания (см. [1]), то есть для задач, имеющих в качестве ответа значения ДА или НЕТ. Для задач поиска, то есть для задач, в которых не только требуется ответить, существует ли описанный объект, но и найти его, перед именем класса иногда ставят букву Е, чтобы подчеркнуть, что это класс функций.
Понятно, что на практике, как правило, интересуются не только, например, тем, можно ли составить расписание с тем или иным свойством, но и самим таким расписанием. Интуитивно ясно, что время, затраченное на поиск решения задачи, не может быть меньше времени, затраченного на проверку, существует ли это решение (в крайнем случае, они будут совпадать).
Если в формулировке NP-полной задачи вместо слов «существует ли» поставить слово «найти», то мы получим формулировку NP-трудной задачи. Заметим, что говорить про NP-трудную задачу, что она NP-полна, неправильно, хотя все окружающие прекрасно поймут, что на самом деле вы должны были бы сказать.
Важным классом сложности, которому принадлежит огромное количество задач распознавания, является класс P-SPACE, поскольку задачи из этого класса могут быть решены с использованием не слишком боль-
LIN ® ?®N-LIN
? ® NP ® ? ® P-SPACE ® с
т 1
P с EXP-SPACE
I N^ т
с ® EXP ® ? ® N-EXP ® ? Схема 1.
шого объема памяти. Проблема совпадения или несовпадения классов NP и P-SPACE является столь же сложной, как и проблема совпадения или несовпадения классов P и ОТ.
Для решения этой проблемы было введено понятие P-SPACE-полной задачи, во многом аналогичное понятию NP-пол-ной задачи. Так же, как и для задач из класса NP, если в формулировке P-SPACE-полной задачи вместо слов «существует ли» поставить слово «найти», то мы получим формулировку P-SPACE-трудной задачи.
В заключение хочу сказать, что так же, как не обязательно NP-полная или NP-трудная задачи непригодны для практического многократного решения при различных исходных данных, так и не все задачи
с полиномиальными алгоритмами их решения могут быть решены на компьютере за приемлемое время.
При исследовании генома человека было необходимо попарно сравнить несколько сотен записей, длина которых составляла приблизительно 3 Мбайт. Точный алгоритм решения задачи имел квадратичную сложность, то есть п2 элементарных шагов, где п - длина одной записи.
Для поставленной задачи длина одной записи в исходных данных составила 3 Мбайт » 3 • 106 байт. При этом время сравнения одной пары записей составило (3 • 106)2-10-6 сек. = 9- 106 сек. = 15-104 мин. = = 25-102 час. » 102 дней.
Исследователь воспользовался приближенным алгоритмом решения задачи.
Литература
1. Косовская Т.М. О временной сложности решения задач распознавания // Компьютерные инструменты в образовании, 2005, № 3. С. 61-68.
2. М.Гэри, Д.Джонсон. Вычислительные машины и труднорешаемые задачи. М.: Мир, 1982.
416 с.
© Наши авторы, 2005. Оиг аи1Ьог5; 2005.
Косовская Татьяна Матвеевна, кандидат физико-математических наук, доцент кафедры математики Государственного Морского Технического Университета.