Algoritmo de votación mayoritaria de Boyer-Moore

El algoritmo de votación de Boyer-Moore es uno de los algoritmos óptimos populares que se utiliza para encontrar el elemento mayoritario entre los elementos dados que tienen más de N/2 ocurrencias. Esto funciona perfectamente bien para encontrar el elemento mayoritario que toma 2 recorridos sobre los elementos dados, lo que funciona en complejidad de tiempo O (N) y complejidad de espacio O (1).

Veamos el algoritmo y la intuición detrás de su funcionamiento, tomando un ejemplo:

Input :{1,1,1,1,2,3,5}
Output : 1
Explanation : 1 occurs more than 3 times.
Input : {1,2,3}
Output : -1

Este algoritmo funciona en el hecho de que si un elemento aparece más de N/2 veces, significa que los elementos restantes que no sean este definitivamente serían menos de N/2. Así que vamos a comprobar el procedimiento del algoritmo.

  • Primero, elija un candidato del conjunto dado de elementos si es el mismo que el elemento candidato, aumente los votos. De lo contrario, disminuya los votos si los votos se convierten en 0, seleccione otro elemento nuevo como nuevo candidato.

Intuición detrás del trabajo:
Cuando los elementos son los mismos que el elemento candidato, los votos se incrementan cuando se encuentra algún otro elemento que no es igual al elemento candidato. Disminuimos el conteo. En realidad, esto significa que estamos disminuyendo la prioridad de la capacidad ganadora del candidato seleccionado, ya que sabemos que si el candidato es mayoría, ocurre más de N/2 veces y los elementos restantes son menos de N/2. Seguimos disminuyendo los votos ya que encontramos algún elemento diferente al elemento candidato. Cuando los votos se convierten en 0, en realidad significa que hay el mismo número de elementos diferentes, lo que no debería ser el caso para que el elemento sea el elemento mayoritario. Entonces, el elemento candidato no puede ser la mayoría, por lo que elegimos el elemento presente como candidato y continuamos igual hasta que todos los elementos estén terminados. El candidato final sería nuestro elemento mayoritario. Verificamos usando el segundo recorrido para ver si su cuenta es mayor que N/2. Si es cierto, lo consideramos como el elemento mayoritario.

Pasos para implementar el algoritmo:
Paso 1 – Encontrar un candidato con la mayoría –

  • Inicialice una variable, digamos i, votos = 0, candidato = -1 
  • Atraviesa la array usando for loop
  • Si votos = 0, elija el candidato = arr[i] , haga votos = 1 .
  • de lo contrario, si el elemento actual es el mismo que el candidato, se incrementan los votos
  • de lo contrario, disminuir los votos.

Paso 2: compruebe si el candidato tiene más de N/2 votos:

  • Inicialice una cuenta variable = 0 e incremente la cuenta si es la misma que la candidata.
  • Si el conteo es >N/2, devuelva el candidato.
  • de lo contrario devuelve -1.
Dry run for the above example: 
Given :
  arr[]=        1    1    1    1    2    3    5
 votes =0       1    2    3    4    3    2    1
 candidate = -1 1    1    1    1    1    1    1
 candidate = 1  after first traversal
                1    1    1    1    2    3    5
 count =0       1    2    3    4    4    4    4 
 candidate = 1  
 Hence count > 7/2 =3
 So 1 is the majority element.

C++

