Как определить ближайшую сумму двух подмассивов в массиве 2N? Подумайте, чтобы найти оптимальный

Вот моя проблема.

Есть один несортированный массив из 2N элементов. Все эти элементы являются положительными целыми числами. Q: Как разбить этот массив на два N массива и сумма двух массивов должна быть максимально близкой друг к другу

Одна интуитивная мысль такова,

  1. отсортируйте этот массив до a1‹ a2 ‹ a3‹ ...‹ a2N и
  2. разделите их на два подмассива a1 a3 a5 ... a(2N-1) и [a2,a4,...a2N] , затем поменяйте два числа в каждом массиве и продолжайте цикл, пока мы не найдем наименьшее из двух множество.

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


person Ivan    schedule 12.09.2012    source источник
comment
Как утверждает PengOne, эта проблема является NP-полной. Чтобы найти точное решение, вам нужно будет протестировать все комбинации C(2n,n)=(2n)!/(n!)²... ‹br› Может быть, эта статья может помочь: Полный алгоритм сбалансированного разделения номеров в любое время, другие ссылки, такие как Коэффициенты производительности для метода разности, примененного к задаче разделения сбалансированных чисел указать вам на различные алгоритмы, которые вы могли бы реализовать.‹br›   -  person Kwariz    schedule 12.09.2012


Ответы (2)


Это проблема с разделами, и она сложная (то есть NP-полная).

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

A = [a1, a4, a5, a8, a9, ..., a(n-2), a(n-1)]
B = [a2, a3, a6, a7, ..., a(n-4), a(n-3), an]

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

person PengOne    schedule 12.09.2012
comment
Хорошую статью на эту тему см. по адресу: сложная проблема - person PengOne; 12.09.2012

Вы должны найти проблему с суммой подмножеств. В вашем случае вы пытаетесь получить сумму подмножества S/2, где S - полная сумма набора. Для этого в случае целых чисел существует простой алгоритм динамического программирования, наиболее известный. К сожалению, это псевдополиномиальное время. Это означает, что время выполнения зависит от размера элементов. Это делает время экспоненциальным в обычном смысле, но оно прекрасно работает, если элементы не слишком велики.

Динамическая программа суммирования подмножеств нуждается в небольшой модификации, чтобы обеспечить выполнение требования ровно для N элементов e[i]. Пусть Q(i, s, n) истинно тогда и только тогда, когда существует подмножество, состоящее из элементов, выбранных от 1 до i, суммирующихся с s и содержащих ровно n‹=i элементов.

затем

Q(i, s, n) = Q(i - 1, s, n) or Q(i - 1, s - e[i], n - 1)

В базовом случае говорится, что при полном отсутствии элементов сумма и требуемое число в подмножестве должны быть равны нулю, иначе Q ложно:

Q(0, 0, 0) = истина, иначе Q(0, _, _) ложно.

Чтобы получить ответ, вычислите таблицу DP для Q(2N, k, N), k = потолок (S/2), потолок (S/2)-1, ..., пока не найдете истинное значение.

Обратите внимание, что эта задача достаточно близка к сумме подмножеств, чтобы сделать ее NP-сложной. Это означает, что настоящий алгоритм полиномиального времени (например, ваше предложение по сортировке) будет приближением к оптимальности. Конечно, это вполне может подойти для реальных целей.

person Gene    schedule 12.09.2012
comment
Это не сработает для {1,1,1,3}, сумма подмножества S/2 дает {1,1,1} {3}, но ответ должен быть {1,1} {1,3}, я думаю - person Kwariz; 12.09.2012
comment
Ах, но есть тривиальная модификация динамической программы суммы подмножеств, которая решает вашу проблему. Я отредактирую, чтобы показать вам, так как вы этого не видите. - person Gene; 12.09.2012
comment
Проблема подмножества суммы не ограничивает размеры двух наборов. - person PengOne; 12.09.2012
comment
Добавлю, что есть доказательство того, что эта задача (и сумма подмножеств тоже) является NP-сложной. Таким образом, решения, включающие жадность, сортировку и т. Д., Которые действительно полиномиальны по времени, будут приближениями. Конечно, для многих приложений этого будет достаточно. - person Gene; 12.09.2012