2014-12-07 2 views
1

У меня есть массив элементов [(A1, B1), ..., (An, Bn)] (все это положительные поплавки и Bi < = 1), и мне нужно найти такую ​​перестановку, которая имитирует сумму A1 + B1 * A2 + B1 * B2 * A3 + ... + B1 * ... B(n-1) * An.Найти перестановку, которая сводит к минимуму сумму

Определенно я могу просто попробовать все из них и выбрать тот, который дает наименьшую сумму (это даст правильный результат в O (n!)).

Я попытался изменить сумму на A1 + B1 * (A2 + B2 * (A3 + B3 * (... + B(n-1) * An)) и попытался использовать жадный алгоритм, который захватывает самый большой элемент Ai на каждом из шагов (это не дает правильного результата).

Теперь, когда я смотрю на последнее уравнение, мне кажется, что здесь я вижу оптимальную субструктуру A(n - 1) + B(n - 1) * An, и поэтому мне нужно использовать динамическое программирование, но я не могу понять правильное направление. Есть предположения?

+0

Без потери вообще допустим An> = An-1 .... > = A2> = A1, если Bi имеют одинаковую последовательность, тогда ответ, очевидно, A1 + B1 A2 + B1 B2 A3 + .... , В случае, если все не так просто, и Bi не имеют такой же последовательности, как Ai, тогда я думаю, что нет способа найти лучший ответ за полиномиальное время, возможно, вы могли бы найти примерно лучший ответ в полиномиальном время с жадным или ДП, но вы не можете найти точный наименьший ответ за полиномиальное время. – Lrrr

+0

@AliAmiri no, если An> An-1 это не означает, что Bn> Bn-1, и я в основном уверен, что для этой проблемы существует многочленное решение, потому что я должен сделать это для довольно большого количества данных , –

+0

В настоящее время я нахожусь на работе, а также я не помню подход к сопоставлению NP-проблем очень хорошо, но я думаю, что можно доказать, что это NP, но я думаю, что есть много изменений, которые вы могли бы сделать и сократить время работы. Но я надеюсь, что ошибаюсь, и это не NP :) – Lrrr

ответ

3

Я думаю, что это можно решить в O(N log(N)).

Любая перестановка может быть получена путем замены пар смежных элементов; Вот почему, например, работает сортировка пузырьков. Итак, давайте посмотрим на эффект подкачки записей (A[i], B[i]) и (A[i+1], B[i+1]). Мы хотим выяснить, в каких случаях это хорошая идея сделать этот обмен. Это влияет только на i-й и i+1-й термины, остальные остаются неизменными. Кроме того, как до, так и после свопа оба условия имеют коэффициент B[1]*B[2]*...*B[i-1], который мы можем назвать C. C - положительное число.

Перед заменой, мы имеем дело с C*A[i] + C*B[i]*A[i+1], а затем - C*A[i+1] + C*B[i+1]*A[i]. Это улучшение, если разница между ними положительна:

C*(A[i] + B[i]*A[i+1] - A[i+1] - B[i+1]*A[i]) > 0 

С C положителен, мы можем игнорировать этот фактор и смотреть только на A с и B с. Мы получаем

A[i] - B[i+1]*A[i] > A[i+1] - B[i]*A[i+1] 

или, что эквивалентно

(1 - B[i+1])*A[i] > (1 - B[i])*A[i+1] 

Оба эти выражения неотрицательны; если один из B[i] или B[i+1] равен единице, то термин, содержащий «один минус этой переменной», равен нулю (поэтому мы должны поменять местами, если B[i] является одним, но не если B[i+1] является одним); если обе переменные равны единице, то оба слагаемых равны нулю. Предположим теперь, что ни один не равен единице; то мы можем переписать дальше, чтобы получить

A[i]/(1 - B[i]) > A[i+1]/(1 - B[i+1]) 

Таким образом, мы должны вычислить это выражение D[i] := A[i]/(1 - B[i]) для обоих членов и поменять их местами, если левый один больше, чем правая. Мы можем распространить это на случай, когда один или оба B s являются едиными, определяя в этом случае D[i].

ОК, давайте вернемся - что мы нашли? Если есть пара i, i+1, где D[i] > D[i+1], мы должны обменять эти две записи.Это означает, что единственный случай, когда мы не можем улучшить результат путем замены, - это когда мы изменили порядок пар, чтобы значения D[i] были в порядке возрастания - то есть все случаи с B[i] = 1 приходят последними (напомним, что это соответствует D[i] бесконечно велико) и в остальном в порядке возрастания D[i]. Мы можем добиться этого путем сортировки по значению D[i]. Быстрый анализ наших шагов выше показывает, что порядок пар с равным D[i] значением не влияет на конечное значение.

Вычисление всех значений D[i] может быть выполнено за один проход с линейным временем. Сортировка может быть выполнена с помощью алгоритма O(N log(N)) (нам нужно, чтобы элементы подкачки соседних элементов были только аргументом/доказательством, чтобы показать, что это оптимальное решение, а не как часть реализации).

+0

спасибо, это отличное объяснение. Это выглядит очень легко после того, как вы описали его здесь :-). Какие-нибудь идеи, которые помогли вам придумать эту идею? –

+0

Также я не могу найти недостаток в ваших рассуждениях, следующий результат A, B = [89, 80, 62, 34, 19], [0,80, 0,74, 0,9, 0,25, 0,5] приводит к неправильному результату: 61,5705 с (34, 19, 80, 89, 62), тогда как минимум составляет 58,8205, и это достигается с помощью (19, 34, 80, 89, 62) –

+0

К сожалению! Я неправильно понял и подумал, что i-ый термин включает фактор 'B [i]'. Эта же идея все еще работает, она просто немного меняет определение 'D [i]'. Я немного переписал свой ответ. –

Смежные вопросы