Mehrheitselement mit C ++

Mehrheitselement mit C ++

Sei n die Anzahl der Elemente in einem Vektor oder Array. Das Mehrheitselement oder der Leiter ist das Element, das mehr als die Hälfte der Zeiten aller Elemente im Vektor auftritt. Die Hälfte von n bedeutet: Wenn n 10 ist, dann ist die Hälfte der Zeit 5. Das Element in der Hälfte der Position ist bei Index 4 für die null basierte Indexzählung. Die geringste Ganzzahl, die mehr als die Hälfte von 10 ist, ist eindeutig 6 (entspricht Index 5). Wenn N 11 ist, wird die Hälfte von n noch als 5 angesehen. Dies ist die gesamte Zahl, die ernimmt, wenn 11 durch 2 geteilt wird. Der Index für die Hälfte ist immer noch 4 für die null basierte Indexierung. Wenn n 11 ist, ist die am wenigsten Ganzzahl, die eindeutig mehr als die buchstäbliche Hälfte von 11 ist, noch 6 (entsprechend dem Index 5).

Die halbe Länge (Größe) eines Vektors ist also das Ergebnis einer ganzzahligen Teilung von N bis 2. Das heißt, die gesamte Anzahl des Quotienten, nachdem es durch 2 geteilt wurde, wird genommen, ob es einen Rest gibt oder nicht.

Das Mehrheitselement oder das Leiter ist das Element, das mehr als die Hälfte der Zeiten aller Elemente im Vektor oder Array auftritt. Es muss sein mehr als die Hälfte der Zeiten und nicht nur die Hälfte der Zeiten. Das heißt, es muss mehr als N/2 -mal sein (die resultierende ganze Zahl nehmen). Die Funktion sollte -1 zurückgeben, wenn kein Mehrheitselement existiert.

In diesem Artikel wird erläutert, wie das Mehrheitselement für eine zeitliche Komplexität von O (n) bestimmt werden kann. Das heißt, maximal die Hauptoperationen sind erforderlich, um das Mehrheitselement zu erhalten.

Vektorbeispiele

Betrachten Sie den folgenden Vektor:

Vektor A = 6, 8, 4, 6, 8, 6, 6


Das Mehrheitselement (Führer) ist 6. Es tritt 4 Mal von 7 -mal auf (Elemente).

Betrachten Sie den folgenden Vektor:

Vektor B = 3, 4, 3, 2, 3, -1, 3, 3


Das Mehrheitselement ist 3. Es tritt 5 Mal von 8 Elementen vor.

Betrachten Sie den folgenden Vektor:

Vektor C = 4, 3, 4, 4, 4, 2


Das Mehrheitselement ist 4. Es tritt 4 Mal von 6 Elementen auf.

Betrachten Sie den folgenden Vektor:

Vektor D = 5, 4, 7, 1, 7, 2, 3, 7, 8


Hier gibt es kein Mehrheitselement. Die Funktion muss also -1 zurückgeben. Hier gibt es neun Elemente. Die Zahl 7 tritt dreimal auf und jedes der anderen Elemente tritt einmal auf. Drei sind nicht mehr als die Hälfte von neun. Es hätte mindestens fünfmal ein akzeptables Mehrheitselement aufgetreten sein müssen.

Abbildung für den Algorithmus für O (n) Zeitkomplexität

Aus den folgenden Vektoren werden zwei verschiedene Elemente gleichzeitig entfernt.

Betrachten Sie den Vektor erneut:

Vektor A = 6, 8, 4, 6, 8, 6, 6


Das Leader (Mehrheit) Element ist 6. Die ersten beiden Elemente sind unterschiedlich. Wenn beide entfernt werden, wäre der verbleibende Satz 4, 6, 8, 6, 6. In diesem verbleibenden Set ist 6 immer noch der Anführer: dreimal von 5 Mal. Die nächsten beiden Elemente, 4 und 6. Wenn sie entfernt werden, lautet der verbleibende Satz 8, 6, 6. Im verbleibenden Satz ist 6 immer noch der Anführer. Die nächsten beiden Elemente, 8 und 6. Wenn sie entfernt werden, ist der verbleibende Satz 6. In diesem letzten Satz von nur einem Element ist 6 immer noch der Anführer. Es sieht daher so aus, als ob zwei verschiedene Zahlen wiederholt entfernt werden. Das endgültige verbleibende Element wäre das Mehrheitselement.

