Boyer Mehrheitsabstimmungsalgorithmus – Moore / Sudo Null IT News

#Einführung#
Ich habe Probleme auf LeetCode gelöst und hier ist eine kleine Übersetzung Artikel über einen kleinen Algorithmus.
Der Boyer-Moore-Voting-Algorithmus ist einer der beliebtesten und optimalen Algorithmen, der verwendet wird, um das dominante Element unter den gegebenen zu finden, das mehr als N/2 Vorkommen hat. Der Algorithmus führt 2 Iterationen über die gegebenen Elemente aus, was bei O(N)-Zeitkomplexität und O(1)-Raumkomplexität funktioniert.

Eingabe: {1,1,1,1,2,3,5} Ausgabe: 1 Eingabe: {1,2,3} Ausgabe: -1

Wenn ein Element mehr als N/2 Mal vorkommt, dann gibt es weniger als N/2 Elemente, die sich davon unterscheiden. Tatsächlich basiert der Algorithmus darauf.
Zunächst wird ein Kandidatenelement ausgewählt. Weiter für jedes Element:

  • wenn das Element gleich dem Kandidaten ist, wird die Anzahl der Stimmen erhöht.

  • sind Kandidat und Element ungleich, wird die Anzahl der Stimmen reduziert.

  • bei 0 Stimmen wird ein neuer Kandidat gewählt.

#In Worten#
Indem wir die Anzahl der Stimmen erhöhen oder verringern, erhöhen oder verringern wir die Priorität eines bestimmten Kandidaten. Dies wird funktionieren, da der richtige Kandidat sich mehr als N/2 Mal trifft. Wenn sich herausstellt, dass die Anzahl der Stimmen 0 beträgt, bedeutet dies, dass es so viele Elemente gibt, die sich vom Kandidaten unterscheiden, wie ihm gleich sind. Es stellt sich heraus, dass der aktuelle Kandidat nicht die Mehrheit sein kann und wir wählen den nächsten Kandidaten. Der letzte Kandidat wird das dominierende Element sein, falls vorhanden. Überprüfen Sie im zweiten Durchgang, ob das resultierende Element mehr als N / 2-mal vorkommt. Wenn nicht, dann gibt es kein solches Element.

#Von Wörtern zu Codes#

öffentliche statische Ganzzahl findMajority(int[] Zahlen) { int count = 0; ganzzahliger Kandidat = null; for (int num : nums) { // Prüfe, ob die Anzahl der Stimmen 0 ist, ändere den Kandidaten if (count == 0) { Candidate = num; } // Wenn Kandidat und Nummer übereinstimmen, erhöhen Sie die Anzahl der Stimmen // andernfalls verringern Sie die Anzahl += (num == Kandidat) ? elf; } Anzahl = 0; // Zähle die Anzahl der Elemente gleich dem Kandidaten // im anfänglichen Array for (int num : nums) { if (num == Candidate) count++; } // wenn der Kandidat die Bedingung erfüllt, zurückgeben // andernfalls null zurückgeben; if (count > (nums.length / 2)) Kandidat zurückgeben; Sonst gib null zurück; }

Similar Posts

Leave a Reply

Your email address will not be published.