NP-полнота задачи о сумме подмножества — различия между версиями
KirillTim (обсуждение | вклад) (опечатки) |
KirillTim (обсуждение | вклад) (Страницы, описание времени работы) |
||
Строка 12: | Строка 12: | ||
===Доказательство принадлежности NP=== | ===Доказательство принадлежности NP=== | ||
− | В качестве сертификата возьмем удовлетворяющее условию задачи множество <math>S'</math> с суммой <math>s</math>. Оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция проверит вхождение всех элементов <math>S'</math> в множество <math>S</math>. | + | В качестве сертификата возьмем удовлетворяющее условию задачи множество <math>S'</math> с суммой <math>s</math>. Оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция проверит вхождение всех элементов <math>S'</math> в множество <math>S</math> за время <math>\left\vert{S'}\right\vert \times \left\vert{S}\right\vert</math>. |
− | ===Доказательство принадлежности | + | ===Доказательство принадлежности NPH=== |
Сведем [[NP-полнота_задачи_о_выполнимости_булевой_формулы_в_форме_3-КНФ|3-CNF_Sat]] к задаче о сумме подмножества. Пусть задана 3-CNF формула <math>\varphi</math> от <math>n</math> | Сведем [[NP-полнота_задачи_о_выполнимости_булевой_формулы_в_форме_3-КНФ|3-CNF_Sat]] к задаче о сумме подмножества. Пусть задана 3-CNF формула <math>\varphi</math> от <math>n</math> | ||
переменных <math>x_{i}</math>, состоящая из <math>k</math> пар скобок <math>C_{i}</math>. Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию <math>f\!\!:\varphi \to (S,s)</math>. | переменных <math>x_{i}</math>, состоящая из <math>k</math> пар скобок <math>C_{i}</math>. Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию <math>f\!\!:\varphi \to (S,s)</math>. | ||
Строка 64: | Строка 64: | ||
==Источники информации== | ==Источники информации== | ||
− | * Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein "Introduction to Algorithms, 3rd Edition" {{---}} Издательство MIT Press, 2009. {{---}} | + | * Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein "Introduction to Algorithms, 3rd Edition" {{---}} Издательство MIT Press, 2009. {{---}} 1086 c. {{---}} ISBN 978-0-262-03384-8 (англ.) |
− | * Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. 2-е издание. {{---}} М.: Издательский дом "Вильямс", 2002. {{---}} | + | * Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. 2-е издание. {{---}} М.: Издательский дом "Вильямс", 2002. {{---}} 423 с. {{---}} ISBN 5-8459-0261-4 (рус.) |
[[Категория: Теория сложности]] | [[Категория: Теория сложности]] | ||
[[Категория: Детерминированные и недетерминированные вычисления, сложность по времени и по памяти]] | [[Категория: Детерминированные и недетерминированные вычисления, сложность по времени и по памяти]] | ||
[[Категория: Примеры NP-полных языков]] | [[Категория: Примеры NP-полных языков]] |
Версия 20:55, 17 мая 2016
Задача: |
Дано множество
| , содержащие целых чисел и целое число . Требуется выяснить, возможно ли выбрать подмножество с суммой :
Содержание
Доказательство NP-полноты
Для доказательства того, что задаче о сумме подмножества (англ. Subset sum problem, NP-полной, необходимо доказать два факта:
)Доказательство принадлежности NP
В качестве сертификата возьмем удовлетворяющее условию задачи множество
с суммой . Оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция проверит вхождение всех элементов в множество за время .Доказательство принадлежности NPH
Сведем 3-CNF_Sat к задаче о сумме подмножества. Пусть задана 3-CNF формула от переменных , состоящая из пар скобок . Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию .
Построение сводящей функции
Для каждой переменной
и каждой пары скобок создадим по два числа в десятичной системе счисления, каждое длиной цифр. Эти числа образуют . Также создадим число длиной цифр. Присвоим каждому разряду полученных чисел (одинаковую для всех чисел) метку, соответствующую либо переменной, либо паре скобок. Метки, соответствующие парам скобок, присвоены младшим разрядам чисел.- В числе все разряды, соответствующие переменным, установим , а оставшиеся сделаем равными .
- Каждой переменной соответствуют два числа из : и . Опишем создание этих чисел. Разряд, соответствующий установим равным , а все остальные разряды, соответствующие переменным, установим равными . Далее, для числа установим все разряды, соответствующие парам скобок, содержащих , равными . Во все остальные "скобочные" разряды поставим . В числе установим все разряды, соответствующие парам скобок, содержащих , равными , а во все остальные "скобочные" разряды поставим .
- Каждой паре скобок соответствуют два числа из : и . Оба этих числа содержат во всех разрядах, кроме соответствующего . В этом разряде у поставим , а у — .
Корректность сводящей функции
- Получаемое сводящей функцией множество состоит из десятичных чисел длиной каждое, выставление каждого разряда занимает полиномиальное время. Таким образом, сведение выполняется за полиномиальное время.
- Пусть формула выполнима, то есть существует набор значений . И пусть . Тогда в полученном множестве существует подмножество с суммой . Действительно, для каждой переменной, если , то добавим в . Иначе добавим . Теперь содержит уже чисел. Заметим, что для каждого "скобочного" разряда в уже набранной части есть не менее одного и не более трех чисел, у которых в данном разряде стоит . Значит для каждого соответствующего паре скобок разряда мы сможем выбрать одно или оба числа и так, чтобы сумма в данном разряде совпадала с требуемой (стала равна ). Добавим их в . Также заметим, что суммы во всех "переменных" разрядах равны , так как для каждого выбиралось строго одно число из и . Значит, .
- Пусть теперь в наборе есть подмножество . Тогда исходная формула выполнима. Действительно, если , то установим переменную . Если же , то . Покажем, что . Действительно, так как , в каждой паре скобок хотя бы один терм равен . Значит каждый терм равен . А тогда и вся .
Пример сведения
Пусть исходная функция
. Пометим разряды следующим образом (слева направо): . Тогда:
Тогда набору значений
соответствует . И действительно, .См. также
Источники информации
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein "Introduction to Algorithms, 3rd Edition" — Издательство MIT Press, 2009. — 1086 c. — ISBN 978-0-262-03384-8 (англ.)
- Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. 2-е издание. — М.: Издательский дом "Вильямс", 2002. — 423 с. — ISBN 5-8459-0261-4 (рус.)