Esto se puede resolver en complejidad de tiempo O(NlogN)
usando Trie.
- Construye un trie. Para cada clave entera, cada nodo del trie contendrá cada bit (0 o 1) comenzando desde el bit más significativo.
- Ahora para cada elemento
arr[i]
dearr[0, 1, ..... N]
: - Realice la consulta para recuperar el valor máximo de xor posible para
arr[i]
. Sabemos que xor de diferentes tipos de bits (0 ^ 1
o1 ^ 0
) es siempre1
. Entonces, durante la consulta de cada bit, intente atravesar el nodo que contiene el bit opuesto. Esto hará que ese bit en particular resulte en maximizar el valor xor. Si no hay un nodo con el bit opuesto, solo entonces atraviesa el mismo nodo de bit. - Después de la consulta, inserte
arr[i]
en trie. Para cada elemento, realice un seguimiento del valor Xor máximo posible.
Para N
elementos, necesitamos una consulta ( O(logN)
) y una inserción ( O(logN)
) para cada elemento. Entonces, la complejidad del tiempo general es O(NlogN)
.
Puede encontrar una buena explicación gráfica sobre cómo funciona en este hilo.
- Cómo determinar el número total de triángulos degenerados sin bucles de una longitud determinada (más de 3)
- ¿Cuántos dígitos de precisión pueden medir los experimentos físicos (PI)?
- ¿Cuáles son algunas limitaciones de la teoría de detección de señales?
- ¿Cuál es el mejor lenguaje para codificar ecuaciones?
- ¿Puedo ser un gran programador si no soy bueno en matemáticas? ¿Cómo puedo mejorar mis habilidades matemáticas?
Aquí está la implementación en C ++ del algoritmo anterior:
const static int TAMAÑO = 2; const static int MSB = 30; clase trie { privado: struct trieNode { trieNode * children [TAMAÑO]; trieNode () { para (int i = 0; i <TAMAÑO; ++ i) { hijos [i] = nullptr; } } ~ trieNode () { para (int i = 0; i = 0; --i) { bool bit = (bool) (clave & (1 < children [bit]) { pCrawl-> children [bit] = new trieNode (); } pCrawl = pCrawl-> hijos [bit]; } } int query (int key) { int Xor = 0; trieNode * pCrawl = root; para (int i = MSB; i> = 0; --i) { bool bit = (bool) (clave & (1 < children [! bit]) { pCrawl = pCrawl-> hijos [! bit]; Xor | = (1 < hijos [bit]; } } devuelve Xor; } }; int findMaximumXOR (vector y arr) { int n = arr.size (); int resultado = 0; if (n insertar (0); para (int i = 0; i consulta (arr [i])); Trie-> insert (arr [i]); } eliminar Trie; resultado de retorno; }