Die Laufzeit des beschriebenen Algorithmus ist O(n^2)
. Die äußere Schleife wird n/2
mal ausgeführt, somit wird der innere Zähler j
n/2
mal zurückgesetzt, und somit wird die innere Schleife insgesamt O(n^2)
mal ausgeführt.
Ich bin nicht sicher, ich verfolge die Logik hinter Ihrer Idee, aber hier sind zwei Ansätze, wie ich es umsetzen würde [in hohem Niveau Pseudo-Code]:
(1) erstellen histogram aus der Daten:
- erstellen
Map<Integer,Integer>
[der Schlüssel ist, das Element und der Wert ist die Anzahl der Vorkommen]
- iterieren das Array und für jedes Element zählen, wie oft es
- iterieren des Histogramms angezeigt wird, und Finde heraus, ob es ein einzigartiges Maximum gibt.
- Wenn es gibt - Rückgabe wahr, sonst Rückgabe false.
Dieser Ansatz ist durchschnittlich O(n)
, wenn Sie ein HashMap
als die Karte verwenden.
(2) zu sortieren und zu max Vorkommen finden:
- sortieren das Array - als Ergebnis, alle gleich Elemente zueinander benachbart sind. Sie können
Arrays.sort(array)
zum Sortieren verwenden.
- Zählen Sie, wie oft jedes Element angezeigt wird [ähnlich der Histogramm-Idee], und finden Sie heraus, ob es ein eindeutiges Maximum gibt. Sie müssen nicht wirklich die Daten für alle Elemente pflegen, es ist genug für die Top-2 zu halten, und am Ende zu sehen, ob sie identisch sind.
Diese Lösung ist O(nlogn)
Durchschnitt + worst case [tatsächlich je nach Art - merge sor t Sie O(nlogn)
schlimmsten Fall gibt, während quick-sort gibt Ihnen O(n^2)
schlimmsten Fall, und beide sind O(nlogn)
im Durchschnitt Fall].
EDIT:
ich das Problem bei der Hand falsch verstanden, ich dachte, Sie schauen, ob es eine eindeutige Maximum ist. Diese 2 Lösungen passen immer noch für das Problem, Sie müssen nur den letzten Schritt jedes [ändern, um zu überprüfen, ob das am häufigsten vorkommende Element mehr als die Hälfte der Zeiten erscheint, was wiederum in O(n)
] ziemlich einfach und machbar ist.
Es gibt auch eine andere Lösung: Verwenden Sie selection algorithm, um den Median zu finden, und nachdem Sie ihn gefunden haben, prüfen Sie, ob es ein Majoritätselement ist, und geben Sie es zurück. Da der Auswahlalgorithmus eine Lösung ist, die auf Teilen und Siegen basiert, denke ich, dass sie zu Ihren Bedürfnissen passt.
I a hinzugefügt erscheint Hausaufgaben-Tag, da es so zu sein scheint. Wenn ich mich irre, korrigiere mich bitte. – amit
mögliches Duplikat von [Hauptelement im Array suchen] (http://stackoverflow.com/questions/4325200/find-majority-element-in-array) – erickson
Speziell [this] (http://stackoverflow.com/a/9487018/3474) ist die beste Lösung für die doppelte Frage. – erickson