разбить последовательность из 2n действительных чисел так, чтобы - PullRequest
9 голосов
/ 30 ноября 2009

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


Возьмите последовательность из 2n действительных чисел в качестве входных данных. Разработать алгоритм O (n log n), который разбивает числа на n пар со свойством, которое разбиение минимизирует максимальная сумма пары. Например, скажем, нам даны цифры (1,3,5,9). Возможные разделы: ((1,3), (5,9)), ((1,5), (3,9)) и ((1,9), (3,5)). Пара суммы для этих разделов: (4,14), (6,12) и (10,8). Таким образом, третий раздел имеет 10 в качестве максимальной суммы, которая является минимальной для трех разделов.


По некоторым примерам я думаю, что решение выглядит так:

# in pseudo ruby code
a = [1,3,5,9]
pairs = []
while !a.empty?
    pairs << [a.shift, a.pop]  # [a.first, a.last]
end
pairs

Но как это доказать?

Ответы [ 3 ]

9 голосов
/ 01 декабря 2009

Алгоритм работает, потому что когда x 0 , x 1 , ... x 2n-1 - отсортированный список, всегда есть оптимальное решение который содержит (x 0 , x 2n-1 ).

Доказательство:

Рассмотрим любое оптимальное решение, которое содержит , а не (x 0 , x 2n-1 ). Он должен содержать пары (x 0 , x a ) и (x b , x 2n-1 ) с x 0 ≤ x a ≤ x 2n-1 и x 0 ≤ x b ≤ x 2n-1 . Удалите эти пары из раствора и на их место поставьте (x 0 , x 2n-1 ) и (x a , x b ). Может ли присутствие любой новой пары «повредить» решение? Пара (x 0 , x 2n-1 ) не может иметь, поскольку ее сумма меньше или равна сумме (x b , x 2n-1 ), который был членом оригинального, оптимального решения. И снова (x a , x b ) не могли причинить ущерб, поскольку его сумма меньше или равна сумме (x b , x *). 1063 * 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое содержит (x 0 , x 2n-1 ).

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

3 голосов
/ 30 ноября 2009

С учетом входного массива

x 0 x 1 x 2 ... x 2n

использовать сортировку слиянием для сортировки за O (n log n), чтобы создать отсортированный список

x a 0 x a 1 ... x a 2n

где индексы i указывают на перестановку, которую вы выполнили в начальном списке для получения второго списка.

Я утверждаю, что спаривание, которое дает минимальную максимальную сумму по всем спариваниям, является следующим спариванием:

(x a i , x a 2n-i ) для i = 0, 1, ..., n , То есть вы группируете наибольшее число с самым низким доступным числом.

Доказательство

Продолжайте по индукции, для случая 2n = 2 это очевидно.

Без ограничения общности учтите, что входные данные представляют собой список отсортированных чисел (поскольку, если это не так, сортируйте их)

x 0 x 1 x 2 ... x 2n .

Рассмотрим спаривание x 2n с любым числом, тогда ясно, что минимальная сумма этого спаривания достигается с помощью (x 2n , x 0 ).

Теперь рассмотрим сопряжение x 2n-1 , либо (x 2n , x 0 ), (x 2n-1 , x 1 ) - это пары, которые образуют минимальную максимальную сумму, или (x 2n , x 1 ), (x 2n-1 , x 0 ) есть, или оба есть. В последнем случае наш выбор не имеет значения. В секундах до последнего случая это невозможно (подумайте об этом). В общем случае, если мы будем индуктивно следовать этому процессу, когда мы ищем пару для x 2n-k , x k - самое низкое неиспользуемое значение, с которым мы можем соединиться; Предположим, вместо этого мы объединяем x k с некоторыми другими x 2n-j для j 2n-j + x k > = x 2n-k + x k , поэтому в большинстве случаев мы можно достичь только той же минимальной суммы.

Это означает, что выбор (x 2n-k , x k ) дает нам минимальные пары.

1 голос
/ 30 ноября 2009

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

Соедините x 0 , x 2n вместе, затем соедините все остальные числа в соответствии с оптимальным решением.

Теперь рассмотрим сопряжение (x 0 , x 2n ) с любой другой парой x y , x z из оптимальное подмножество. x 2n + x y или x z будет больше, чем x y + x z , а также x 2n + x 0 , поэтому спаривание x 2n , x 0 было оптимальным.

Доказательство теперь распространяется по индукции на спаривание X 1 , X 2n-1 и дальнейших разбиений подмножества, что в итоге приводит к спариванию OP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...