logo

Boyer-Moores flertalsafstemningsalgoritme

Det Boyer-Moore afstemning algoritme er en af ​​de populære optimale algoritmer, som bruges til at finde majoritetselementet blandt de givne elementer, der har mere end N/2 forekomster. Dette fungerer helt fint til at finde majoritetselementet, som tager 2 gennemløb over de givne elementer, som fungerer i O(N) tidskompleksitet og O(1) rumkompleksitet.

Lad os se algoritmen og intuitionen bag dens funktion ved at tage et eksempel -



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

Denne algoritme virker på det faktum, at hvis et element forekommer mere end N/2 gange, betyder det, at de resterende elementer ud over dette helt sikkert ville være mindre end N/2. Så lad os kontrollere algoritmens forløb.

java-indsamlingsramme
  • Først skal du vælge en kandidat fra det givne sæt af elementer, hvis det er det samme som kandidatelementet, øge stemmerne. Ellers mindske stemmerne, hvis stemmerne bliver 0, vælg et andet nyt element som ny kandidat.

Intuitionen bag arbejdet:
Når elementerne er de samme som kandidatelementet, øges stemmerne, mens når et andet element er fundet (ikke lig med kandidatelementet), reducerede vi antallet. Dette betyder faktisk, at vi reducerer prioriteringen af ​​vinderevnen for den udvalgte kandidat, da vi ved, at hvis kandidaten er i flertal, sker det mere end N/2 gange, og de resterende elementer er mindre end N/2. Vi bliver ved med at reducere stemmerne, da vi fandt nogle andre elementer end kandidatelementet. Når stemmer bliver 0, betyder det faktisk, at der er lige mange stemmer for forskellige elementer, hvilket ikke burde være tilfældet for, at elementet er flertalselementet. Så kandidatelementet kan ikke være flertallet, og derfor vælger vi det nuværende element som kandidat og fortsætter det samme, indtil alle elementerne er færdige. Den endelige kandidat ville være vores flertalselement. Vi kontrollerer ved hjælp af 2. gennemløb for at se, om dens antal er større end N/2. Hvis det er sandt, betragter vi det som flertalselementet.

Trin til implementering af algoritmen:
Trin 1 - Find en kandidat med flertal –



  • Initialiser en variabel siger i ,stemmer = 0, kandidat =-1
  • Gå gennem arrayet med for loop
  • Hvis stemmer = 0, Vælg kandidat = arr[i] , lave stemmer=1 .
  • ellers hvis det aktuelle element er det samme som kandidatens stigning i stemmer
  • ellers falder stemmerne ned.

Trin 2 – Tjek om kandidaten har mere end N/2 stemmer –

  • Initialiser en variabel count =0 og øg count, hvis den er den samme som kandidaten.
  • Hvis antallet er>N/2, returneres kandidaten.
  • ellers returnerer -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 Så 1 er majoritetselementet.>

C++






// C++ implementation for the above approach> #include> 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 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 if (arr[i] == candidate) count++; } if (count>n / 2) returkandidat; returnere -1; } int main() { int arr[] = { 1, 1, 1, 1, 2, 3, 4 }; int n = sizeof(arr) / sizeof(arr[0]); int majoritet = 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 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 if (nums[index] == candidate) count++; } if (count>(nums.length / 2)) returkandidat; returnere -1; // Det sidste for-løkke og if-sætningstrinnet kan // springes over, hvis et majoritetselement bekræftes til at // være til stede i et array, returner bare kandidat // i så fald } // Driverkode public static void main(String[ ] args) { int arr[] = { 1, 1, 1, 1, 2, 3, 4}; int majoritet = findMajority(arr); System.out.println(' Majoritetselementet er: ' + majoritet); } } // Denne kode er bidraget af Arnav Sharma>

>

>

imessage spil på Android

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#


java cast streng til int



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 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 if (nums[index] == candidate) count++; } if (count>(antal.Længde / 2)) returkandidat; returnere -1; // Det sidste for-løkke og if-sætningstrinnet kan // springes over, hvis et majoritetselement bekræftes til // at være til stede i et array, skal du bare returnere kandidat // i så fald } // Driverkode public static void Main(String[ ] args) { int []arr = { 1, 1, 1, 1, 2, 3, 4}; int majoritet = findMajority(arr); Console.Write(' Majoritetselementet er: ' + majoritet); } } // Denne kode er bidraget af shivanisinghss2110>

>

>

Javascript




> // Function to find majority element> function> findMajority(nums)> >{> >var> count = 0, candidate = -1;> >// Finding majority candidate> >for> (>var> index = 0; 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 if (nums[index] == candidate) count++; } if (count>(nums.length / 2)) returkandidat; returnere -1; // Det sidste for loop og if-sætningstrinnet kan // springes over, hvis et majoritetselement bekræftes til // at være til stede i et array, skal du bare returnere kandidat // i så fald } // Driverkode var arr = [ 1, 1 1, 1, 2, 3, 4]; var majoritet = findMajority(arr); document.write(' Majoritetselementet er: ' + majoritet); // Denne kode er bidraget af shivanisinghss2110.>

>

>

switch case java
Produktion

 The majority element is : 1>

Tidskompleksitet: O(n) (For to passager over arrayet)
Rumkompleksitet: O(1)