Я думаю, что для этого у меня есть алгоритм O (n lg U), где U - наибольшее число.Идея похожа на user949300, но с более подробной информацией.
Интуиция следующая.Когда вы XOR соединяете два числа, чтобы получить максимальное значение, вы хотите иметь 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, поэтому верните максимальную найденную пару, посмотрев на бит 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).
Надеюсь, это поможет! Это была огромная проблема!