📜  查找大小为 k 的子数组的最大异或值

📅  最后修改于: 2022-05-13 01:57:50.938000             🧑  作者: Mango

查找大小为 k 的子数组的最大异或值

给定一个整数数组,任务是找到大小为 K 的子数组的最大异或值。
例子 :

Input  : arr[] = {2, 5, 8 ,1 , 1 ,3} k = 3
Output : 15
Explanation : All subarrays of size k (=3) and
              their XOR values are:
 {2, 5, 8} => XOR value =  15
 {5, 8, 1} => XOR value =  12
 {8, 1, 1} => XOR value =  8
 {1, 1, 3} => XOR value =  3
Maximum of all XOR values = 15

Input  : arr[] = {1, 2, 4, 5, 6}
Output : 6

一个简单的解决方案是逐一考虑所有大小为 k 的子数组并计算 XOR 值。最后返回所有 XOR 值的最大值。此解决方案需要 O(n*k) 时间
一个有效的解决方案需要 O(n) 时间。这个想法很简单,我们可以通过删除前一个子数组的第一个元素并添加当前子数组的最后一个元素来找到大小为 k 的当前子数组的 XOR 值。我们可以通过再次对其进行 XOR 来从当前 XOR 中删除一个元素,因为 XOR 的属性 a ^ x ^ x = a。
算法 :

Let input array be 'arr[]' and size of array be 'n'

max_xor ;  // user to store maximum xor value
current_xor; //  user to store xor value of current subarray 
            // of size k 
 
// First compute xor value of first subarray of size k  
// (i goes from 0 to k)
corrent_xor = current_xor ^ arr[i] 

// Initialize maximum XOR
max_xor = current_xor 

Traversal rest array (i goes from k to n-1 )
 a).  remove first element of previous subarray 
      current_xor = current_xor ^ arr[i-k] 
 
 b).  add new element to subarray  
      current_xor = current_xor ^ arr[i]

 c). update max_xor = max(max_xor, current_xor)
 
return max_xor 
      

下面是上述步骤的实现。

C++
// C++/C program to find maximum xor value of subarray of
// size k
#include
using namespace std;
 
// Returns maximum XOR value of subarray of size k
int maximumXOR(int arr[] , int n , int k)
{
    // Compute XOR value of first subarray of size k
    int current_xor = 0 ;
    for (int i = 0 ; i < k ; i++)
        current_xor  = current_xor ^ arr[i];
 
    // Traverse rest of the array
    int max_xor = current_xor;
    for (int i = k ; i < n; i++)
    {
        // First remove previous subarray's first
        // element
        current_xor = current_xor ^ arr[i-k];
 
        // add new element
        current_xor = current_xor ^ arr[i];
 
        // Update maximum xor value
        max_xor = max(max_xor, current_xor);
    }
 
    return max_xor;
}
 
// Driver program
int main()
{
    int arr[] = {2, 5, 8 ,1 , 1 ,3} ;
    int k = 3;
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << "Maximum XOR : " << maximumXOR(arr, n, k);
    return 0;
}


Java
// Java program to find maximum xor value of
// subarray of size k
import java.io.*;
 
class GFG {
 
    // Returns maximum XOR value of subarray of size k
    static int maximumXOR(int arr[] , int n , int k)
    {
         
        // Compute XOR value of first subarray of size k
        int current_xor = 0 ;
        for (int i = 0 ; i < k ; i++)
            current_xor = current_xor ^ arr[i];
     
        // Traverse rest of the array
        int max_xor = current_xor;
         
        for (int i = k ; i < n; i++)
        {
             
            // First remove previous subarray's first
            // element
            current_xor = current_xor ^ arr[i-k];
     
            // add new element
            current_xor = current_xor ^ arr[i];
     
            // Update maximum xor value
            max_xor = Math.max(max_xor, current_xor);
        }
     
        return max_xor;
    }
     
    // Driver program
    public static void main (String[] args)
    {
        int arr[] = {2, 5, 8 ,1 , 1 ,3} ;
        int k = 3;
        int n = arr.length;
        System.out.println( "Maximum XOR : "
                   + maximumXOR(arr, n, k));
    }
}
 
// This code is contributed by anuj_67.


Python 3
# Python3 program to find maximum
# xor value of subarray of
# size
 
# Returns maximum XOR value
# of subarray of size k
def maximumXOR(arr , n , k):
 
    # Compute XOR value of first
    # subarray of size k
    current_xor = 0
    for i in range ( k):
        current_xor = current_xor ^ arr[i]
 
    # Traverse rest of the array
    max_xor = current_xor
    for i in range( k,n):
     
        # First remove previous subarray's first
        # element
        current_xor = current_xor ^ arr[i-k]
 
        # add new element
        current_xor = current_xor ^ arr[i]
 
        # Update maximum xor value
        max_xor = max(max_xor, current_xor)
     
 
    return max_xor
 
# Driver program
if __name__ =="__main__":
 
    arr = [2, 5, 8 ,1 , 1 ,3]
    k = 3
    n = len(arr)
    print ("Maximum XOR : "
          ,maximumXOR(arr, n, k))
 
# This code is contributed by
# ChitraNayal


C#
// C# program to find maximum
// xor value of subarray of
// size k
using System;
class GFG {
 
    // Returns maximum XOR value
    // of subarray of size k
    static int maximumXOR(int []arr,
                      int n, int k)
    {
         
        // Compute XOR value of first
        // subarray of size k
        int current_xor = 0 ;
        for (int i = 0; i < k; i++)
            current_xor = current_xor ^ arr[i];
     
        // Traverse rest of the array
        int max_xor = current_xor;
         
        for (int i = k ; i < n; i++)
        {
             
            // First remove previous
            // subarray's first
            // element
            current_xor = current_xor ^ arr[i-k];
     
            // add new element
            current_xor = current_xor ^ arr[i];
     
            // Update maximum xor value
            max_xor = Math.Max(max_xor, current_xor);
        }
     
        return max_xor;
    }
     
    // Driver Code
    public static void Main ()
    {
        int []arr = {2, 5, 8 ,1 , 1 ,3} ;
        int k = 3;
        int n = arr.Length;
        Console.WriteLine("Maximum XOR : "
                  + maximumXOR(arr, n, k));
    }
}
 
// This code is contributed by anuj_67.


PHP


Javascript


输出 :

Maximum XOR : 15