Я думаю, что для этого есть алгоритм O (n lg U), где U - наибольшее число. Идея похожа на user949300, но немного более подробно.
Интуиция заключается в следующем.Когда вы XORing два числа вместе, чтобы получить максимальное значение, вы хотите иметь 1 в наивысшей возможной позиции, а затем пар, которые имеют 1 в этой позиции, вы хотите, чтобы соединение с 1 на следующем возможное максимальное положение и т. д.
Таким образом, алгоритм выглядит следующим образом. Начните с нахождения наивысшего 1 бита в любом месте чисел (вы можете сделать это вовремя O (n lg U), выполнив O (lg U) для каждого из n чисел). Теперь разделим массив на две части - одно из чисел, у которых есть 1 в этом бите и группа с 0 в этом бите. Любое оптимальное решение должно сочетать число с 1 в первом месте с числом с 0 в этом месте, так как это поставит 1 бит как можно выше. У любого другого спаривания есть 0.
Теперь, рекурсивно, мы хотим найти спаривание чисел из 1 и 0 группы с наивысшим значением 1 в них. Для этого, из этих двух групп, разделить их на четыре группы:
- Числа, начиная с 11
- чисел, начиная с 10
- чисел, начиная с 01
- чисел, начиная с 00
Если в группе 11 и 00 или в группах 10 и 01 есть любые номера, их XOR будет идеальным (начиная с 11). Следовательно, если любая из этих пар групп не пуста, рекурсивно вычислить идеальное решение из этих групп, тогда вернем максимум этих подзадач. В противном случае, если обе группы пусты, это означает, что все цифры должны иметь одну и ту же цифру во второй позиции. Следовательно, оптимальный XOR числа, начинающегося с 1, и числа, начинающегося с 0, закончится тем, что следующий второй бит будет отменен, поэтому мы должны просто посмотреть на третий бит.
Это дает следующий рекурсивный алгоритм, который, начиная с двух групп чисел распределяли их MSB, дает ответ:
- Учитывая группы 1 и группы 0 и бит индекса I:
- Если индекс бит равен количеству бит, верните XOR (уникальное) число в 1 группе и (уникальный) номер в группе 0.
- Создайте группы групп 11, 10, 01 и 00 из этих групп.
- Если группа 11 и группа 00 непусты, рекурсивно найдите максимальный XOR этих двух групп, начиная с бит i + 1.
- Если группа 10 и группа 01 непусты, рекурсивно найдите максимальный XOR этих двух групп, начиная с бит i + 1.
- Если возможно одно из указанных выше пар, верните максимальную пару, найденную рекурсией.
- В противном случае, все номера должны иметь один и тот же бит в позиции I, поэтому вернуть максимальную пару найти, посмотрев на биту я + 1 на группы 1 и 0.
Чтобы начать выключение алгоритм, вы можете просто разбить числа из исходной группы на две группы - цифры с MSB 1 и номерами с MSB 0. Затем вы прекратите рекурсивный вызов вышеуказанного алгоритма с двумя группами чисел.
В качестве примера рассмотрим номера 5 1 4 3 0 2.Они имеют представление
101 001 100 011 000 010
Мы начинаем разделив их в 1 группу и 0 группы:
101 100
001 011 000 010
Теперь мы применяем выше алгоритм. Мы разделили это на группы 11, 10, 01 и 00:
11:
10: 101 100
01: 011 010
00: 000 001
Теперь мы не можем соединить любые 11 элементов с 00 элементами, так что мы просто рекурсию на 10 и 01 групп. Это означает, что мы строим 100, 101, 010 и 011 группы:
101: 101
100: 100
011: 011
010: 010
Теперь, когда мы до ведра с только один элемент в них, мы можем просто проверить парам 101 и 010 (что дает 111) и 100 и 011 (что дает 111). Любой из этих вариантов работает здесь, поэтому мы получаем оптимальный ответ 7.
Давайте подумаем о времени работы этого алгоритма. Обратите внимание, что максимальная глубина рекурсии равна O (lg U), так как в номерах есть только O (log U). На каждом уровне дерева каждое число отображается ровно с одним рекурсивным вызовом, и каждый из рекурсивных вызовов работает пропорционально общему числу чисел в группах 0 и 1, потому что мы должны распределять их по их битам. Следовательно, в дереве рекурсии есть уровни O (log U), и каждый уровень O (n) работает, давая полную работу O (n log U).
Надеюсь, это поможет! Это была потрясающая проблема!
Хорошая ставка принимает наибольшее и наименьшее значение, так как биты малой величиной являются то вряд ли «уничтожить» «хороших» высоких разрядов высокого значение во время процесса xor. –
не удалось для arr = {8,4,2} ответ 8^4 и 4 не самый маленький ... –
@ 500-InternalServerError: Это определенно будет пара чисел, одна из которых имеет верхний бит и множество другой сбросит его. –