Maximice Bitwise AND del primer elemento con el complemento de los elementos restantes para cualquier permutación de Array dado

Dada una array arr[] que consta de N enteros, la tarea es encontrar el valor máximo de Bitwise AND del primer elemento con el complemento de los elementos restantes para cualquier permutación de esta array, es decir 

A 1 &(~A 2 ) & (~A 3 ) & ……& (~A n )

Ejemplos:

Entrada: arr[] = {1, 2, 4, 8, 16} 
Salida: 16 
Explicación: 
Para la permutación {16, 1, 2, 4, 8}, se puede obtener el valor máximo de la expresión.

 

Entrada: arr[] = {0, 2, 3, 4, 9, 8} 
Salida:
Explicación: 
Para la permutación {4, 8, 9, 3, 2, 0}, se puede obtener el valor máximo de la expresión

Enfoque ingenuo: el enfoque más simple para resolver el problema es generar todas las permutaciones posibles de la array dada y encontrar el valor requerido para cada permutación e imprimir el máximo entre ellos. 
Complejidad temporal: O(N * N!) 
Espacio auxiliar: O(N)
 

Enfoque eficiente: El enfoque anterior se puede optimizar mediante la siguiente observación:  

  • La expresión A 1 &(~A 2 ) & (~A 3 ) & …… & (~A n ) depende únicamente del valor de A 1.
  • Por lo tanto, para maximizar el valor de la expresión, elija A 1 de modo que tenga el bit establecido de la mayor importancia posible, que no está establecido en todos los demás elementos de la array.
  • Dado que el orden de los elementos restantes de la array no importa, imprima cualquier permutación que tenga el A 1 obtenido como primer elemento.

Ilustración: 
For arr[] = {1, 2, 4, 8, 16}
Representación binaria de los elementos de la array: 
(16) 10 = (10000) 2 
(8) 10 = (01000) 2 
(4) 10 = (00100 ) ) 2 
(2) 10 = (00010) 2 
(1) 10 = (00001) 2
Como puede verse, 16 tiene el bit activado más significativo que está desactivado en todos los demás elementos de la array. Por lo tanto, la permutación requerida de la permutación dada contendrá 16 como primer elemento.
Por lo tanto, el AND bit a bit requerido es máximo para la permutación que tiene 16 como primer elemento, que es igual a 16 en este caso. 

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
#define size_int 32
 
// Function to maximize the value for
// the given function and the array elements
int functionMax(int arr[], int n)
{
    // Vector array to maintain which bit is set
    // for which integer in the given array by
    // saving index of that integer
    vector<int> setBit[32];
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < size_int; j++) {
 
            // Check if j-th bit is set for
            // i-th integer
            if (arr[i] & (1 << j))
 
                // Push the index of that
                // integer in setBit[j]
                setBit[j].push_back(i);
        }
    }
 
    // Find the element having
    // highest significant set bit
    // unset in other elements
    for (int i = size_int; i >= 0; i--) {
        if (setBit[i].size() == 1) {
 
            // Place that integer at 0-th index
            swap(arr[0], arr[setBit[i][0]]);
            break;
        }
    }
 
    // Store the maximum AND value
    int maxAnd = arr[0];
    for (int i = 1; i < n; i++) {
        maxAnd = maxAnd & (~arr[i]);
    }
 
    // Return the answer
    return maxAnd;
}
 
// Driver Code
int main()
{
 
    int arr[] = { 1, 2, 4, 8, 16 };
    int n = sizeof arr / sizeof arr[0];
 
    // Function call
    cout << functionMax(arr, n);
 
    return 0;
}

Java

// Java Program to implement
// the above approach
import java.util.*;
class GFG{
 
static final int size_int = 32;
 
// Function to maximize the value for
// the given function and the array elements
static int functionMax(int arr[], int n)
{
    // Vector array to maintain which bit is set
    // for which integer in the given array by
    // saving index of that integer
    Vector<Integer> []setBit = new Vector[32 + 1];
    for (int i = 0; i < setBit.length; i++)
        setBit[i] = new Vector<Integer>();
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < size_int; j++)
        {
 
            // Check if j-th bit is set for
            // i-th integer
            if ((arr[i] & (1 << j)) > 0)
 
                // Push the index of that
                // integer in setBit[j]
                setBit[j].add(i);
        }
    }
 
    // Find the element having
    // highest significant set bit
    // unset in other elements
    for (int i = size_int; i >= 0; i--)
    {
        if (setBit[i].size() == 1)
        {
 
            // Place that integer at 0-th index
            swap(arr, 0, setBit[i].get(0));
            break;
        }
    }
 
    // Store the maximum AND value
    int maxAnd = arr[0];
    for (int i = 1; i < n; i++)
    {
        maxAnd = maxAnd & (~arr[i]);
    }
 
    // Return the answer
    return maxAnd;
}
   
