Проблема суммы подмножества - Subset sum problem

В проблема суммы подмножества это проблема решения в Информатика. Есть несколько эквивалентных формулировок задачи. Один из них: учитывая мультимножество целых чисел, существует ли непустое подмножество, сумма которого равна нулю? Например, учитывая набор , ответ да потому что подмножество суммы к нулю. Другая эквивалентная формулировка: дано мультимножество положительный целые числа и целевая сумма Т, сумма любого подмножества чисел в точности Т?[1] Сумму подмножества также можно рассматривать как проблема оптимизации: найти подмножество, сумма которого максимально приближена к Т.

Сумма подмножества связана с несколькими другими проблемами:

  • В проблема раздела является частным случаем подмножества-суммы, в котором целевая сумма Т составляет ровно половину суммы всех входных чисел (т. е. ).
  • В проблема с рюкзаком является обобщением subset-sum.[2]

Проблема суммы подмножества НП-полный, но есть несколько алгоритмов, которые на практике могут решить эту проблему достаточно быстро.

Сложность

В сложность задачи суммы подмножества зависит от двух параметров: п - количество вводимых целых чисел, и L - точность задачи, выраженная как количество двоичных разрядов, необходимых для постановки задачи.

  • Если п (количество целых чисел) - небольшое фиксированное число, тогда исчерпывающий поиск для решения практично.
  • Если L (количество двоичных цифр) - небольшое фиксированное число, тогда есть динамическое программирование алгоритмы, которые могут ее точно решить.

Проблема становится сложной, когда оба п и L большие. Сложность наиболее известных алгоритмов составляет экспоненциальный в меньшем из двух параметров п и L.

Экспоненциальные временные алгоритмы

Есть несколько способов решить сумму подмножества по экспоненте во времени в п.[3]

Включение-исключение

Большинство наивный алгоритм будет проходить через все подмножества п числа и для каждого из них проверьте, соответствует ли подмножество правильному числу. Время работы в порядке , поскольку есть подмножества и, чтобы проверить каждое подмножество, нам нужно суммировать не более п элементы.

Алгоритм может быть реализован поиск в глубину двоичного дерева: каждому уровню в дереве соответствует входной номер; левая ветвь соответствует исключению числа из набора, а правая ветвь соответствует включению числа (отсюда и название «Включение-исключение»). Требуемая память . Время выполнения можно улучшить с помощью нескольких эвристик:[3]

  • Обработайте входные числа в порядке убывания.
  • Если целые числа, включенные в данный узел, превышают сумму лучшего подмножества, найденного на данный момент, узел удаляется.
  • Если целые числа, включенные в данный узел, плюс все оставшиеся целые числа меньше суммы лучшего подмножества, найденного на данный момент, узел удаляется.

Горовиц и Санхи

Горовиц и Сахни[4] опубликовал более быстрый алгоритм экспоненциального времени, который работает во времени , но требует гораздо больше места - . Алгоритм произвольно разбивает п элементы в два набора каждый. Для каждого из этих двух наборов хранится список сумм всех возможные подмножества его элементов. Затем каждый из этих двух списков сортируется. Использование стандартного алгоритма сортировки сравнения для этого шага потребует времени. . Однако, учитывая отсортированный список сумм для элементов, список может быть расширен до двух отсортированных списков с введением () th элемент, и эти два отсортированных списка могут быть объединены во времени . Таким образом, каждый список может быть сформирован в отсортированном виде по времени. . Учитывая два отсортированных списка, алгоритм может проверить, суммируются ли элемент первого массива и элемент второго массива до Т во время . Для этого алгоритм проходит через первый массив в порядке убывания (начиная с самого большого элемента) и второй массив в порядке увеличения (начиная с наименьшего элемента). Всякий раз, когда сумма текущего элемента в первом массиве и текущего элемента во втором массиве больше, чем Т, алгоритм переходит к следующему элементу в первом массиве. Если меньше чем Т, алгоритм переходит к следующему элементу во втором массиве. Если два элемента, сумма которых равна Т найдены, он останавливается.