Betrachten Sie jetzt den Vektor:

Vektor B = 3, 4, 3, 2, 3, -1, 3, 3


Das Leader (Mehrheit) Element ist 3. Die ersten beiden Elemente sind unterschiedlich. Wenn beide entfernt werden, wäre der verbleibende Satz 3, 2, 3, -1, 3, 3. In diesem verbleibenden Satz ist 3 immer noch der Anführer: vier Mal von sechs Mal. Die nächsten beiden Elemente 3 und 2 sind unterschiedlich. Wenn sie entfernt werden, lautet der verbleibende Satz 3, -1, 3, 3. Im verbleibenden Satz ist 3 immer noch der Anführer. Die nächsten beiden Elemente 3 und -1 sind unterschiedlich. Wenn sie entfernt werden, lautet der verbleibende Satz 3, 3. In diesem letzten Satz von zwei Elementen ist 3 immer noch der Anführer. Es sieht daher immer noch so aus, als ob zwei verschiedene Zahlen wiederholt entfernt werden. Die endgültigen verbleibenden Elemente wären das Mehrheitselement.

Betrachten Sie als nächstes den Vektor:

Vektor C = 4, 3, 4, 4, 4, 2


Das Leader (Mehrheit) Element ist 4. Die ersten beiden Elemente sind unterschiedlich. Wenn beide entfernt werden, wäre der verbleibende Satz 4, 4, 4, 2. In diesem verbleibenden Satz ist 4 immer noch der Anführer: dreimal von viermal. Die nächsten beiden Elemente 4 und 4 sind gleich und sollten nicht entfernt werden. Das erste Element hier und das dritte Element hier kann jedoch zur Entfernung in Betracht gezogen werden. Es kommt vor, dass diese beiden auch gleich sind. Trotzdem kann das erste Element und das vierte Element zur Entfernung in Betracht gezogen werden. Sie sind unterschiedlich, also werden sie entfernt. Der verbleibende letzte Satz ist 4, 4. Es sieht daher immer noch so aus, als ob zwei verschiedene Zahlen wiederholt entfernt werden. Das endgültige verbleibende gleiche Elemente wäre das Mehrheitselement.

Betrachten Sie dann den Vektor:

Vektor D = 5, 4, 7, 1, 7, 2, 3, 7, 8


Wir wissen bereits, dass dieser Vektor keinen Anführer hat, obwohl 7 dreimal auftritt und eine andere Zahl einmal auftritt. 7 tritt drei von neunmal auf und das macht es nicht zu einem Anführer. Trotzdem können verschiedene Paare wiederholt entfernt werden, um zu sehen, wie das endgültige verbleibende Set aussehen würde. Die ersten beiden Elemente 5 und 4 sind unterschiedlich. Wenn sie entfernt werden, wäre der verbleibende Satz 7, 1, 7, 2, 3, 7, 8. In diesem verbleibenden Satz ist 7 immer noch das vorherrschende Element. Aber es ist noch nicht immer noch der Anführer des verbleibenden Satzes. Denken Sie daran, dass der Anführer mehr als die Hälfte der Anzahl der Male auftreten muss. Die nächsten beiden Elemente 7 und 1 sind unterschiedlich. Wenn sie entfernt werden, wäre der verbleibende Satz 7, 2, 3, 7, 8. 7 ist immer noch das vorherrschende Element, aber es ist immer noch nicht der Anführer. Die nächsten beiden Elemente 7 und 2 sind unterschiedlich. Sie werden entfernt, um das Set zu haben, 3, 7, 8. Diesmal gibt es kein vorherrschendes Element und es gibt keinen Anführer. Die nächsten beiden Elemente, 3 und 7. Wenn sie entfernt werden, wäre der verbleibende Satz 8.

