Encuentre la suma de XNOR de todos los pares no ordenados de un Array dado

Dada una array arr[] de tamaño N , la tarea es encontrar la suma de todos los valores XNOR de todos los posibles pares desordenados de la array dada.

Ejemplos:

Entrada : N = 5, arr[] = {2, 2, 2, 1, 1}
Salida : 10
Explicación : Aquí, 
2 XNOR 2 = 3, 2 XNOR 2 = 3, 2 XNOR 2 = 3, 1 XNOR 1 = 1, 2 XNOR 1 = 0, 2 XNOR 1 = 0, 2 XNOR 1 = 0, 2 XNOR 1 = 0, 2 XNOR 1 = 0, 2 XNOR 1 = 0, Por lo tanto, la suma es 3+3+3+1=10 .

Entrada : N = 3, arr[] = {1, 2, 3}
Salida : 3
Explicación : Aquí, 1 XNOR 2 = 0, 1 XNOR 3 = 1, 2 XNOR 3 = 2. Por lo tanto, la suma es 0+1+2 = 3

 

Enfoque: el único caso posible para que se establezca un bit después de la operación XNOR es que ambos bits deben ser iguales . Siga los pasos a continuación para resolver el problema:

  • Mantenga una array de bits de tamaño 30. La posición 0 desde la izquierda significa que 2^29 está incluida en la representación binaria y la posición 29 desde la izquierda significa que 2^0 está incluida en la representación binaria.
  • Para cada elemento, si se establece el bit i-ésimo , incremente la posición i-ésima de la array de bits.
  • Después de encontrar el MSB que contiene ‘1’, calcule los bits ‘0’ y ‘1’.
  • Hasta que se encuentre un bit ‘1’ , todos los bits ‘0’ serán bits desperdiciados. Guárdelos por separado.
  • Finalmente, digamos que para una i-ésima posición hay y número de unos . Por lo tanto, hay y*(y-1)/2 pares para un i-ésimo bit que tiene una combinación de bits (1, 1) que da el resultado 1 como XNOR . Además, digamos que hasta la misma posición hay x número de ceros . Por lo tanto, hay y*(y-1)/2 pares para un i-ésimo bit que tiene una combinación de bits (0, 0) que da el resultado 1 como XNOR .
  • Ahora, para el caso de los ceros iniciales , multiplique el número de bits desperdiciados por el número de 0 bits . Haga esto para cada posición de bit y calcule la respuesta.

Para una mejor comprensión, considere la array {35, 42, 27, 69} . Aquí están las representaciones binarias de los cuatro elementos de la array.

Representaciones binarias de elementos de array.

  • El unidireccional con la flecha es el primer bit de ese elemento que es 1. Por lo tanto, es el bit más significativo para ese elemento. De manera similar, el MSB para todos los demás elementos se colorea de verde .
  • Los ceros que aparecen antes del MSB son bits perdidos y están coloreados en rojo . El tamaño de estas arrays binarias es de 30 cada una.
  • En las primeras 23 posiciones de la array de bits, la cantidad de bits desperdiciados es cuatro , la cantidad de 1 es cero y la cantidad de 0 es cero , como se ve en la imagen.
  • En la posición 24, los bits desperdiciados son 3 y el número de 1 será 1 , ya que se encuentra MSB en el elemento 24 del elemento 69.

