De Boyer-Moore röstar Algoritm är en av de populära optimala algoritmerna som används för att hitta majoritetselementet bland de givna elementen som har fler än N/2 förekomster. Detta fungerar perfekt för att hitta majoritetselementet som tar 2 genomgångar över de givna elementen, vilket fungerar i O(N) tidskomplexitet och O(1) rymdkomplexitet.
Låt oss se algoritmen och intuitionen bakom dess funktion, genom att ta ett exempel -
Input : {1,1,1,1,2,3,5} Output : 1 Explanation : 1 occurs more than 3 times. Input : {1,2,3} Output : -1>
Denna algoritm fungerar på det faktum att om ett element förekommer mer än N/2 gånger, betyder det att de återstående elementen förutom detta definitivt skulle vara mindre än N/2. Så låt oss kontrollera algoritmens förlopp.
städer i australien
- Välj först en kandidat från den givna uppsättningen av element om det är samma som kandidatelementet, öka rösterna. Annars, minska rösterna om rösterna blir 0, välj ett annat nytt element som ny kandidat.
Intuitionen bakom arbetet:
När elementen är desamma som kandidatelementet ökar rösterna medan när något annat element hittas (inte lika med kandidatelementet) minskade vi antalet. Detta betyder faktiskt att vi minskar prioriteringen av vinnarförmågan för den valda kandidaten, eftersom vi vet att om kandidaten är i majoritet sker det mer än N/2 gånger och de återstående elementen är mindre än N/2. Vi fortsätter att minska rösterna eftersom vi hittade några andra element än kandidatelementet. När rösterna blir 0 betyder det faktiskt att det är lika många röster för olika element, vilket inte borde vara fallet för att elementet ska vara majoritetselementet. Så kandidatelementet kan inte vara majoriteten och därför väljer vi det nuvarande elementet som kandidat och fortsätter på samma sätt tills alla element är färdiga. Den slutliga kandidaten skulle vara vårt majoritetselement. Vi kontrollerar med den andra genomgången för att se om dess antal är större än N/2. Om det är sant, betraktar vi det som majoritetselementet.
Steg för att implementera algoritmen:
Steg 1 - Hitta en kandidat med majoritet –
- Initiera en variabel säg i ,röster = 0, kandidat =-1
- Gå igenom arrayen med för loop
- Om röster = 0, Välj den kandidat = arr[i] , göra röster=1 .
- annat om det aktuella elementet är detsamma som kandidatens ökning av röster
- annars minskar rösterna.
Steg 2 - Kontrollera om kandidaten har fler än N/2 röster –
- Initiera ett variabelantal =0 och öka antalet om det är samma som kandidaten.
- Om antalet är>N/2, returnera kandidaten.
- annars returnerar -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 är 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) återvändande kandidat; returnera -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; returnera -1; // Det sista for loop och if-satssteget kan // hoppa över om ett majoritetselement bekräftas att // vara närvarande i en array, returnera bara kandidat // i så fall } // Driver code public static void main(String[ ] args) { int arr[] = { 1, 1, 1, 1, 2, 3, 4}; int majoritet = findMajority(arr); System.out.println(' Majoritetselementet är: ' + majoritet); } } // Denna kod är bidragit av Arnav Sharma> |
>
>
Python3
omvandla sträng till int
# 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 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; returnera -1; // Det sista för loop och if-satssteget kan // hoppa över om ett majoritetselement bekräftas att // vara närvarande i en array, returnera bara kandidat // i så fall } // Driver code public static void Main(String[ ] args) { int []arr = { 1, 1, 1, 1, 2, 3, 4}; int majoritet = findMajority(arr); Console.Write(' Majoritetselementet är: ' + majoritet); } } // Denna kod är bidragit från shivanisinghss2110> |
>
>
Javascript
delsträngsmetod java
> // 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; returnera -1; // Det sista för loop och if-satssteget kan // hoppa över om ett majoritetselement bekräftas att // finns i en array, returnera bara kandidat // i så fall } // Driver code var arr = [ 1, 1 1, 1, 2, 3, 4]; var majoritet = findMajority(arr); document.write(' Majoritetselementet är: ' + majoritet); // Denna kod har bidragit med shivanisinghss2110.> |
>
>Produktion
The majority element is : 1>
Tidskomplexitet: O(n) (För två pass över arrayen)
Utrymmes komplexitet: O(1)