Für die vorherigen drei Vektoren ist das endgültige verbleibende Element oder das endgültige verbleibende gleiche Elemente das Mehrheitselement. Es ist bereits bekannt, dass es in diesem letzten Vektor kein Mehrheitselement (Führer) gibt. Die Tatsache, dass ein Element endlich verbleibt, bedeutet nicht unbedingt, dass es das Mehrheitselement ist.

Betrachten Sie nun den Fall, in dem N eine gleichmäßige Zahl ist und jedes Element im Vektor einmal auftritt. In diesem Fall werden alle Elementpaare entfernt und es wird kein Element im letzten Satz verbleiben. In diesem Fall muss die Funktion eindeutig -1 zurückgeben, da es kein Mehrheitselement gibt.

Für das endgültige verbleibende Element oder das endgültige verbleibende gleiche Element. Dieses verbleibende Element wird als Kandidat bezeichnet.

O (n) Zeitkomplexitätsalgorithmus für Mehrheitselemente

Die Strategie besteht darin, wiederholte Elementpaare zu entfernen: ab links im gegebenen Vektor unterschiedlich. Wenn kein Element verbleibt, gibt es kein Mehrheitselement und die Funktion sollte -1 zurückgeben. Wenn ein oder mehrere der gleichen Elemente übrig bleiben, muss es überprüft werden, wenn das Element mehr als die Hälfte der Zeiten im Vektor auftritt. Dieses Element wird als Kandidat bezeichnet. Es wird das Mehrheitselement, wenn es mehr als die Hälfte der Anzahl der Male auftritt.

Diese Überprüfung kann in der linearen Zeit durchgeführt werden, indem der Vektor von links gescannt wird und sobald die Anzahl der Vorkommen mehr als die Hälfte der Länge des Vektors ist, um zu stoppen. Wenn der gesamte Vektor gescannt wird und die Anzahl der auftritt, die der Kandidat nicht mehr als die Hälfte der Zeiten beträgt, gibt es kein Mehrheitselement (gemäß der Definition).

Strategie mit c++

Mit C ++ müssen die Elemente nicht aus dem gegebenen Vektor entfernt werden. Stattdessen wird ein Stapel verwendet. Das erste Element des Vektors wird in die Oberseite des Stapels geschoben. Wenn sich das nächste Element vom oberen Element im Stapel unterscheidet, wird das obere Element im Stapel entfernt (abgeholt). Andernfalls wird dieses nächste Element an die Oberseite des Stapels gedrückt (wenn das Stapel -Top -Element und dieses nächste Element gleich sind). Dieses Schema setzt sich für den Rest der Elemente fort.

Am Ende des Scans (ein Durchgang des Vektors), wenn sich kein Element im Stapel befindet, gibt es kein Mehrheitselement. Ein oder mehrere Elemente können im Stapel bleiben. Wenn mehr als ein Element im Stapel verbleibt, müssen diese verbleibenden Elemente gleich sein. Dieses Element wird als Kandidat bezeichnet.

Ob ein oder mehrere des gleichen Elements im Stapel verbleiben, dieses Element oder das gleiche Element, das mehr als einmal auftritt. Der Vektor muss erneut abgestellt werden, um festzustellen. Wenn es mehr als die Hälfte der Zeiten auftritt, ist dieses Element das Mehrheitselement (Leader); Andernfalls hat der Vektor (oder Array) kein Mehrheitselement (die Funktion sollte -1 zurückgeben).

C ++ - Codierung

Immer wenn ein Vektor in einem C ++ - Programm verwendet wird, muss die Überschrift des Programms so etwas wie folgt sein:

#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;