Шреппель и Шамир

Schroeppel и Шамир[5] представил алгоритм, основанный на Горовитце и Санхи, который требует аналогичного времени выполнения - , гораздо меньше места - . Вместо того, чтобы создавать все подмножества п/ 2 элемента заранее, они делят элементы на 4 набора п/ 4 элемента каждый и генерируют подмножества п/ 2 элемента динамически с использованием мин куча.

Из-за нехватки места алгоритм HS применим примерно для 50 целых чисел, а алгоритм SS применим до 100 целых чисел.[3]

Хоугрейв-Грэм и Жу

Хаугрейв-Грэм и Жу[6] представил вероятностный алгоритм который работает быстрее всех предыдущих - по времени . Он решает только проблему решения, не может доказать, что для данной суммы нет решения, и не возвращает сумму подмножества, ближайшую к Т.

Решение для динамического программирования с псевдополиномиальным временем

Проблему можно решить в псевдополиномиальное время с помощью динамическое программирование. Предположим, что последовательность

отсортированы в порядке возрастания, и мы хотим определить, существует ли непустое подмножество, сумма которого равна нулю. Определите булевозначную функцию быть ценностью ( или же ) из

"есть непустое подмножество что в сумме ."

Таким образом, решение проблемы «Для данного набора целых чисел существует непустое подмножество, сумма которого равна нулю?» это ценность .

Позволять быть суммой отрицательных значений и сумма положительных значений. Четко, , если или же . Таким образом, эти значения не нужно хранить или вычислять.

Создайте массив для хранения значений за и .

Теперь массив можно заполнить простой рекурсией. Первоначально для , набор

куда это логическая функция, которая возвращает истину, если равно , иначе - ложь.

Тогда для , набор

или же или же .

Для каждого присвоения значения справа уже известны, либо потому, что они были сохранены в таблице для предыдущего значения или потому что если или же . Следовательно, общее количество арифметических операций равно . Например, если все значения равны для некоторых , то необходимое время .

Этот алгоритм легко изменить, чтобы вернуть подмножество с суммой 0, если оно есть.

Решение для динамического программирования имеет время выполнения куда это сумма, которую мы хотим найти в наборе числа. Это решение не считается полиномиальным временем в теории сложности, потому что не полиномиален от размер проблемы, которая представляет собой количество битов, используемых для ее представления. Этот алгоритм полиномиален от значений и , которые являются экспоненциальными по количеству битов.

В случае, если каждый положительна и ограничена фиксированной константой , Писингер нашел алгоритм линейного времени, имеющий временную сложность (обратите внимание, что это для версии задачи, где целевая сумма не обязательно равна нулю, иначе проблема была бы тривиальной).[7][8] В 2015 году Койлиарис и Сюй обнаружили детерминированный алгоритм для задачи суммы подмножеств, где это сумма, которую нам нужно найти.[9] В 2017 году Брингманн обнаружил рандомизированный временной алгоритм [10].

Приближенный алгоритм с полиномиальным временем

An приблизительный версия суммы подмножества будет: с учетом набора числа и ряд , выход:

  • Да, если есть подмножество, которое в сумме составляет до .
  • Нет, если нет подмножества суммирования до числа между и для небольшого .
  • Любой ответ, если есть подмножество суммирования до числа между и но нет подмножества, суммирующего до .

Если все числа неотрицательны, приблизительная сумма подмножества разрешима за полиномиальное время от и .

Решение для суммы подмножества также обеспечивает решение исходной проблемы суммы подмножества в случае, когда числа малы (опять же, для неотрицательных чисел). Если любую сумму чисел можно указать не более чем бит, затем решая задачу примерно с эквивалентно ее точному решению. Тогда алгоритм полиномиального времени для приближенной суммы подмножества становится точным алгоритмом с полиномиальным временем работы от и (т.е. экспоненциальная по ).

Алгоритм решения задачи приблизительной суммы подмножеств следующий:

