Я думаю, сделает это для Вас. Я починил его от подобной функции, которая возвратила данные как строку:
private static byte[] decode(String encoded) {
byte result[] = new byte[encoded/2];
char enc[] = encoded.toUpperCase().toCharArray();
StringBuffer curr;
for (int i = 0; i < enc.length; i += 2) {
curr = new StringBuffer("");
curr.append(String.valueOf(enc[i]));
curr.append(String.valueOf(enc[i + 1]));
result[i] = (byte) Integer.parseInt(curr.toString(), 16);
}
return result;
}
Алгоритм работает, потому что когда 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 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).
Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
x 2n-1 ) не могло быть, поскольку его сумма меньше или равна сумме (x b , x 2n-1 ), которая была член оригинального, оптимального решения. И опять же (x a , x b ) не могло причинить ущерба, поскольку его сумма меньше или равна сумме (x b , x 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
x 2n-1 ) не могло быть, поскольку его сумма меньше или равна сумме (x b , x 2n-1 ), которая была член оригинального, оптимального решения. И опять же (x a , x b ) не могло причинить ущерба, поскольку его сумма меньше или равна сумме (x b , x 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
x 2n-1 ), который был членом исходного оптимального решения. И опять же (x a , x b ) не могло причинить ущерба, поскольку его сумма меньше или равна сумме (x b , x 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
x 2n-1 ), который был членом исходного оптимального решения. И опять же (x a , x b ) не могло причинить ущерба, поскольку его сумма меньше или равна сумме (x b , x 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
x 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
x 2n-1 ), который был членом того же решения. Мы построили оптимальное решение, которое действительно содержит (x 0 , x 2n-1 ).Таким образом, приведенный вами алгоритм никогда не исключает возможности поиск оптимального решения на любом этапе, и когда остается только два значения для объединения в пары, они должны быть объединены вместе.
Для входного массива
x 0 x 1 x 2 ... x 2n
используйте сортировку слиянием, чтобы отсортировать его за O (n log n) раз, чтобы создать отсортированный список
x a 0 x a 1 .. .x a 2n
где индексы a i указывают перестановку, которую вы выполнили в начальном списке для получения второго списка.
Я утверждаю, что спаривание которая дает минимальную максимальную сумму по всем парам, является следующей парой:
(x a i , x a 2n-i ) для i = 0 , 1, ..., п. То есть вы группируете число с наибольшим значением и числом с наименьшим значением.
Доказательство
Действуйте по индукции, для случая 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
Это означает, что выбор (x 2n-k , x k ) дает нам минимальное количество пар.
предположим, что вместо этого мы объединяем x k в пару с некоторым другим x 2n-j для jЭто означает, что выбор (x 2n-k , x k ) дает нам минимальное количество пар.
предположим, что вместо этого мы объединяем x k в пару с некоторым другим x 2n-j для jЭто означает, что выбор (x 2n-k , x k ) дает нам минимальное количество пар.
Я думаю, что могу доказать это для последовательности без повторяющихся чисел, и читателю должно быть достаточно простым упражнением, чтобы распространить доказательство на неуникальные последовательности.
Пара 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 ,