logo

Boyer-Moorov algoritem večinskega glasovanja

The Boyer-Moore glasovanje algoritem je eden izmed priljubljenih optimalnih algoritmov, ki se uporablja za iskanje večinskega elementa med danimi elementi, ki imajo več kot N/2 pojavitev. To deluje popolnoma dobro za iskanje večinskega elementa, ki opravi 2 prehoda čez dane elemente, kar deluje pri O(N) časovni kompleksnosti in O(1) prostorski kompleksnosti.

Oglejmo si algoritem in intuicijo za njegovim delovanjem na primeru –



razlika med večerjo in večerjo
 Input : {1,1,1,1,2,3,5} Output : 1 Explanation : 1 occurs more than 3 times. Input : {1,2,3} Output : -1>

Ta algoritem deluje na dejstvu, da če se element pojavi več kot N/2-krat, to pomeni, da bi bilo preostalih elementov, razen tega, zagotovo manj kot N/2. Preverimo torej potek algoritma.

  • Najprej izberite kandidata iz danega nabora elementov, če je enak elementu kandidata, povečajte število glasov. V nasprotnem primeru zmanjšajte število glasov, če glasovi postanejo 0, izberite drug nov element kot novega kandidata.

Intuicija za delom:
Ko so elementi enaki elementu kandidata, se glasovi povečajo, ko pa je najden drug element (ki ni enak elementu kandidata), smo štetje zmanjšali. To dejansko pomeni, da izbranemu kandidatu znižujemo prioriteto zmagovalne sposobnosti, saj vemo, da če je kandidat v večini, se to zgodi več kot N/2-krat, preostalih elementov pa je manj kot N/2. Še naprej zmanjšujemo število glasov, ker smo našli nekaj drugačnih elementov od elementa kandidata. Ko glasovi postanejo 0, to dejansko pomeni, da je število glasov za različne elemente enako, kar pa ne bi smelo veljati, da bi bil element večinski. Torej kandidatni element ne more biti večina in zato izberemo sedanji element kot kandidata in nadaljujemo isto, dokler niso vsi elementi končani. Končni kandidat bi bil naš večinski element. Z 2. prehodom preverimo, ali je njegovo število večje od N/2. Če je res, ga štejemo za večinski element.

Koraki za implementacijo algoritma:
Korak 1 - Poiščite kandidata z večino –



  • Inicializirajte spremenljivko recimo i ,glasov = 0, kandidat =-1
  • Skozi matriko prečkajte z zanko for
  • če glasov = 0, izberite kandidat = arr[i] , narediti glasov=1 .
  • drugače, če je trenutni element enak glasovom prirastka kandidata
  • drugače zmanjšaj glasove.

2. korak – Preverite, ali ima kandidat več kot N/2 glasov –

  • Inicializirajte spremenljivko count =0 in povečajte count, če je enaka kandidatu.
  • Če je število>N/2, vrnite kandidata.
  • drugače vrni -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 Torej je 1 večinski element.>

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) kandidat za vrnitev; vrnitev -1; } int main() { int arr[] = { 1, 1, 1, 1, 2, 3, 4 }; int n = sizeof(arr) / sizeof(arr[0]); int večina = findMajority(arr, n); cout<< ' The majority element is : ' << majority; return 0; }>

>

>

Java


shweta tiwari igralec



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)) vrni kandidata; vrnitev -1; // Zadnja zanka for in korak stavka if se lahko // preskočita, če je potrjeno, da je večinski element // prisoten v matriki, // v tem primeru vrne kandidata } // Koda gonilnika public static void main(String[ ] args) { int arr [] = { 1, 1, 1, 1, 2, 3, 4 }; int večina = findMajority(arr); System.out.println(' Večinski element je : ' + večina); } } // To kodo je prispeval 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>

Sridevi
>

>

C#




np.ničle
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>(nums.Length / 2)) vrni kandidata; vrnitev -1; // Zadnja zanka for in korak stavka if se lahko // preskočita, če je potrjeno, da je večinski element // prisoten v matriki, // v tem primeru vrne kandidata } // Koda gonilnika public static void Main(String[ ] args) { int []arr = { 1, 1, 1, 1, 2, 3, 4}; int večina = findMajority(arr); Console.Write(' Večinski element je : ' + večina); } } // To kodo je prispeval 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)) vrni kandidata; vrnitev -1; // Zadnja zanka for in korak stavka if se lahko // preskočita, če je potrjeno, da je večinski element // prisoten v matriki, // v tem primeru vrne kandidata } // Koda gonilnika var arr = [ 1, 1 , 1, 1, 2, 3, 4]; var večina = findMajority(arr); document.write(' Večinski element je : ' + večina); // To kodo je prispeval shivanisinghss2110.>

>

izklop razvijalskega načina

>

Izhod

 The majority element is : 1>

Časovna zapletenost: O(n) (Za dva prehoda čez polje)
Kompleksnost prostora: O(1)