logo

Coppia di valori XOR minimi

Provalo su GfG Practice ' title= #practiceLinkDiv { display: none! importante; }

Dato un array di numeri interi. Trova la coppia in un array che ha un valore XOR minimo. 

Esempi:  

Input : arr[] = {9 5 3} Output : 6 All pair with xor value (9 ^ 5) => 12 (5 ^ 3) => 6 (9 ^ 3) => 10. Minimum XOR value is 6 Input : arr[] = {1 2 3 4 5} Output : 1 
Recommended Practice Coppia di valori XOR minima Provalo!

UN Soluzione semplice è generare tutte le coppie dell'array dato e calcolare XOR i loro valori. Infine restituisce il valore XOR minimo. Questa soluzione richiede O(n2) tempo. 



Attuazione:

C++
// C++ program to find minimum XOR value in an array. #include    using namespace std; // Returns minimum xor value of pair in arr[0..n-1] int minXOR(int arr[] int n) {  int min_xor = INT_MAX; // Initialize result  // Generate all pair of given array  for (int i = 0; i < n; i++)  for (int j = i + 1; j < n; j++)  // update minimum xor value if required  min_xor = min(min_xor arr[i] ^ arr[j]);  return min_xor; } // Driver program int main() {  int arr[] = { 9 5 3 };  int n = sizeof(arr) / sizeof(arr[0]);  cout << minXOR(arr n) << endl;  return 0; } 
Java
// Java program to find minimum XOR value in an array. class GFG {  // Returns minimum xor value of pair in arr[0..n-1]  static int minXOR(int arr[] int n)  {  int min_xor = Integer.MAX_VALUE; // Initialize result  // Generate all pair of given array  for (int i = 0; i < n; i++)  for (int j = i + 1; j < n; j++)  // update minimum xor value if required  min_xor = Math.min(min_xor arr[i] ^ arr[j]);  return min_xor;  }  // Driver program  public static void main(String args[])  {  int arr[] = { 9 5 3 };  int n = arr.length;  System.out.println(minXOR(arr n));  } } // This code is contributed by Sumit Ghosh 
Python3
# Python program to find minimum # XOR value in an array. # Function to find minimum XOR pair def minXOR(arr n): # Sort given array arr.sort(); min_xor = 999999 val = 0 # calculate min xor of  # consecutive pairs for i in range (0 n-1): for j in range (i+1 n-1): # update minimum xor value # if required val = arr[i] ^ arr[j] min_xor = min(min_xor val) return min_xor # Driver program arr = [ 9 5 3 ] n = len(arr) print(minXOR(arr n)) # This code is contributed by Sam007. 
C#
// C# program to find minimum  // XOR value in an array. using System; class GFG {    // Returns minimum xor value of  // pair in arr[0..n-1]  static int minXOR(int[] arr int n)  {  // Initialize result  int min_xor = int.MaxValue;  // Generate all pair of given array  for (int i = 0; i < n; i++)  for (int j = i + 1; j < n; j++)  // update minimum xor value if required  min_xor = Math.Min(min_xor arr[i] ^ arr[j]);  return min_xor;  }  // Driver program  public static void Main()  {  int[] arr = { 9 5 3 };  int n = arr.Length;  Console.WriteLine(minXOR(arr n));  } } // This code is contributed by Sam007 
PHP
 // PHP program to find minimum // XOR value in an array. // Returns minimum xor value // of pair in arr[0..n-1] function minXOR($arr $n) { // Initialize result $min_xor = PHP_INT_MAX; // Generate all pair of given array for ( $i = 0; $i < $n; $i++) for ( $j = $i + 1; $j < $n; $j++) // update minimum xor  // value if required $min_xor = min($min_xor $arr[$i] ^ $arr[$j]); return $min_xor; } // Driver Code $arr = array(9 5 3); $n = count($arr); echo minXOR($arr $n); // This code is contributed by anuj_67. ?> 
JavaScript
<script> // Javascript program to find  // minimum XOR value in an array. // Returns minimum xor value of pair in arr[0..n-1] function minXOR(arr n) {  // Initialize result  let min_xor = Number.MAX_VALUE;   // Generate all pair of given array  for (let i = 0; i < n; i++)  for (let j = i + 1; j < n; j++)  // update minimum xor value if required  min_xor = Math.min(min_xor arr[i] ^ arr[j]);  return min_xor; } // Driver program  let arr = [ 9 5 3 ];  let n = arr.length;  document.write(minXOR(arr n)); </script> 

Produzione
6

Complessità spaziale: O(1) 

UN Soluzione efficiente può risolvere questo problema in tempo O(nlogn). 

Algoritmo: 

  1. Ordina l'array indicato
  2. Attraversa e controlla XOR per ogni coppia consecutiva

