Я думаю, что статьи из Википедии
P , NP и P против NP довольно хороши. Все еще вот что я бы сказал: Часть I , Часть II
[Я буду использовать замечания в скобках, чтобы обсудить некоторые технические детали, которые вы можете пропустить, если хотите.]
Часть I
Решение проблем
Существуют различные виды вычислительных задач. Однако во введении в курс теории вычислительной сложности легче сосредоточиться на проблеме решения , то есть на проблемах, где ответом является ДА или НЕТ. Существуют и другие виды вычислительных проблем, но большую часть времени вопросы о них можно свести к аналогичным вопросам о проблемах решения. Причем решение проблем очень простое. Поэтому во введении в курс теории вычислительной сложности мы сосредоточим наше внимание на изучении проблем решения.
Мы можем идентифицировать решение проблемы с подмножеством входов, которые имеют ответ ДА. Это упрощает обозначения и позволяет записать
x∈Q вместо Q(x)=YES и
x∉Q вместо Q ( x ) = NО .
Другая перспектива заключается в том, что мы говорим о членских запросах в наборе. Вот пример:
Решение проблемы:
Ввод: натуральное число Икс ,
вопрос: является ли Икс четным числом?
Проблема членства:
Ввод: натуральное число Икс ,
Вопрос: Икс в Еv e n = { 0 , 2 , 4 , 6 , ⋯ } ?
Мы называем ответ «ДА» на входе принятием ввода, а ответ «НЕТ» на входе отклонением ввода.
Мы рассмотрим алгоритмы решения задач и обсудим, насколько эффективны эти алгоритмы при использовании вычислимых ресурсов . Я буду полагаться на вашу интуицию от программирования на языке, подобном C, вместо формального определения того, что мы подразумеваем под алгоритмом и вычислительными ресурсами.
[Примечания: 1. Если бы мы хотели сделать все формально и точно, нам нужно было бы исправить модель вычислений, например, стандартную модель машины Тьюринга, чтобы точно определить, что мы подразумеваем под алгоритмом и его использованием вычислительных ресурсов. 2. Если мы хотим поговорить о вычислениях над объектами, которые модель не может обработать напрямую, нам нужно закодировать их как объекты, которые может обрабатывать модель машины, например, если мы используем машины Тьюринга, нам нужно кодировать объекты, такие как натуральные числа и графики. как двоичные строки.]
п = проблемы с эффективными алгоритмамипоискарешений
Предположим, что эффективные алгоритмы означают алгоритмы, которые используют не более полиномиального количества вычислительных ресурсов. Основным ресурсом, который нас интересует, является время выполнения алгоритмов в наихудшем случае в зависимости от размера ввода, т. Е. Количество основных шагов, которые алгоритм выполняет для ввода размера N . Размер входа Икс равен N если для хранения x требуется N бит компьютерной памяти , и в этом случае мы пишем | х | = п . Таким образом, под эффективными алгоритмами мы подразумеваем алгоритмы, которые имеют полиномиальное время выполнения в худшем случае .Икс| х | =n
Предположение , что алгоритмы полиномиального времени захвата интуитивного понятия эффективных алгоритмов известно как тезис Кобого . Я не буду сейчас обсуждать, является ли п подходящей моделью для эффективно решаемых задач и п или нет отражает то, что может быть эффективно вычислено на практике, и связанные с этим вопросы. Пока есть веские основания для такого предположения, поэтому для нашей цели мы предполагаем, что это так. Если вы не принимаете тезис Кобхэма, это не делает неверным то, что я пишу ниже, единственное, что мы потеряем, - это интуиция об эффективных вычислениях на практике. Я думаю, что это полезное предположение для тех, кто начинает изучать теорию сложности.
п - это класс задач решения, которые могут быть эффективно решены,
то есть задачи решения, которые имеют алгоритмы полиномиального времени.
Более формально, мы говорим, что решение проблемы Q находится в п если
существует эффективный алгоритм A , который
для всех входов Икс ,
- если Q ( x ) = YЕS то A ( x ) = YЕS ,
- если Q ( x ) = NО тогда A ( x ) = NО .
Можно просто писать A ( x ) = Q ( x ) , но я пишу это таким образом , чтобы мы могли сравнить его с определением Н П .
Н П = Проблемы с эффективными алгоритмамипроверкидоказательств / сертификатов / свидетелей
Иногда мы не знаем какого-либо эффективного способа найти ответ на решение проблемы, однако, если кто-то говорит нам ответ и дает нам доказательство,
мы можем эффективно проверить правильность ответа, проверив доказательство, чтобы увидеть, является ли оно действительным доказательством. , Это идея сложности класса Н П .
Если доказательство слишком длинное, оно не очень полезно, может потребоваться слишком много времени, чтобы просто прочитать доказательство, не говоря уже о проверке, является ли оно действительным. Мы хотим, чтобы время, необходимое для проверки, было разумным по размеру исходного ввода, а не по размеру предоставленного доказательства! Это означает, что мы действительно хотим не произвольных длинных доказательств, а коротких доказательств. Обратите внимание, что если время выполнения верификатора является полиномиальным по размеру исходного ввода, то он может прочитать только полиномиальную часть доказательства. Итак, под коротким мы подразумеваем полиномиальный размер .
Формируйте этот пункт всякий раз, когда я использую слово «доказательство», я имею в виду «краткое доказательство».
Вот пример проблемы, которую мы не знаем, как эффективно решить, но мы можем эффективно проверить доказательства:
Ввод разбиения : конечное множество натуральных чисел S ,
Вопрос: можно ли разбить S на два множества A и В
( A ∪ B = S и A ∩ B = ∅ )
, так что сумма чисел в A равна сумма числа в В ( Σx ∈ Aх = ∑x ∈ BИкс )?
Если я даю вам S и спрашиваю, можем ли мы разделить его на два набора так, чтобы их суммы были равны, вы не знаете никакого эффективного алгоритма для его решения. Вероятно, вы попробуете все возможные способы разбиения чисел на два набора, пока не найдете раздел, в котором суммы равны, или пока не перепробуете все возможные разделы, и ни один из них не сработал. Если бы кто-то из них работал, вы бы сказали «ДА», иначе - «НЕТ».
Но существует много экспоненциальных разделов, поэтому это займет много времени. Однако , если я дам вам два множества A и В , вы можете легко проверить , если суммы равны , и если A и В является разбиением S . Обратите внимание, что мы можем эффективно вычислять суммы.
Здесь пара A и В которую я вам даю, является доказательством ответа ДА. Вы можете эффективно проверить мою претензию, посмотрев мое доказательство и проверив, является ли оно действительным доказательством . Если ответ ДА, то есть действительное доказательство, и я могу предоставить его вам, и вы сможете проверить его эффективно. Если ответ НЕТ, то нет никаких веских доказательств. Поэтому все, что я вам даю, вы можете проверить и увидеть, что это не является действительным доказательством. Я не могу обмануть вас неверным доказательством того, что ответ ДА. Напомним, что если доказательство слишком большое, его проверка займет много времени, мы не хотим, чтобы это произошло, поэтому нам важны только эффективные доказательства, то есть доказательства, имеющие полиномиальный размер.
Иногда люди используют « свидетельство » или « свидетель » вместо «доказательства».
Примечание. Я даю вам достаточно информации об ответе для данного ввода Икс
чтобы вы могли эффективно найти и проверить ответ. Например, в нашем примере с разделами я не говорю вам ответ, я просто даю вам раздел, и вы можете проверить, является ли он действительным или нет. Обратите внимание, что вы должны проверить ответ самостоятельно, вы не можете доверять мне в том, что я говорю. Более того, вы можете проверить только правильность моих доказательств. Если мои доказательства верны, это означает, что ответ ДА. Но если мое доказательство неверно, это не значит, что ответ НЕТ. Вы видели, что одно доказательство было недействительным, а не то, что нет действительных доказательств. Мы говорим о доказательствах ДА. Мы не говорим о доказательствах для НЕТ.
Давайте рассмотрим пример:
A = { 2 , 4 } и B = { 1 , 5 } являются доказательством того, что
S= { 1 , 2 , 4 , 5 } можно разбить на два множества с равными суммами. Нам просто нужно суммировать числа в A и число в В и посмотреть , если результаты равны, и проверить , если , B является разбиение S .AВS
Если я дал вам A = { 2 , 5 } и B = { 1 , 4 } , вы проверите и увидите, что мое доказательство недействительно. Это не означает, что ответ НЕТ, это просто означает, что это конкретное доказательство было недействительным. Ваша задача здесь не в том, чтобы найти ответ, а только в том, чтобы проверить, верны ли предоставленные вами доказательства.
Это как студент, решающий вопрос на экзамене, и профессор, проверяющий, правильный ли ответ. :) (к сожалению, часто студенты не дают достаточно информации, чтобы проверить правильность своего ответа, и профессора должны угадать остальную часть своего частичного ответа и решить, какую оценку они должны дать студентам за их частичные ответы, действительно довольно сложно задача).
Удивительно то, что та же самая ситуация применима ко многим другим естественным проблемам, которые мы хотим решить:
мы можем эффективно проверить, является ли данное краткое доказательство допустимым, но мы не знаем никакого эффективного способа найти ответ . Это мотивация , почему сложность класса Н П является чрезвычайно интересным
(хотя это не было первоначальным мотивом для его определения). Что бы вы ни делали (не только в CS, но и в математике, биологии, физике, химии, экономике, менеджменте, социологии, бизнесе, ...), вы столкнетесь с вычислительными проблемами, которые попадают в этот класс. Чтобы получить представление о том, сколько проблем оказывается в Н П посмотрите
сборник задач оптимизации NP . На самом деле у вас будет трудно найти естественные проблемы , которые не находятся в Н П . Это просто потрясающе.
Н П - это класс задач, которые имеют эффективные верификаторы, то есть
существует алгоритм за полиномиальное время, который может проверить, является ли данное решение правильным.
Более формально, мы говорим, что решение проблемы Q находится в Н П если
существует эффективный алгоритм В называемый верификатором, такой, что
для всех входов Икс ,
- если Q ( x ) = YЕS то существует доказательство Y такое, что В( х , у) = YЕS ,
- если Q ( x ) = NО , то для всех доказательств Y , В( х , у) = NО .
Мы говорим, что верификатор является надежным,
если он не принимает никаких доказательств, когда ответ НЕТ. Другими словами, звуковой верификатор нельзя обмануть, чтобы принять доказательство, если ответ действительно НЕТ. Нет ложных срабатываний.
Точно так же мы говорим, что верификатор завершен,
если он принимает хотя бы одно доказательство, когда ответ ДА. Другими словами, полный верификатор может быть убежден, что ответом будет ДА.
Терминология происходит от логики и систем доказательства . Мы не можем использовать систему звукоизоляции для доказательства каких-либо ложных утверждений. Мы можем использовать полную систему доказательств, чтобы доказать все истинные утверждения.
Верификатор В получает два входа,
- Икс : исходный ввод дляQ , и
- Y : предложенное доказательство дляQ ( x ) = YЕS .
Обратите внимание, что мы хотим, чтобы В был эффективным в размере Икс . Если Y большого доказательство верификатор будет иметь возможность читать только полиномиальную часть от Y . Вот почему мы требуем, чтобы доказательства были короткими. Если Y коротко, то сказать, что В эффективно в Икс
, то же самое, что сказать, что В эффективно в Икс и Y
(потому что размер Y ограничен фиксированным многочленом в размере Икс ).
Таким образом, чтобы показать, что проблема решения Q находится в Н П
мы должны дать эффективный алгоритм верификатора, который является надежным и полным .
Историческая справка: исторически это не первоначальное определение Н П . В первоначальном определении используются так называемые недетерминированные машины Тьюринга. Эти машины не соответствуют какой-либо реальной модели машины и к ним трудно привыкнуть (по крайней мере, когда вы начинаете изучать теорию сложности). Я читал, что многие эксперты считают, что они использовали бы определение верификатора в качестве основного определения и даже назвали бы класс V P
(для проверяемого в полиномиальном времени) вместо Н П
если они вернутся к началу теории вычислительной сложности. Определение верификатор более естественно, легче понять концептуально, и проще в использовании , чтобы показать проблемы в Н П .
P ⊆ N P
Поэтому мы имеем
п = эффективно разрешимое и Н П = эффективно проверяемое . Таким образом, P = N P если проблемы, которые могут быть эффективно проверены, совпадают с проблемами, которые могут быть эффективно решены.
Обратите внимание, что любая проблема в п также находится в Н П , т.е. если вы можете решить проблему, вы также можете проверить, является ли данное доказательство правильным: верификатор просто проигнорирует доказательство!
Это потому, что нам это не нужно, верификатор может вычислить ответ самостоятельно, он может решить, является ли ответ ДА или НЕТ без какой-либо помощи. Если ответ НЕТ, мы знаем, что не должно быть никаких доказательств, и наш верификатор просто отклонит все предложенные доказательства. Если ответ ДА, то должно быть доказательство, а на самом деле мы просто принимать что - либо в качестве доказательства.
[Мы могли бы сделать так, чтобы наш верификатор принимал только некоторые из них, что тоже хорошо, если наш верификатор принимает хотя бы одно доказательство, что верификатор работает правильно для этой проблемы.]
Вот пример:
Сумма
ввода: список n + 1 натуральных чисел 1 , ⋯ , п и s , вопрос: является Σ п я = 1 я = S ?a1, ⋯ , аNs
ΣNi=1ai=s
Проблема в P потому что мы можем суммировать числа и затем сравнить их с s , мы возвращаем YES, если они равны, и NO, если они не равны.
Проблема также в NP . Рассмотрим верификатор V который получает доказательство плюс ввод для Sum. Он действует так же, как алгоритм в P который мы описали выше. Это эффективный верификатор для Sum.
Обратите внимание, что существуют другие эффективные верификаторы для Sum, и некоторые из них могут использовать предоставленное им доказательство. Однако тот, который мы разработали, нет, и это тоже хорошо. Так как мы дали эффективный верификатор для Sum проблема в NP . Тот же трюк работает для всех других проблем в P так
P⊆NP .
Алгоритмы грубой силы / исчерпывающего поиска для NP и NP⊆ExpTime
Лучшие алгоритмы, которые мы знаем для решения произвольной задачи в NP - это
алгоритмы полного перебора / исчерпывающего поиска . Выберите эффективный верификатор для задачи (у него есть эффективный верификатор по нашему предположению, что он находится в NP ) и проверьте все возможные доказательства одно за другим. Если верификатор принимает один из них, то ответ - ДА. В противном случае ответ НЕТ.
В нашем примере с разделами мы пробуем все возможные разделы и проверяем, равны ли суммы в любом из них.
Обратите внимание, что алгоритм перебора работает в экспоненциальном времени в худшем случае. Размер доказательств является полиномиальным по размеру входных данных. Если размер доказательств равен m то существует 2m возможных доказательств. Проверка каждого из них займет полиномиальное время у верификатора. Таким образом, в целом алгоритм грубой силы занимает экспоненциальное время.
Это показывает , что любая NP проблема может быть решена в экспоненциальное время, т.е.
NP⊆ExpTime . (Более того, алгоритм грубой силы будет использовать только полиномиальный объем пространства, то есть
NP⊆PSpace
но это история для другого дня).
Задача в NP может иметь гораздо более быстрые алгоритмы, например, любая проблема в P имеет алгоритм за полиномиальное время. Однако для произвольной задачи в NP
мы не знаем алгоритмов, которые могли бы работать намного лучше. Другими словами, если вы просто скажете мне, что ваша проблема в NP
(и ничего больше о проблеме), то самый быстрый алгоритм, который мы знаем для ее решения, занимает экспоненциальное время.
Однако это не означает, что не существует лучших алгоритмов,
мы этого не знаем . Насколько нам известно, все еще возможно (хотя это считается очень маловероятным почти всеми теоретиками сложности), что
NP=P и все проблемы NP могут быть решены за полиномиальное время.
Кроме того, некоторые эксперты предполагают, что мы не можем добиться намного большего успеха, то есть в NP есть проблемы, которые не могут быть решены гораздо более эффективно, чем алгоритмы поиска методом грубой силы, которые занимают экспоненциальное количество времени. См. Экспоненциальную гипотезу времени
для получения дополнительной информации. Но это не доказано, это только предположение . Это просто показывает, насколько мы далеки от нахождения алгоритмов полиномиального времени для произвольных задач NP
Эта связь с экспоненциальным временем смущает некоторых людей: они неправильно думают, что для
задач NP требуется экспоненциальное время (или, что еще хуже, для них вообще нет алгоритма). Утверждение, что проблема в NP
, не означает, что проблему трудно решить, это просто означает, что ее легко проверить, это верхняя граница сложности решения проблемы, и многие проблемы NP легко решить. так как P⊆NP .
Тем не менее, есть NP проблемы , которые , кажется, трудно решить. Я вернусь к этому , когда мы обсудим NP -hardness.
Нижние границы кажутся трудными доказать
Итак, теперь мы знаем, что в N P существует
много естественных проблем , и мы не знаем ни одного эффективного способа их решения, и мы подозреваем, что для их решения действительно требуется экспоненциальное время. Можем ли мы доказать это?NP
К сожалению, задача доказательства нижних границ очень сложна. Мы даже не можем доказать, что эти проблемы требуют больше, чем линейное время ! Не говоря уже о экспоненциальном времени.
Доказать нижние границы линейного времени довольно просто: алгоритм должен все-таки прочитать входные данные. Доказательство суперлинейных нижних границ - это совсем другая история. Мы можем доказать суперлинейные нижние оценки с большим количеством ограничений относительно вида алгоритмов, которые мы рассматриваем, например, алгоритмы сортировки с использованием сравнения, но мы не знаем нижних границ без этих ограничений.
Чтобы доказать верхнюю оценку для задачи, нам просто нужно разработать достаточно хороший алгоритм. Часто требуется знание, креативное мышление и даже изобретательность, чтобы придумать такой алгоритм.
Однако задача значительно проще по сравнению с доказательством нижней границы. Мы должны показать, что нет хороших алгоритмов . Не то чтобы мы не знали достаточно хороших алгоритмов прямо сейчас, но не существует никаких хороших алгоритмов , что никто никогда не придумает хороший алгоритм . Подумайте об этом на минуту, если вы еще этого не сделали, как мы можем показать такой невозможный результат ?
Это еще одно место, где люди путаются. Здесь «невозможность» - математическая невозможность , т. Е. С нашей стороны не так уж легко, что какой-то гений может исправить в будущем. Когда мы говорим невозможное, мы имеем в виду, что это абсолютно невозможно, так же невозможно, как 1=0 . Никакой научный прогресс не может сделать это возможным. Это то, что мы делаем, когда доказываем нижние границы.
Доказать нижнюю границу, т. Е. Показать, что проблема требует некоторого времени для решения, означает, что мы должны доказать, что любаяАлгоритм, даже очень изобретательный, который еще не знает, не может решить проблему быстрее. Есть много интеллектуальных идей, о которых мы знаем (жадность, согласование, динамическое программирование, линейное программирование, полуопределенное программирование, программирование суммы квадратов и многие другие интеллектуальные идеи), и есть еще много, о которых мы еще не знаем. Исключить один алгоритм или одну конкретную идею разработки алгоритмов недостаточно, мы должны исключить все из них, даже те, о которых мы еще не знаем, даже те, о которых, возможно, даже не знают! И все это можно объединить в одном алгоритме, поэтому мы должны также исключить их комбинации. Там был достигнут некоторый прогресс в направлении , показывая , что некоторые идеи не могут решать сложные NPпроблемы, например, жадность и ее расширения не могут работать, и есть некоторые работы, связанные с алгоритмами динамического программирования, и есть некоторые работы по конкретным способам использования линейного программирования. Но они даже близко не исключают известные нам интеллектуальные идеи (ищите нижние границы в ограниченных моделях вычислений, если вам это интересно).
Барьеры: нижние границы являются Трудно доказать
С другой стороны, у нас есть математические результаты, называемые
барьерами,
которые говорят, что доказательство нижней границы не может быть таким-то и таким-то и таким-то и почти охватывает все методы, которые мы использовали для доказательства нижних оценок! На самом деле многие исследователи перестали работать над доказательством нижних оценок после того, как Александр Разбаров и Стивен Рудич защитили
естественный барьер доказательств . Оказывается, что существование определенного вида доказательств с нижней границей подразумевает небезопасность криптографических генераторов псевдослучайных чисел и многих других криптографических инструментов.
Я говорю почти потому, что в последние годы был достигнут некоторый прогресс, в основном, благодаря Райану Уильямсу
, который сумел интеллектуально обойти барьерные результаты, но пока результаты для очень слабых моделей вычислений и весьма далеки от исключения общих алгоритмов полиномиального времени. ,
Но я расходлюсь. Основной момент , который я хотел сделать, что доказывает нижние границы трудно , и мы не имеем сильные нижние оценки для общих алгоритмов , решающих NP проблем.
[С другой стороны, работа Райана Уильямса показывает, что существуют тесные связи между доказательством нижних оценок и доказательством верхних оценок. Смотрите его выступление на ICM 2014, если вам интересно.]
Сокращения: решение проблемы с использованием другой проблемы в качестве подпрограммы / Oracle / Black Box
Идея сокращения очень проста: чтобы решить проблему, используйте алгоритм для другой задачи.
Вот простой пример: предположим, что мы хотим вычислить сумму списка из n натуральных чисел, и у нас есть алгоритм Sum который возвращает сумму двух заданных чисел. Можем ли мы использовать Sum чтобы сложить числа в списке? Конечно!
Проблема:
Входные данные: список из n натуральных чисел x1,…,xn ,
Выходные данные: return ∑ni=1xi .
Алгоритм редукции:
- s=0
- для i от 1 до n
2.1. s=Sum(s,xi)
- возврат s
Здесь мы используем Sum в нашем алгоритме в качестве подпрограммы . Обратите внимание , что мы не заботимся о том , как Sum работы, он действует как черный ящик для нас, мы не волнует , что происходит внутри Sum . Мы часто ссылаемся на подпрограмме Sum в качестве оракула . Это похоже на оракула Дельфи в греческой мифологии, мы задаем вопросы, и оракул отвечает на них, и мы используем ответы.
По сути, это и есть сокращение: предположим, что у нас есть алгоритм для задачи, и используем его как оракула для решения другой проблемы. Здесь «эффективный» означает «эффективный», если предположить, что оракул отвечает за единицу времени, то есть мы считаем каждое исполнение оракула одним шагом.
Если оракул возвращает большой ответ, нам нужно прочитать его, и это может занять некоторое время, поэтому мы должны посчитать время, которое требуется нам, чтобы прочитать ответ, который дал нам оракул. Аналогично для написания / задания вопроса от оракула. Но оракул работает мгновенно, то есть, как только мы задаем вопрос от оракула, оракул записывает для нас ответ за одну единицу времени. Вся работа, которую делает оракул, считается одним шагом, но это исключает время, которое требуется нам, чтобы написать вопрос и прочитать ответ.
Поскольку нам не важно, как работает оракул, а только об ответах, которые он возвращает, мы можем сделать упрощение и считать оракул самой проблемой вместо алгоритма для него. Другими словами, нам все равно, если оракул не является алгоритмом, нас не волнует, как оракулы придумывают свои ответы.
Например,
Sum в вопросе выше - это сама функция сложения (а не алгоритм вычисления сложения).
Мы можем задать несколько вопросов от оракула, и эти вопросы не нужно задавать заранее: мы можем задать вопрос и, основываясь на ответе, который возвращает оракул, мы выполним некоторые вычисления самостоятельно, а затем зададим другой вопрос, основываясь на ответе, который мы получили для предыдущий вопрос.
Еще один способ взглянуть на это - думать об этом как об интерактивном вычислении . Интерактивные вычисления сами по себе являются большой темой, поэтому я не буду вдаваться в них здесь, но я думаю, что упоминание этой перспективы сокращений может быть полезным.
Алгоритм , который использует оракул / черный ящик O обычно обозначается как A O .AOAO
Сокращением мы обсуждали выше , является наиболее общей формой сокращения и известно как сокращения черного ящика
(он же сокращение оракула , сокращения Тьюринга ).
Более формально:
Говорят , что проблема Q черный ящик сводится к задаче O и писать Q≤TO тогда и только тогда
существует алгоритм таким образом, что для всех входов х , Q ( х ) = О ( х ) .Ax
Q(x)=AO(x)
Другими словами , если существует алгоритм который использует оракула O в качестве подпрограммы и решает проблему Q .AOQ
Если наш алгоритм редукции работает в полиномиальное время мы называем это сокращение черного ящика полиномиальное время или просто сокращение Кук
(в честь
Стивен А. Кук ) и писать Q ≤ P T O . (Нижний индекс Т означает «Тьюринг» в честь
Алана Тьюринга ).AQ≤PTOT
Однако мы можем захотеть наложить некоторые ограничения на способ взаимодействия алгоритма редукции с оракулом. Есть несколько ограничений, которые изучаются, но самое полезное ограничение называется сокращением много-один
( сокращение отображений ).
Идея здесь заключается в том, что на данном входе x мы выполняем некоторые вычисления за полиномиальное время и генерируем y
который является экземпляром проблемы, которую решает оракул. Затем мы спрашиваем оракула и возвращаем ответ, который он нам возвращает. Нам разрешено задать один вопрос от оракула, и ответы оракула - это то, что будет возвращено.
Более формально,
Мы говорим, что проблема Q многозначна, сводима к проблеме O и писать Q≤mO тогда и только тогда
существует алгоритм таким образом, что для всех входов х , Q ( х ) = О ( ( х ) ) .Ax
Q(x)=O(A(x))
Когда алгоритм редукции является полиномиальное время мы называем это
полиномиальное время многих один сокращение или просто сокращение Карп (в честь
Ричарда М. Карп ) и обозначим его через Q≤PmO .
Основная причина заинтересованности в данном конкретном неинтерактивном снижении является то , что она сохраняет NP проблемы: если существует полиномиальные многое одна сокращения от задачи A до NP проблем B , то также находится в N P ,ANP
Простое понятие редукции является одним из наиболее фундаментальных понятий в теории сложности наряду с P , NP и NP -полным (о чем мы поговорим ниже).
Пост стал слишком длинным и превышает лимит ответа (30000 символов). Я продолжу ответ в части II .