Die Stackbibliothek muss enthalten sein. Standard -Namespace wird verwendet. Vektor ist die Hauptliste, daher ist die Bibliothek enthalten. Die iOstream -Bibliothek sollte immer aufgenommen werden. Es ist für Eingabe/Ausgabe verantwortlich. Der Name der Funktion für den O (N) -Algorithmus ist die Mehrheit der Mehrheit. Die erste Hälfte des Funktionscodes lautet:

int Mehrheit (Vektor &A)
int n = a.Größe();
int size = 0;
Stapel st;
st.pushen (a [0]);
für (int i = 1; iif (st.size ()> 0) // zu vermeiden, Segmentierungsfehler (core abgeladen) Fehler
if (a [i] == st.Spitze())
st.drücken (a [i]);

anders
st.Pop(); // wenn anders


anders
st.drücken (a [i]); // Wenn leer auf den Stapel drücken


Dies hat die erste Auswahl, die die Hauptverschleiftungsschleife ist. Vor der Schleife wird das erste Element des Vektors an den Stapel gesendet (die Oberseite). Diese For-Loop implementiert die C ++-Strategie wird oben erwähnt. Der zweite und letzte Teil der Funktion der Mehrheit () ist:

int candidate = -1;
if (st.size ()> 0)
Kandidat = st.Spitze();
Int Leader = -1;
int count = 0;
für (int i = 0; iif (a [i] == Kandidat)
zählen += 1;


if (count> n/2)
Anführer = Kandidat;
Rückkehrführer;


Dies überprüft, ob der Kandidat tatsächlich das Mehrheitselement ist. Der variable Führer ist ein Synonym des Mehrheitselements. Der variable Kandidat ist das mögliche Mehrheitselement. Sobald der Wert für Count N/2 überschreitet, ist der Kandidat das Mehrheitselement. Dieser Teil hat die für Schleife, die überprüft, ob der Vektor über ein Mehrheitselement verfügt. Die obigen zwei Teile sollten mit einer Funktion verbunden werden. Die Funktion gibt -1 zurück, wenn kein Mehrheitselement existiert.

Eine geeignete C ++ - Hauptfunktion für den obigen Code lautet:


Vektor v1 = 6, 8, 4, 6, 8, 6, 6;
int ret1 = Mehrheit (v1);
Cout << ret1 << endl;
Vektor v2 = 3, 4, 3, 2, 3, -1, 3, 3;
int ret2 = Mehrheit (v2);
Cout << ret2 << endl;
Vektor v3 = 4, 3, 4, 4, 4, 2;
int ret3 = Mehrheit (v3);
Cout << ret3 << endl;
Vektor v4 = 5, 4, 7, 1, 7, 2, 3, 7, 8;
int ret4 = Mehrheit (v4);
Cout << ret4 << endl;
Rückkehr 0;

Zeitkomplexität

Da es zwei For-Schleifen gibt, wobei der Vektor zweimal gescannt wird, könnte der Leser versucht sein zu sagen, dass die Zeitkomplexität o (n+n) ist. Jetzt ist der Körper der ersten For-Loop viel länger als der Körper für die zweite Fürsaufschließung. Die Zeit, die der zweite für die Schleife ausführende Körper ausführt. Mit anderen Worten, diese Zeit für den zweiten Körper ist relativ vernachlässigbar. Die zeitliche Komplexität für den obigen Algorithmus wird also zitiert als:

An)


Zeitkomplexität ist die ungefähre Anzahl von Hauptvorgängen für die betreffende Funktion.

Abschluss

Die allgemeine Strategie, das Mehrheitselement in o (n) Zeit zu finden. Wenn kein Element verbleibt, schließlich in der Liste, gibt es kein Mehrheitselement und die Funktion sollte -1 zurückgeben. Wenn ein oder mehrere des gleichen Elements übrig bleiben, muss es überprüft werden, wenn das Element mehr als die Hälfte der Zeit in der Liste auftritt. Dieses Element wird als Kandidat bezeichnet. Wenn der Kandidat mehr als die Hälfte der Zeit in der angegebenen Liste auftritt, ist der Kandidat das Mehrheitselement.

Chrys