инициализировать список S содержать один элемент 0.для каждого я от 1 до N делать    позволять Т быть списком, состоящим из Икся + у, для всех у в S    позволять U быть союзом Т и S    Сортировать U    делать S пусто пусть у быть самым маленьким элементом U     Добавить у к S    для каждого элемент z из U в порядке возрастания делать        // Обрезать список, удалив близкие друг к другу числа // и выбросить элементы больше, чем s.        если у + cs/N < zs тогда            у = z            Добавить z к Sесли S содержит число между (1 - c)s и s тогда    возвращаться даеще    возвращаться нет

Алгоритм является полиномиальным временем, потому что списки , и всегда оставаться полиномиального размера в и и, пока они имеют полиномиальный размер, все операции над ними могут выполняться за полиномиальное время. Размер списков остается полиномиальным за счет шага обрезки, на котором мы включаем только число в если он больше предыдущего на и не больше чем .

Этот шаг гарантирует, что каждый элемент в меньше следующего как минимум на и не содержат элементов больше, чем . Любой список с этим свойством состоит не более чем из элементы.

Алгоритм правильный, потому что каждый шаг вносит аддитивную ошибку не более и шаги вместе приводят к ошибке не более .

Смотрите также

Рекомендации

  1. ^ Клейнберг, Джон; Тардос, Ева (2006). Разработка алгоритма (2-е изд.). п.491. ISBN  0-321-37291-3.
  2. ^ Мартелло, Сильвано; Тот, Паоло (1990). «Проблема 4-х подмножеств». Задачи о ранце: алгоритмы и компьютерные интерпретации. Wiley-Interscience. стр.105–136. ISBN  0-471-92420-2. МИСТЕР  1086874.CS1 maint: ref = harv (связь)
  3. ^ а б c Ричард Э. Корф, Итан Л. Шрайбер и Майкл Д. Моффитт (2014). «Оптимальное последовательное многостороннее разбиение номеров» (PDF).CS1 maint: несколько имен: список авторов (связь)
  4. ^ Горовиц, Эллис; Сахни, Сартадж (1974), «Вычислительные перегородки с приложениями к задаче о ранце» (PDF), Журнал Ассоциации вычислительной техники, 21 (2): 277–292, Дои:10.1145/321812.321823, HDL:1813/5989, МИСТЕР  0354006
  5. ^ Schroeppel, Ричард; Шамир, Ади (1981-08-01). "Алгоритм A $ T = O (2 ^ {n / 2}) $, $ S = O (2 ^ {n / 4}) $ для некоторых NP-полных задач". SIAM Журнал по вычислениям. 10 (3): 456–464. Дои:10.1137/0210033. ISSN  0097-5397.
  6. ^ Хаугрейв-Грэм, Ник; Жу, Антуан (2010). Гилберт, Анри (ред.). «Новые универсальные алгоритмы для тяжелых ранцев». Достижения в криптологии - EUROCRYPT 2010. Конспект лекций по информатике. Берлин, Гейдельберг: Springer: 235–256. Дои:10.1007/978-3-642-13190-5_12. ISBN  978-3-642-13190-5.
  7. ^ http://hjemmesider.diku.dk/~pisinger/codes.html
  8. ^ Писингер Д. (1999). "Линейные временные алгоритмы для задач о ранце с ограниченным весом". Журнал алгоритмов, Volume 33, Number 1, October 1999, pp. 1–14.
  9. ^ Койлиарис, Константинос; Сюй, Чао (2015-07-08). «Более быстрый алгоритм псевдополиномиального времени для суммы подмножества». arXiv:1507.02318 [cs.DS ].
  10. ^ Брингманн К. Алгоритм псевдополиномиального времени, близкий к линейному, для суммы подмножества [C] // Материалы двадцать восьмого ежегодного симпозиума ACM-SIAM по дискретным алгоритмам. Общество промышленной и прикладной математики, 2017: 1073-1084

дальнейшее чтение