Di seguito è riportata l'implementazione dell'approccio di cui sopra:

C++
#include    using namespace std; // Function to find minimum XOR pair int minXOR(int arr[] int n) {  // Sort given array  sort(arr arr + n);  int minXor = INT_MAX;  int val = 0;  // calculate min xor of consecutive pairs  for (int i = 0; i < n - 1; i++) {  val = arr[i] ^ arr[i + 1];  minXor = min(minXor val);  }  return minXor; } // Driver program int main() {  int arr[] = { 9 5 3 };  int n = sizeof(arr) / sizeof(arr[0]);  cout << minXOR(arr n) << endl;  return 0; } 
Java
import java.util.Arrays; class GFG {  // Function to find minimum XOR pair  static int minXOR(int arr[] int n)  {  // Sort given array  Arrays.parallelSort(arr);  int minXor = Integer.MAX_VALUE;  int val = 0;  // calculate min xor of consecutive pairs  for (int i = 0; i < n - 1; i++) {  val = arr[i] ^ arr[i + 1];  minXor = Math.min(minXor val);  }  return minXor;  }  // Driver program  public static void main(String args[])  {  int arr[] = { 9 5 3 };  int n = arr.length;  System.out.println(minXOR(arr n));  } } // This code is contributed by Sumit Ghosh 
Python3
import sys # Function to find minimum XOR pair def minXOR(arr n): # Sort given array arr.sort() minXor = int(sys.float_info.max) val = 0 # calculate min xor of consecutive pairs for i in range(0n-1): val = arr[i] ^ arr[i + 1]; minXor = min(minXor val); return minXor # Driver program arr = [9 5 3] n = len(arr) print(minXOR(arr n)) # This code is contributed by Sam007. 
C#
// C# program to find minimum  // XOR value in an array. using System; class GFG {    // Function to find minimum XOR pair  static int minXOR(int[] arr int n)  {  // Sort given array  Array.Sort(arr);  int minXor = int.MaxValue;  int val = 0;  // calculate min xor of consecutive pairs  for (int i = 0; i < n - 1; i++) {  val = arr[i] ^ arr[i + 1];  minXor = Math.Min(minXor val);  }  return minXor;  }  // Driver program  public static void Main()  {  int[] arr = { 9 5 3 };  int n = arr.Length;  Console.WriteLine(minXOR(arr n));  } } // This code is contributed by Sam007 
PHP
 // Function to find minimum XOR pair function minXOR($arr $n) { // Sort given array sort($arr); $minXor = PHP_INT_MAX; $val = 0; // calculate min xor  // of consecutive pairs for ($i = 0; $i < $n - 1; $i++) { $val = $arr[$i] ^ $arr[$i + 1]; $minXor = min($minXor $val); } return $minXor; } // Driver Code $arr = array(9 5 3); $n = count($arr); echo minXOR($arr $n); // This code is contributed by Smitha. ?> 
JavaScript
<script> // Function to find minimum XOR pair function minXOR(arr n) {  // Sort given array  arr.sort();  let minXor = Number.MAX_VALUE;  let val = 0;  // calculate min xor of consecutive pairs  for (let i = 0; i < n - 1; i++) {  val = arr[i] ^ arr[i + 1];  minXor = Math.min(minXor val);  }  return minXor; } // Driver program  let arr = [ 9 5 3 ];  let n = arr.length;  document.write(minXOR(arr n)); </script> 

Produzione
6

Complessità temporale: O(N*logN) 
Complessità spaziale: O(1) 

Ancora di più Soluzione efficiente può risolvere il problema di cui sopra in tempo O(n) presupponendo che gli interi richiedano un numero fisso di bit da memorizzare. L'idea è quella di utilizzare la struttura dei dati Trie.

Algoritmo:

  1. Crea un trie vuoto. Ogni nodo di trie contiene due figli per 0 e 1 bit.
  2. Inizializza min_xor = INT_MAX inserisci arr[0] in trie
  3. Attraversa tutti gli elementi dell'array uno per uno a partire dal secondo.
    1. Per prima cosa trova il valore minimo della differenza di setbet in trie 
      • esegui xor dell'elemento corrente con il setbit minimo diff di quel valore 
    2. aggiornare il valore min_xor se necessario
    3. inserisci l'elemento dell'array corrente in trie 
  4. restituisce min_xor

Di seguito è riportata l'implementazione dell'algoritmo di cui sopra.

C++
// C++ program to find minimum XOR value in an array. #include    using namespace std; #define INT_SIZE 32 // A Trie Node struct TrieNode {  int value; // used in leaf node  TrieNode* Child[2]; }; // Utility function to create a new Trie node TrieNode* getNode() {  TrieNode* newNode = new TrieNode;  newNode->value = 0;  newNode->Child[0] = newNode->Child[1] = NULL;  return newNode; } // utility function insert new key in trie void insert(TrieNode* root int key) {  TrieNode* temp = root;  // start from the most significant bit insert all  // bit of key one-by-one into trie  for (int i = INT_SIZE - 1; i >= 0; i--) {  // Find current bit in given prefix  bool current_bit = (key & (1 << i));  // Add a new Node into trie  if (temp->Child[current_bit] == NULL)  temp->Child[current_bit] = getNode();  temp = temp->Child[current_bit];  }  // store value at leafNode  temp->value = key; } // Returns minimum XOR value of an integer inserted // in Trie and given key. int minXORUtil(TrieNode* root int key) {  TrieNode* temp = root;  for (int i = INT_SIZE - 1; i >= 0; i--) {  // Find current bit in given prefix  bool current_bit = (key & (1 << i));  // Traversal Trie look for prefix that has  // same bit  if (temp->Child[current_bit] != NULL)  temp = temp->Child[current_bit];  // if there is no same bit.then looking for  // opposite bit  else if (temp->Child[1 - current_bit] != NULL)  temp = temp->Child[1 - current_bit];  }  // return xor value of minimum bit difference value  // so we get minimum xor value  return key ^ temp->value; } // Returns minimum xor value of pair in arr[0..n-1] int minXOR(int arr[] int n) {  int min_xor = INT_MAX; // Initialize result  // create a True and insert first element in it  TrieNode* root = getNode();  insert(root arr[0]);  // Traverse all array element and find minimum xor  // for every element  for (int i = 1; i < n; i++) {  // Find minimum XOR value of current element with  // previous elements inserted in Trie  min_xor = min(min_xor minXORUtil(root arr[i]));  // insert current array value into Trie  insert(root arr[i]);  }  return min_xor; } // Driver code int main() {  int arr[] = { 9 5 3 };  int n = sizeof(arr) / sizeof(arr[0]);  cout << minXOR(arr n) << endl;  return 0; } 
Java
// Java program to find minimum XOR value in an array. class GFG {  static final int INT_SIZE = 32;  // A Trie Node  static class TrieNode {  int value; // used in leaf node  TrieNode[] Child = new TrieNode[2];  public TrieNode()  {  value = 0;  Child[0] = null;  Child[1] = null;  }  }  static TrieNode root;  // utility function insert new key in trie  static void insert(int key)  {  TrieNode temp = root;  // start from the most significant bit insert all  // bit of key one-by-one into trie  for (int i = INT_SIZE - 1; i >= 0; i--) {  // Find current bit in given prefix  int current_bit = (key & (1 << i)) >= 1 ? 1 : 0;  // Add a new Node into trie  if (temp != null && temp.Child[current_bit] == null)  temp.Child[current_bit] = new TrieNode();  temp = temp.Child[current_bit];  }  // store value at leafNode  temp.value = key;  }  // Returns minimum XOR value of an integer inserted  // in Trie and given key.  static int minXORUtil(int key)  {  TrieNode temp = root;  for (int i = INT_SIZE - 1; i >= 0; i--) {  // Find current bit in given prefix  int current_bit = (key & (1 << i)) >= 1 ? 1 : 0;  // Traversal Trie look for prefix that has  // same bit  if (temp.Child[current_bit] != null)  temp = temp.Child[current_bit];  // if there is no same bit.then looking for  // opposite bit  else if (temp.Child[1 - current_bit] != null)  temp = temp.Child[1 - current_bit];  }  // return xor value of minimum bit difference value  // so we get minimum xor value  return key ^ temp.value;  }  // Returns minimum xor value of pair in arr[0..n-1]  static int minXOR(int arr[] int n)  {  int min_xor = Integer.MAX_VALUE; // Initialize result  // create a True and insert first element in it  root = new TrieNode();  insert(arr[0]);  // Traverse all array element and find minimum xor  // for every element  for (int i = 1; i < n; i++) {  // Find minimum XOR value of current element with  // previous elements inserted in Trie  min_xor = Math.min(min_xor minXORUtil(arr[i]));  // insert current array value into Trie  insert(arr[i]);  }  return min_xor;  }  // Driver code  public static void main(String args[])  {  int arr[] = { 9 5 3 };  int n = arr.length;  System.out.println(minXOR(arr n));  } } // This code is contributed by Sumit Ghosh 
Python
# class for the basic Trie Node  class TrieNode: def __init__(self): # Child array with 0 and 1  self.child = [None]*2 # meant for the lead Node  self.value = None class Trie: def __init__(self): # initialise the root Node  self.root = self.getNode() def getNode(self): # get a new Trie Node  return TrieNode() # inserts a new element  def insert(selfkey): temp = self.root # 32 bit valued binary digit  for i in range(31-1-1): # finding the bit at ith position curr = (key>>i)&(1) # if the child is None create one if(temp.child[curr] is None): temp.child[curr] = self.getNode() temp = temp.child[curr] # add value to the leaf node  temp.value = key # traverse the trie and xor with the most similar element def xorUtil(selfkey): temp = self.root # 32 bit valued binary digit  for i in range(31-1-1): # finding the bit at ith position curr = (key>>i)&1 # traverse for the same bit if(temp.child[curr] is not None): temp = temp.child[curr] # traverse if the same bit is not set in trie elif (temp.child[1-curr] is not None): temp = temp.child[1-curr] # return with the xor of the value  return temp.value^key def minXor(arr): # set m to a large number m = 2**30 # initialize Trie trie = Trie() # insert the first element trie.insert(arr[0]) # for each element in the array for i in range(1len(arr)): # find the minimum xor value m = min(mtrie.xorUtil(arr[i])) # insert the new element trie.insert(arr[i]) return m # Driver Code  if __name__=='__main__': sample = [953] print(minXor(sample)) #code contributed by Shushant Kumar  
C#
// Include namespace system using System; // C# program to find minimum XOR value in an array. public class GFG {  public const int INT_SIZE = 32;  // A Trie Node  public class TrieNode  {  public int value;  // used in leaf node  public TrieNode[] Child = new TrieNode[2];  public TrieNode()  {  this.value = 0;  this.Child[0] = null;  this.Child[1] = null;  }  }  public static TrieNode root;  // utility function insert new key in trie  public static void insert(int key)  {  var temp = root;  // start from the most significant bit insert all  // bit of key one-by-one into trie  for (int i = GFG.INT_SIZE - 1; i >= 0; i--)  {  // Find current bit in given prefix  var current_bit = (key & (1 << i)) >= 1 ? 1 : 0;  // Add a new Node into trie  if (temp != null && temp.Child[current_bit] == null)  {  temp.Child[current_bit] = new TrieNode();  }  temp = temp.Child[current_bit];  }  // store value at leafNode  temp.value = key;  }  // Returns minimum XOR value of an integer inserted  // in Trie and given key.  public static int minXORUtil(int key)  {  var temp = root;  for (int i = GFG.INT_SIZE - 1; i >= 0; i--)  {  // Find current bit in given prefix  var current_bit = (key & (1 << i)) >= 1 ? 1 : 0;  // Traversal Trie look for prefix that has  // same bit  if (temp.Child[current_bit] != null)  {  temp = temp.Child[current_bit];  }  else if (temp.Child[1 - current_bit] != null)  {  temp = temp.Child[1 - current_bit];  }  }  // return xor value of minimum bit difference value  // so we get minimum xor value  return key ^ temp.value;  }  // Returns minimum xor value of pair in arr[0..n-1]  public static int minXOR(int[] arr int n)  {  var min_xor = int.MaxValue;  // Initialize result  // create a True and insert first element in it  root = new TrieNode();  GFG.insert(arr[0]);  // Traverse all array element and find minimum xor  // for every element  for (int i = 1; i < n; i++)  {  // Find minimum XOR value of current element with  // previous elements inserted in Trie  min_xor = Math.Min(min_xorGFG.minXORUtil(arr[i]));  // insert current array value into Trie  GFG.insert(arr[i]);  }  return min_xor;  }  // Driver code  public static void Main(String[] args)  {  int[] arr = {9 5 3};  var n = arr.Length;  Console.WriteLine(GFG.minXOR(arr n));  } } // This code is contributed by aadityaburujwale. 
JavaScript
class TrieNode { constructor() { this.child = new Array(2); this.value = null; } } class Trie { constructor() { this.root = this.getNode(); } getNode() { return new TrieNode(); } insert(key) { let temp = this.root; for (let i = 31; i >= 0; i--) { let curr = (key >> i) & 1; if (!temp.child[curr]) temp.child[curr] = this.getNode(); temp = temp.child[curr]; } temp.value = key; } xorUtil(key) { let temp = this.root; for (let i = 31; i >= 0; i--) { let curr = (key >> i) & 1; if (temp.child[curr]) temp = temp.child[curr]; else if (temp.child[1 - curr]) temp = temp.child[1 - curr]; } return temp.value ^ key; } } function minXor(arr) { let m = 2 ** 30; let trie = new Trie(); trie.insert(arr[0]); for (let i = 1; i < arr.length; i++) { m = Math.min(m trie.xorUtil(arr[i])); trie.insert(arr[i]); } return m; } if (typeof module !== 'undefined') { module.exports = { minXor: minXor }; } console.log(minXor([9 5 3])); // This code is contributed by akashish__ 

Produzione
6

Complessità temporale O(n)

Complessità spaziale: O(n*INT_SIZE) 

 

Crea quiz