Bit 23: Nº de bits desperdiciados : 4, Nº de 1 : 0, Nº de 0 : 0
Bit 24: Nº de bits desperdiciados : 3, Nº de 1 : 1, Nº de 0 : 0
Bit 25 : N.º de bits desperdiciados : 1, N.º de 1 : 2, N.º de 0 : 1 (ya que ocurre después de MSB)
Bit 26: N.º de bits desperdiciados : 0, N.º de 1 : 1, N.º de 0’s: 3
27th bit: No. de bits desperdiciados : 0, No. de 1’s : 2, No.de 0’s : 2
28th bit: No. de bits desperdiciados : 0,Nº de 1 : 1, Nº de 0 : 3
Bit 29: Nº de bits desperdiciados : 0, Nº de 1 : 3, Nº de 0 : 1
Bit 30: Nº de bits desperdiciados : 0, Nº de 1 : 3, número de 0 : 1

  • Ahora, en cada uno de estos bits, para que el valor XNOR sea 1 en cualquiera de los pares de bits, ambos deben ser 1 o ambos deben ser 0 .
  • Para que ambos sean 1 , tiene N[i]*(N[i]-1)/2 pares, donde N[i] es el número de 1 en la i-ésima posición en todos los elementos.
  • De manera similar, para que ambos sean 0 , tiene M[i]*(M[i]-1)/2 pares, donde M[i] es el número de 0 en la i-ésima posición en todos los elementos. Dado que la respuesta requerida es la suma de todas las posibilidades. Entonces, para un i-ésimo bit, suma 2^(30-i-1) para todos los pares posibles.
  • En caso de que ambos deban ser 0, considere también los bits desperdiciados que ocurren cuando alguno de los elementos tiene un 0 (no desperdiciado) en la misma posición de los bits desperdiciados. Deje que los bits desperdiciados sean W[i] .
  • Entonces suma total = (N[i]*(N[i]-1)/2)*(2^(30-i-1) + (M[i]*(M[i]-1)/2) *(2^(30-i-1) + (W[i]*M[i]*(2^(30-i-1))) donde 0<= i <=30.
  • Entonces, para el ejemplo anterior, hasta el bit 23, todo es 0. Desde el bit 24 se enumera aquí.
  • total = ((1*0)/2)*(2^6) + ((0*(-1))/2)*(2^6) + 3*0*(2^6) + ((2 *1)/2)*(2^5) + ((1*0)/2)*(2^5) + 1*1*(2^5) + ((1*0)/2)*( 2^4) + ((3*2)/2)*(2^4) + 0*3*(2^4) + ((2*1)/2)*(2^3) + ((2 *1)/2)*(2^3) + 0*2*(2^3) + ((1*0)/2)*(2^2) + ((3*2)/2)*( 2^2) + 0*3*(2^2) + ((3*2)/2)*(2^1) + ((1*0)/2)*(2^1) + 0*1 *(2^1) + ((3*2)/2)*(2^0) + ((1*0)/2)*(2^0) + 0*1*(2^0)
  • total = 0 + 0 + 0 + 32 + 0 + 32 + 0 + 48 + 0 + 8 + 8 + 0 + 0 + 12 + 0 + 6 + 0 + 0 + 3 + 0 + 0
  • Por lo tanto, suma total = 149

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

Python3

# Python program for the above approach
 
# Function to find the required sum
 
 
def findSum(n, r):
 
    # Store the result
    result = 0
 
    # bits[i][0] and bits[i][1] has
    # count of all 1's and 0's in the
    # ith bit of all elements respectively
    # bits[i][2] has count of wasted zeroes
    # of ith bit for all elements
    bits = [[0, 0, 0] for i in range(30)]
 
    # Iterating through all elements
    for i in r:
 
        # Converting element to binary
        binary = bin(i)[2:]
 
        # zfill adds zeros to the front
        binary = binary.zfill(30)
 
        # Flag variable set to 1 after
        # first occurrence of 1 (MSB)
        flag = 0
 
        # Iterating through all the bits
        for j in range(30):
            # If msb not found
            if(flag == 0):
 
                # Msb found
                if(binary[j] == '1'):
 
                    # Set flag to 1
                    flag = 1
 
                    # Incrementing number
                    # of 1's in jth bit
                    bits[j][0] += 1
 
                # If msb not found yet
                else:
                    # Incrementing number of
                    # wasted zeroes before msb
                    bits[j][2] += 1
 
                # Continue till msb is encountered
                continue
 
            # Incrementing number
            # of 1's in jth bit
            if(binary[j] == '1'):
                bits[j][0] += 1
 
            # Incrementing number
            # of 0's in jth bit
            else:
                bits[j][1] += 1
 
    # Iterating through all bits
    for i in range(30):
 
        # Total number of 1's in
        # ith bit of all elements
        y = bits[i][0]
 
        # Total number of 0's in
        # ith bit of all elements
        x = bits[i][1]
 
        # Total number of wasted 0's
        # before msb of ith bit of all elements
        msboff = bits[i][2]
 
        # y*(y-1)/2 pairs for ith bit has (1, 1)
        # bit combo which gives result 1 in XNOR
        onePairs = (y*(y-1))//2
 
        # Adding value of ith
        # bit number of (1, 1) pairs
        # times to result
        # (2^(30-i-1) => 2 ^ 29, 2 ^ 28 etc.
        result += onePairs * pow(2, 30-i-1)
 
        # x*(x-1)/2 pairs for ith bit has (0, 0)
        # bit combo which gives result 1 in XNOR
        zeroPairs = ((x*(x-1))//2)
 
        # Adding value of ith bit
        # number of (0, 0) pairs
        # times to result
        # (2^(30-i-1) => 2 ^ 29, 2 ^ 28 etc.)
        result += zeroPairs * pow(2, 30-i-1)
 
        # Same for leading zeroes
        result += (msboff * x)*pow(2, 30-i-1)
 
    return result
 
 
# Driver code
if __name__ == '__main__':
    n = 5
    r = [2, 2, 2, 1, 1]
    print(findSum(n, r))

Javascript

<script>
    // JavaScript program for the above approach
 
    // Function to find the required sum
    const findSum = (n, r) => {
 
        // Store the result
        let result = 0;
 
        // bits[i][0] and bits[i][1] has
        // count of all 1's and 0's in the
        // ith bit of all elements respectively
        // bits[i][2] has count of wasted zeroes
        // of ith bit for all elements
        let bits = new Array(30).fill(0).map(() => new Array(3).fill(0));
        // Iterating through all elements
        for (let i in r) {
 
            // Converting element to binary
            let binary = Number(r[i]).toString(2);
            binary = binary.split("");
            while (binary.length < 30) {
                binary.unshift('0');
            }
            // Flag variable set to 1 after
            // first occurrence of 1 (MSB)
            let flag = 0;
 
            // Iterating through all the bits
            for (let j = 0; j < 30; j++) {
                // If msb not found
                if (flag == 0) {
 
                    // Msb found
                    if (binary[j] == '1') {
 
                        // Set flag to 1
                        flag = 1;
 
                        // Incrementing number
                        // of 1's in jth bit
                        bits[j][0] += 1;
                    }
 
                    // If msb not found yet
                    else
                        // Incrementing number of
                        // wasted zeroes before msb
                        bits[j][2] += 1;
 
                    // Continue till msb is encountered
                    continue;
                }
 
                // Incrementing number
                // of 1's in jth bit
                if (binary[j] == '1')
                    bits[j][0] += 1;
 
                // Incrementing number
                // of 0's in jth bit
                else
                    bits[j][1] += 1;
            }
        }
        // document.write(`${bits}<br/>`)
        // Iterating through all bits
        for (let i = 0; i < 30; i++) {
 
            // Total number of 1's in
            // ith bit of all elements
            let y = bits[i][0];
 
 
            // Total number of 0's in
            // ith bit of all elements
            let x = bits[i][1];
 
            // Total number of wasted 0's
            // before msb of ith bit of all elements
            let msboff = bits[i][2];
 
            // y*(y-1)/2 pairs for ith bit has (1, 1)
            // bit combo which gives result 1 in XNOR
            let onePairs = (y * (y - 1)) / 2;
            // Adding value of ith
            // bit number of (1, 1) pairs
            // times to result
            // (2^(30-i-1) => 2 ^ 29, 2 ^ 28 etc.
            result += onePairs * Math.pow(2, 30 - i - 1);
 
            // x*(x-1)/2 pairs for ith bit has (0, 0)
            // bit combo which gives result 1 in XNOR
            let zeroPairs = (x * (x - 1)) / 2;
 
            // Adding value of ith bit
            // number of (0, 0) pairs
            // times to result
            // (2^(30-i-1) => 2 ^ 29, 2 ^ 28 etc.)
            result += zeroPairs * Math.pow(2, 30 - i - 1);
 
            // Same for leading zeroes
            result += (msboff * x) * Math.pow(2, 30 - i - 1);
        }
 
        return result;
    }
 
    // Driver code
    let n = 5;
    let r = [2, 2, 2, 1, 1];
    document.write(findSum(n, r));
 
// This code is contributed by rakeshsahni
 
</script>
Producción

10

Complejidad de tiempo : O(30*N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por vishnuthulasidosss 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 *