Эффективный алгоритм «суммирования» набора сумм


24

Учитывая мультимножество натуральных чисел X, рассмотрим множество всех возможных сумм:

sums(X)={iAi|AX}

Например, sums({1,5})={0,1,5,6} а .sums({1,1})={0,1,2}

Какой алгоритм расчета обратной операции наиболее эффективен (измеряется в терминах размера входного набора сумм)? В частности, возможно ли эффективно рассчитать любое из следующего:

  1. Является ли данный набор допустимым набором сумм. (Например, является действительным, а - нет.){ 0 , 1 , 3 }{0,1,2}{0,1,3}
  2. Мультимножество, которое суммирует данный набор.
  3. Наименьшее MultiSet , что суммы в данном наборе. (Например, и оба сумму но первое меньше.){ 1 , 1 , 1 } { 0 , 1 , 2 , 3 }{1,2}{1,1,1}{0,1,2,3}

1
Не могли бы вы дать нам мультимножество сумм, а не набор сумм? Это создаст приятную симметрию (если вы начнете с множества значений).
DW

1
Другой вопрос - вас больше всего интересуют теоретические результаты (например, асимптотическая сложность) или практические решения (схемы, которые на практике могут работать нормально)? Если последнее, есть ли у вас представление о типичных значениях параметров: например, размер мультимножества X, размер самого большого элемента в мультимножестве X, наибольшая кратность? Это может повлиять на целесообразность применения «большого молотка», такого как решатель ILP или SAT.
DW

@DW Я определенно заинтересован в использовании набора сумм, а не мультимножества (хотя это тоже может быть интересной проблемой). Кроме того, изначально это была проблема математики для отдыха, поэтому меня интересуют, главным образом, границы сложности, а не практическое решение.
Ури Гранта

3
Если вы получили мультимножество сумм, тогда это довольно жадно сделать это (см., Например, math.stackexchange.com/questions/201545/… ).
jschnei

@UriZarfaty набор, указанный в качестве ввода, уже отсортирован? Наконец это установлено или мультисеть? Комментарий по-прежнему предполагает, что вы хотите чистый набор.
Зло

Ответы:


9

Решение

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

Алгоритм минимального набора

  1. Найдите максимальный элемент из набора сумм (мульти). , потенциальный минимальный (мульти) набор изначально пуст. рamP

  2. Если не существует только одной группы, представляйте всеми возможными способами в виде пары сумм, которые складываются в , a m S i j = { ( a i , a j ) | a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}

  3. Убедитесь, что все элементы из набора сумм включены.

  4. Найти максимальный элемент из всех (означающего вместе) со следующим свойством: для каждого , является либо в , или мы можем найти из набор сумм, так что находится в . S i j S i j a s S i j a p a p + a s S i jasSijSijasSijapap+asSij

  5. Если это так, тоSij не содержит S , просто сумма сек + а р , удалить р + S из S я J (или просто установить метку , чтобы игнорировать его) и вставить в р и а S в S я J вместо.asas+apap+asSijapasSij

  6. Если элемент присутствует в каждом удалить его из всех S я J один раз (или просто установить метку , чтобы игнорировать его и не трогать его больше) и добавить его в список элементов потенциального минимального множества P .SijSijP

  7. Повторяйте, пока все не опустеютSij

  8. Если некоторые из остаются непустыми и мы не можем продолжить, попробуйте еще раз с максимальным значением из всех S i j .SijSij

  9. Воссоздать рекурсивные шаги без удалений и продолжить с алгоритмом булеан покрытия над . (Перед этим вы можете выполнить безопасную проверку того, что P включает все элементы, которые не могут быть представлены в виде суммы двух элементов, поэтому они обязательно должны быть в базовом наборе. Например, минимальный элемент должен быть в P. )PPP

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

Пример:

{2,3,5,7,8,10,12,13,15}

Представьте 15 всеми возможными способами как сумму двух чисел из набора сумм.

(13,2),(12,3),(10,5),(8,7)

Попробуйте найти максимальное число, которое есть во всех группах или которое может быть представлено в виде суммы. Очевидно, что мы можем начать поиск с 8, нет смысла идти над ним.

13 из первой группы - 13 = 8 + 5, так что 13 - это хорошо, но 12 из второй группы - не хорошо, поскольку в наборе сумм нет 4, чтобы сделать 12 = 8 + 4. Далее мы попробуем с 7. Но сразу 13 не может быть покрыто, нет 6.

Далее мы попробуем 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, а для последних либо 8 = 5 + 3, либо 7 = 5 + 2, но не оба. Группы сейчас:

((5,8),2),((5,7),3),((5,5),5),((5,3),7)

5 повторяется во всех группах, поэтому мы извлекаем его . Мы извлекаем 5 только один раз из каждой группы.P={5}

(8,2),(7,3),(5,5),(3,7)

