Bestimmen Sie, ob mehr als die Hälfte des Arrays in einem bestimmten Array wiederholt wird

8

Ich schaute auf die folgenden Frage von Glassdoor :

Bestimmen Sie, ob mehr als die Hälfte von N Credits Karten zur selben Person / Eigentümer gehören. Alles, was Sie haben, ist ein Array der Kreditkartennummern und ein API-Anruf wie isSamePerson (num1, num2).

Es ist klar, wie man es in O (n ^ 2) macht, aber einige Kommentatoren sagten, dass es in O (n) Zeit gemacht werden kann. Ist es überhaupt möglich? Ich meine, wenn wir eine Reihe von Kreditkartennummern haben, wo einige Nummern wiederholt werden, dann macht der Anspruch Sinn. Allerdings müssen wir für jede Kreditkartennummer einen API-Aufruf tätigen, um ihren Besitzer zu sehen.

Was fehlt mir hier?

    
Namir M 07.02.2013, 21:15
quelle

5 Antworten

13

Der Algorithmus läuft wie folgt ab:

Wenn es einen Großteil eines Gegenstandes (hier eine Person) gibt, dann wird dieser Gegenstand übrig bleiben, wenn Sie Gegenstände zusammenführen, die nicht gleich sind (in irgendeiner Reihenfolge).

  • Beginnen Sie mit einem leeren Kandidaten-Slot
  • Für jeden Gegenstand
    • Wenn der Kandidaten-Slot leer ist (Anzahl = 0), platzieren Sie ihn dort.
    • Wenn es gleich dem Element im Slot ist, erhöhen Sie die Anzahl.
    • Else dekrementiert die Anzahl für diesen Slot (ein Element wird eingefügt).
  • Wenn in der Kandidatenrunde nichts mehr zu finden ist, gibt es keine klare Mehrheit. Andernfalls
  • Zählen Sie die Anzahl der Vorkommen des Kandidaten (zweiter Durchgang).
  • Wenn die Anzahl der Vorkommen mehr als 50% beträgt, deklariere sie als Gewinner,
  • Sonst gibt es keine Mehrheit.

Beachten Sie, dass dies nicht angewendet werden kann, wenn der Schwellenwert unter 50% liegt (aber es sollte möglich sein, sich an einen Schwellenwert von 33%, 25% ... anzupassen, indem Sie zwei, drei ... Kandidaten-Slots halten und nur einen Unterschied machen Dreibettzimmer, Vierbettzimmer ...).

Dies gilt auch für den Fall der Kreditkarten: Sie müssen nur zwei Elemente (Personen) für die Gleichheit (über den API-Aufruf) vergleichen und einen Zähler, der die Gesamtzahl der Elemente berücksichtigen kann.

Zeitkomplexität: O(N)
Raumkomplexität: O(1) + Eingabe
API-Aufrufe: bis zu 2N-1: Einmal in jedem Durchlauf ruft kein API das erste Element im ersten Durchlauf auf.

    
John Dvorak 07.02.2013, 21:31
quelle
3

Sei x1, x2, ..., xn die Kreditkartennummer.

Beachten Sie, dass, da mehr als die Hälfte von ihnen zu derselben Person gehören, wenn Sie zwei benachbarte Zahlen berücksichtigen, mindestens ein Paar derselben Person gehören wird.

Wenn Sie alle Paare (x1, x2), (x3, x4) ... betrachten und die Teilmenge der Paare betrachten, in denen beide Elemente zu derselben Person gehören, gehört die Mehrheit der Paare derselben Person zur Person Wer hat die Mehrheit der Karten an erster Stelle. Also, behalten Sie für jedes Paar mit derselben Person eine der Kartennummern und für Paare, die nicht dieselbe Person sind, beide Karten ab. Führen Sie das rekursiv durch, und geben Sie das letzte verbleibende gleiche Personenpaar zurück.

Sie müssen höchstens n Vergleiche durchführen.

HINWEIS: Wenn n ungerade ist, behalten Sie die ungepaarte Zahl bei.

Warum das funktioniert: Betrachte einen Fall, in dem n gerade ist und Person A n / 2 + 1 Karten besitzt. Im schlimmsten Fall haben Sie genau ein Paar, in dem beide Karten A gehören. In diesem Fall gehört keines der anderen Paare derselben Person (andere Paare enthalten eine Karte von A und eine Karte von einer anderen Person).

Um nun ein passendes Paar B (Nicht-A-Person) zu erstellen, müssen Sie auch ein Paar B erstellen. Daher gehört zu jedem Zeitpunkt eine Mehrheit übereinstimmender Paare zu A.

    
ElKamina 07.02.2013 21:34
quelle
2

Ich habe keinen guten Ruf. Die Methode von Jan Dvorak ist bekannt als Moores Voting-Algorithmus (Stream Counting Algorithm). Hier ist der Code.

%Vor%     
Ravi Prakash 10.10.2016 21:39
quelle
0

Die Frage ist, das Majoritätselement in einem Array herauszufinden. Ich werde verwenden Boyer-Moore Mehrheitswahl-Algorithmus. Ich mache das mit HashMap.

%Vor%

Die Ausgabe ist 3.

    
Soudipta Dutta 23.03.2018 09:11
quelle
-1

DONE IN EINEM PASS:

  • Beginnen Sie mit dem zweiten Index des Arrays, sagen wir zuerst i = 1.
  • Anfangszahl = 1.
  • Aufruf isSamePerson (a [i], a [i-1]) wobei Array a [] Kreditkartennummern enthält.
  • Wenn der zurückgegebene Wert positiv ist, zählen Sie ++ und i ++
  • andernfalls, wenn der zurückgegebene Wert 0 ist und count == 1, i ++
  • sonst, wenn der zurückgegebene Wert 0 ist und count & gt; 1, count-- und i ++
  • Wenn i! = (n-1), gehe zu Schritt 3, wobei n die Anzahl der Karten ist.
  • else Wenn am Ende des Array Count & gt; 1 ist, dann gibt es mehr als die Hälfte der Karten, die zu einer einzelnen Person gehören
  • sonst gibt es keine klare Mehrheit von über 50%.

Ich hoffe, dass dies verständlich ist und das Schreiben von Code eine einfache Sache ist.

ZEITKOMPLEXITÄT - O (N)
ANZAHL DER API-ANRUFE = N -1
RAUMKOMPLEXITÄT - O (1)

    
kavish 08.02.2013 07:08
quelle

Tags und Links