// C++ implementation for the above approach
#include <iostream>
using namespace std;
// Function to find majority element
int findMajority(int arr[], int n)
{
    int i, candidate = -1, votes = 0;
    // Finding majority candidate
    for (i = 0; i < n; i++) {
        if (votes == 0) {
            candidate = arr[i];
            votes = 1;
        }
        else {
            if (arr[i] == candidate)
                votes++;
            else
                votes--;
        }
    }
    int count = 0;
    // Checking if majority candidate occurs more than n/2
    // times
    for (i = 0; i < n; i++) {
        if (arr[i] == candidate)
            count++;
    }
 
    if (count > n / 2)
        return candidate;
    return -1;
}
int main()
{
    int arr[] = { 1, 1, 1, 1, 2, 3, 4 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int majority = findMajority(arr, n);
    cout << " The majority element is : " << majority;
    return 0;
}

Java

import java.io.*;
 
class GFG
{
 
  // Function to find majority element
  public static int findMajority(int[] nums)
  {
    int count = 0, candidate = -1;
 
    // Finding majority candidate
    for (int index = 0; index < nums.length; index++) {
      if (count == 0) {
        candidate = nums[index];
        count = 1;
      }
      else {
        if (nums[index] == candidate)
          count++;
        else
          count--;
      }
    }
 
    // Checking if majority candidate occurs more than
    // n/2 times
    count = 0;
    for (int index = 0; index < nums.length; index++) {
      if (nums[index] == candidate)
        count++;
    }
    if (count > (nums.length / 2))
      return candidate;
    return -1;
 
    // The last for loop and the if statement step can
    // be skip if a majority element is confirmed to
    // be present in an array just return candidate
    // in that case
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int arr[] = { 1, 1, 1, 1, 2, 3, 4 };
    int majority = findMajority(arr);
    System.out.println(" The majority element is : "
                       + majority);
  }
}
 
// This code is contribute by Arnav Sharma

Python3

# Python implementation for the above approach
 
# Function to find majority element
def findMajority(arr, n):
    candidate = -1
    votes = 0
     
    # Finding majority candidate
    for i in range (n):
        if (votes == 0):
            candidate = arr[i]
            votes = 1
        else:
            if (arr[i] == candidate):
                votes += 1
            else:
                votes -= 1
    count = 0
     
    # Checking if majority candidate occurs more than n/2
    # times
    for i in range (n):
        if (arr[i] == candidate):
            count += 1
             
    if (count > n // 2):
        return candidate
    else:
        return -1
 
# Driver Code
 
arr = [ 1, 1, 1, 1, 2, 3, 4 ]
n = len(arr)
majority = findMajority(arr, n)
print(" The majority element is :" ,majority)
     
# This code is contributed by shivanisinghss2110 

C#

using System;
 
class GFG
{
 
  // Function to find majority element
  public static int findMajority(int[] nums)
  {
    int count = 0, candidate = -1;
 
    // Finding majority candidate
    for (int index = 0; index < nums.Length; index++) {
      if (count == 0) {
        candidate = nums[index];
        count = 1;
      }
      else {
        if (nums[index] == candidate)
          count++;
        else
          count--;
      }
    }
 
    // Checking if majority candidate occurs more than
    // n/2 times
    count = 0;
    for (int index = 0; index < nums.Length; index++) {
      if (nums[index] == candidate)
        count++;
    }
    if (count > (nums.Length / 2))
      return candidate;
    return -1;
 
    // The last for loop and the if statement step can
    // be skip if a majority element is confirmed to
    // be present in an array just return candidate
    // in that case
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    int []arr = { 1, 1, 1, 1, 2, 3, 4};
    int majority = findMajority(arr);
    Console.Write(" The majority element is : "
                       + majority);
  }
}
 
// This code is contributed by shivanisinghss2110

Javascript

<script>
// Function to find majority element
function findMajority(nums)
  {
    var count = 0, candidate = -1;
 
    // Finding majority candidate
    for (var index = 0; index < nums.length; index++) {
      if (count == 0) {
        candidate = nums[index];
        count = 1;
      }
      else {
        if (nums[index] == candidate)
          count++;
        else
          count--;
      }
    }
 
    // Checking if majority candidate occurs more than
    // n/2 times
    count = 0;
    for (var index = 0; index < nums.length; index++) {
      if (nums[index] == candidate)
        count++;
    }
    if (count > (nums.length / 2))
      return candidate;
    return -1;
 
    // The last for loop and the if statement step can
    // be skip if a majority element is confirmed to
    // be present in an array just return candidate
    // in that case
  }
 
// Driver code
    var arr = [ 1, 1, 1, 1, 2, 3, 4 ];
    var majority = findMajority(arr);
    document.write(" The majority element is : "
                       + majority);
   
 
// This code is contributed by shivanisinghss2110.
 
</script>
Producción

 The majority element is : 1

Complejidad de tiempo: O(n) (Para dos pases sobre la array)
Complejidad de espacio: O(1)

Publicación traducida automáticamente

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