Очевидно, что нет смысла идти выше 5, поэтому мы пробуем 5 снова. 8 = 5 + 3, 7 = 5 + 2, так что все в порядке

((5,3),2),((5,2),3),(5,5),(3,(5,2))

Извлеките один 5 снова из всех групп, так как он повторяется. (Это не часто встречается, но наш случай специально создан, чтобы показать, что делать в случае повторения.) P={5,5}

(3,2),(2,3),(5),(3,2)

Теперь мы попробуем с 3 и 5 = 3 + 2. Добавьте это в группу.

(3,2),(2,3),(3,2),(3,2)

Теперь извлеките 3 и 2, поскольку они повторяются повсюду, и мы в порядке а группы пусты.P={5,5,3,2}

(),(),(),()

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

( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7

(13,2),(12,3),(10,5),(8,7)
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

Электропитание покрытия

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

  1. Закодируйте все элементы из минимального набора, используя последовательные степени 2. Порядок не важен. Кодируйте один и тот же элемент с новым значением столько раз, сколько он повторяет. Начните с C = 1, каждый следующий элемент имеет C = 2C.

(2=[1],3=[2],5=[4],5=[8])
  1. Заменить элементы в восстановленном списке рекурсии,

((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

с кодировкой: 2 с 1, 3 с 2, 5 с 4 и еще 5 с 8. Обратите внимание, что каждый элемент имеет различную кодировку, даже если они повторяются.

((4,(8,2)),1),((4,(8,1)),2),((4,(2,1)),8),((8,2),(4,1))
  1. Соберите все промежуточные суммы, на данный момент имеем (1,2,4,8)

((4,(10)),1),((4,(9)),2),((4,(3)),8),((10),(5))

(1,2,3,4,5,8,9,10)

((14),1),((13),2),((7),8),(15)

(1,2,3,4,5,8,9,10,13,14,15)

{(15),(15),(15),(15)}
  1. 2m1mm=4

  2. 12m1

(6,7,11,12)

  1. Обоснуйте их отсутствие следующим образом: представьте каждое число в двоичном виде

(6=01102) (7=01112) (11=10112) (12=10102)

601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}так что все в порядке.

701112(2=[1],3=[2],5=[4],5=[8])

1112

Если какое-либо двоичное представление соответствует сумме, которую невозможно найти, сообщите, что решения не существует.

(2,3,5,5)

обсуждение

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

mnlog(m)mlog2(m)mnlog(m)

mlogmmlog2(m)

mlog3(m)

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

Неправильный старт

2,3,4,5,6,7,8,9,10,11,12,13,152,3,4,6Sij

5,4,3,3

2,2,3,4,42,3,4,6

Цель этого алгоритма состоит в том, чтобы обеспечить решение, как только мы все правильно запустили.

улучшения

Шаг 4. это тот, который можно обновить таким образом: вместо максимального мы могли бы попробовать каждый элемент в порядке убывания, который удовлетворяет данному условию. Мы создаем отдельную ветку для каждого. Если какая-то ветка не дает решения, отмените его.

2,3,4,5,6,7,8,9,10,11,12,13,157,6,5,4по-разному, так как все они проходят первый тест. (Нет причин использовать 2 или 3, так как мы знаем, что они должны быть в базовом наборе.) И просто продолжаем в том же духе, пока не соберем все версии, которые могут дойти до конца. Это создаст решение с полным покрытием, которое обнаружит более одного базового набора.

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

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


1
В более широком смысле: я вижу текстовое описание алгоритма, но (а) нет псевдокода и (б) нет доказательств правильности. Почему вы думаете, что этот подход обеспечивает алгоритм, который будет работать правильно на всех возможных входах? В чем оправдание? У вас есть доказательства правильности этого?
DW

Я думаю, что проблема заняла около 30 часов работы вместе (30 раз в час, ну ...). Но нет платного варианта.

Наконец прочитайте ответ в деталях, которых он заслуживает. Отличная работа!
Ури Гранта

1

ПРИМЕЧАНИЕ. В целом это не совсем работает, см. Контрпример Ури ниже.

YY

  • 0Y
  • yYyXY
  • Пусть z1<<znYYY=Y+{0,y}0Yi=1,,nzi+yYziYziyYzi+yYzi+yYziY
  • Yy,y,

1yO(n)O(n2)

Y={0,1,3,4,5,6,7}{0,1,3,4,6}{0,1,3,5,6}yY{a+ky}YY


Очевидно ли, что Y не ведет в тупик? Ведь может быть много Y таких, что Y = Y '+ {0, y}. Например, {0,1,2,3,4} = {0,2,3} + {0,1} = {0,1,2,3} + {0,1}, но первое разложение приводит к тупик.
Ури Гранта

Это правда, и это настоящая проблема. Я должен посмотреть, можно ли это исправить. Благодарность!
Клаус Дрегер

YkY=Y+{0,y,,y}{0,y,,y}kyY
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.