logo

Boyer-Moore většinový volební algoritmus

The Hlasování Boyer-Moore Algoritmus je jedním z populárních optimálních algoritmů, který se používá k nalezení většinového prvku mezi danými prvky, které mají více než N/2 výskytů. To funguje naprosto dobře pro nalezení většinového prvku, který zabere 2 průchody přes dané prvky, což funguje v časové složitosti O(N) a prostorové složitosti O(1).

Podívejme se na algoritmus a intuici za jeho fungováním na příkladu –



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

Tento algoritmus pracuje na tom, že pokud se prvek vyskytuje více než N/2krát, znamená to, že zbývající prvky jiné než toto by rozhodně byly menší než N/2. Podívejme se tedy na průběh algoritmu.

  • Nejprve vyberte kandidáta z dané sady prvků, pokud je shodný s prvkem kandidáta, zvyšte hlasy. V opačném případě snižte hlasy, pokud budou hlasy 0, jako nového kandidáta vyberte jiný nový prvek.

Intuice za prací:
Když jsou prvky stejné jako prvek kandidáta, hlasy se zvýší, zatímco když je nalezen nějaký jiný prvek (není stejný jako prvek kandidáta), snížíme počet. To ve skutečnosti znamená, že snižujeme prioritu vítězné schopnosti vybraného kandidáta, protože víme, že pokud je kandidát ve většině, vyskytuje se více než N/2krát a zbývající prvky jsou méně než N/2. Stále snižujeme hlasy, protože jsme našli nějaký jiný prvek (prvky) než prvek kandidáta. Když se hlasy stanou 0, znamená to ve skutečnosti, že existuje stejný počet hlasů pro různé prvky, což by nemělo platit pro prvek, který je většinovým prvkem. Kandidátským prvkem tedy nemůže být většina, a proto si jako kandidáta vybereme přítomný prvek a pokračujeme stejně, dokud nebudou všechny prvky dokončeny. Konečný kandidát by byl naším většinovým prvkem. Pomocí 2. traverzu zkontrolujeme, zda je jeho počet větší než N/2. Pokud je to pravda, považujeme to za většinový prvek.

Kroky k implementaci algoritmu:
Krok 1 - Najděte kandidáta s většinou –



  • Řekněme inicializovat proměnnou i ,hlasy = 0, kandidát =-1
  • Procházejte polem pomocí smyčky for
  • Li hlasy = 0, vyber kandidát = arr[i] , udělat hlasy = 1 .
  • jinak, pokud je aktuální prvek stejný jako přírůstek hlasů kandidáta
  • jinak snížit hlasy.

Krok 2 - Zkontrolujte, zda má kandidát více než N/2 hlasů –

  • Inicializujte proměnnou počet = 0 a zvyšte počet, pokud je stejný jako kandidát.
  • Pokud je počet>N/2, vraťte kandidáta.
  • jinak vrátit -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 Takže 1 je většinový prvek.>

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) vrátit kandidáta; návrat -1; } int main() { int arr[] = { 1, 1, 1, 1, 2, 3, 4 }; int n = sizeof(arr) / sizeof(arr[0]); int většina = findMajority(arr, n); cout<< ' The majority element is : ' << majority; return 0; }>

>

>

Jáva

sharwanand




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>(čísla.délka / 2)) vrátit kandidáta; návrat -1; // Poslední cyklus for a krok příkazu if lze // přeskočit, pokud je potvrzeno, že většinový prvek // je přítomen v poli, stačí vrátit kandidáta // v tom případě } // Kód ovladače public static void main(String[ ] args) { int arr[] = { 1, 1, 1, 1, 2, 3, 4 }; int většina = findMajority(arr); System.out.println(' Většinový prvek je: ' + většina); } } // Tento kód přispěl 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>

>

ternární operátor java
>

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 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>(čísla.Délka / 2)) vrátit kandidáta; návrat -1; // Poslední cyklus for a krok příkazu if lze // přeskočit, pokud je potvrzeno, že většinový prvek // je přítomen v poli, stačí vrátit kandidáta // v tom případě } // Kód ovladače public static void Main(String[ ] args) { int []arr = { 1, 1, 1, 1, 2, 3, 4}; int většina = findMajority(arr); Console.Write(' Většinový prvek je: ' + většina); } } // Tento kód přispěl shivanisinghss2110>

>

>

Javascript




životní cyklus vývoje softwaru
> // 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>(čísla.délka / 2)) vrátit kandidáta; návrat -1; // Poslední cyklus for a krok příkazu if lze // přeskočit, pokud je potvrzeno, že většinový prvek // je přítomen v poli, stačí vrátit kandidáta // v tom případě } // Kód ovladače var arr = [ 1, 1 , 1, 1, 2, 3, 4]; var majorita = findMajority(arr); document.write(' Většinový prvek je: ' + většina); // Tento kód přispěl shivanisinghss2110.>

>

>

Výstup

 The majority element is : 1>

Časová náročnost: O(n) (Pro dva průchody polem)
Prostorová složitost: O(1)