static int[] swap(int []arr, int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    return arr;
}
   
// Driver Code
public static void main(String[] args)
{
 
    int arr[] = { 1, 2, 4, 8, 16 };
    int n = arr.length;
 
    // Function call
    System.out.print(functionMax(arr, n));
}
}
 
// This code is contributed by PrinciRaj1992

Python3

# Python 3 Program to
# implement the above approach
 
# Function to maximize the
# value for the given function
# and the array elements
def functionMax(arr, n):
   
    # Vector array to maintain
    # which bit is set for which
    # integer in the given array by
    # saving index of that integer
    setBit = [[] for i in range(32)]
 
    for i in range(n):
        for j in range(32):
           
            # Check if j-th bit is
            # set for i-th integer
            if (arr[i] & (1 << j)):
               
                # Push the index of that
                # integer in setBit[j]
                setBit[j].append(i)
 
    # Find the element having
    # highest significant set bit
    # unset in other elements
    i = 31
     
    while(i >= 0):
        if (len(setBit[i]) == 1):
           
            # Place that integer
            # at 0-th index
            temp = arr[0]
            arr[0] = arr[setBit[i][0]]
            arr[setBit[i][0]] = temp
            break
        i -= 1
 
    # Store the maximum
    # AND value
    maxAnd = arr[0]
    for i in range(1, n, 1):
        maxAnd = (maxAnd & (~arr[i]))
 
    # Return the answer
    return maxAnd
 
# Driver Code
if __name__ == '__main__':
    arr = [1, 2, 4, 8, 16]
    n = len(arr)
 
    # Function call
    print(functionMax(arr, n))
 
# This code is contributed by bgangwar59

C#

// C# Program to implement
// the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
static readonly int size_int = 32;
 
// Function to maximize the value for
// the given function and the array elements
static int functionMax(int []arr, int n)
{
    // List array to maintain which bit is set
    // for which integer in the given array by
    // saving index of that integer
    List<int> []setBit = new List<int>[32 + 1];
    for (int i = 0; i < setBit.Length; i++)
        setBit[i] = new List<int>();
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < size_int; j++)
        {
 
            // Check if j-th bit is set for
            // i-th integer
            if ((arr[i] & (1 << j)) > 0)
 
                // Push the index of that
                // integer in setBit[j]
                setBit[j].Add(i);
        }
    }
 
    // Find the element having
    // highest significant set bit
    // unset in other elements
    for (int i = size_int; i >= 0; i--)
    {
        if (setBit[i].Count == 1)
        {
 
            // Place that integer at 0-th index
            swap(arr, 0, setBit[i][0]);
            break;
        }
    }
 
    // Store the maximum AND value
    int maxAnd = arr[0];
    for (int i = 1; i < n; i++)
    {
        maxAnd = maxAnd & (~arr[i]);
    }
 
    // Return the answer
    return maxAnd;
}
   
static int[] swap(int []arr, int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    return arr;
}
   
// Driver Code
public static void Main(String[] args)
{
 
    int []arr = { 1, 2, 4, 8, 16 };
    int n = arr.Length;
 
    // Function call
    Console.Write(functionMax(arr, n));
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// Javascript Program to implement
// the above approach
var size_int = 32;
 
// Function to maximize the value for
// the given function and the array elements
function functionMax( arr, n)
{
    // Vector array to maintain which bit is set
    // for which integer in the given array by
    // saving index of that integer
    var setBit = Array.from(Array(32), ()=>new Array());
 
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < size_int; j++) {
 
            // Check if j-th bit is set for
            // i-th integer
            if (arr[i] & (1 << j))
 
                // Push the index of that
                // integer in setBit[j]
                setBit[j].push(i);
        }
    }
 
    // Find the element having
    // highest significant set bit
    // unset in other elements
    for (var i = size_int-1; i >= 0; i--) {
        if (setBit[i].length == 1) {
 
            // Place that integer at 0-th index
            [arr[0], arr[setBit[i][0]]] = [arr[setBit[i][0]], arr[0]];
            break;
        }
    }
 
    // Store the maximum AND value
    var maxAnd = arr[0];
    for (var i = 1; i < n; i++) {
        maxAnd = maxAnd & (~arr[i]);
    }
 
    // Return the answer
    return maxAnd;
}
 
// Driver Code
var arr = [1, 2, 4, 8, 16];
var n = arr.length;
 
// Function call
document.write( functionMax(arr, n));
 
// This code is contributed by rrrtnx.
</script>
Producción: 

16

 

Complejidad de tiempo: O(N * sizeof(int)), donde sizeof(int) es 32
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por pradyumanagarwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *