2012-12-13 5 views

Antwort

7

Update: - deutliche und eindeutige


Wenn Sie suchen "einzigartig" Werte (wie in, wenn Sie ein Element sehen "JASON" mehr als einmal, als es nicht ist mehr eindeutig und sollte nicht gezählt werden)

Sie, dass durch die Verwendung eines HashMap in linearer Zeit tun;)

(Die verallgemeinerte/sprachunabhängig Idee ist Hash table)

Jeder Eintrag eines HashMap/Hash-Tabelle ist <KEY, VALUE> Paar wo die Schlüssel eindeutig sind (jedoch keine Einschränkungen für deren entsprechenden Wert in dem Paar)

Schritt 1:

iterieren all einmal Elemente in der Liste: O (n)

  • Für jedes Element in der Liste zu sehen ist, zu überprüfen, um zu sehen, ob es in der HashMap ist bereits O (1), abgeschrieben
    • Wenn nicht, fügen Sie es dem HashMap mit dem Wert des Elements in der Liste als Schlüssel, und die Anzahl der Sie diesen Wert gesehen haben, soweit die VALUE O (1)
    • Wenn ja, haben die Anzahl der Male erhöhen Sie diese Taste so weit O (1)

Schritt 2 gesehen:

Iterieren durch die HashMap und zählen die Schlüssel mit Wert gleich genau 1 (also unique) O (n)

Analyse:

  • Laufzeit: O (n), amortisiert
  • Raum: O (U), wobei U die Anzahl der verschiedenen Werte ist.

Wenn suchen Sie „distinct“ Werte jedoch (wie in, wenn Sie wollen, zählen, wie viele verschiedenen Elemente sind), verwenden Sie einen HashSet anstelle einer HashMap/Hash Tabelle und dann einfach die Größe des HashSet abfragen.

+0

So finden Sie eine Anzahl eindeutiger Werte in der Liste und die Frage besteht darin, eine Anzahl verschiedener Werte zu finden. Um bestimmte Werte zu zählen, verwenden Sie [HashSet] (http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html). Fügen Sie einfach alle Elemente der Liste zum HashSet hinzu und überprüfen Sie deren Kardinalität. – user1871166

+1

Möchten Sie nicht ALLE Werte in der HashMap in Schritt 2 zählen und nicht nur die mit dem Wert 1? Auf diese Weise würden nur die Elemente gezählt, die genau einmal vorkommen, z. Die Liste {PAT, PAT, STEVE, JOEL} würde den Wert 2 ergeben (nur STEVE und JOEL treten einmal auf) und nicht den korrekten Wert von 3 verschiedenen Namen. – Jason

+0

Hinweis! Es gibt hier eine Interpretation Diskrepanz: Meine Annahme ist, dass, wenn Sie einen bestimmten Wert 2 oder öfter sehen, ist es nicht mehr "distinct"/"unique" - aber ich werde das bearbeiten, um klarer zu sein. –

0

Sie können this extremely cool O(n)-time and O(1)-space in-place algorithm zum Entfernen von Duplikaten anpassen, um bestimmte Werte zu zählen - zählen Sie einfach die Anzahl der Werte, die dem Sentinel-Wert entsprechen, in einem abschließenden O (n) -Pass und subtrahieren Sie diesen von der Größe der Liste.

0

Fügen Sie jedes Element der Liste zu einem HashSet hinzu und überprüfen Sie dann die size (Kardinalität) des HashSet, die die Anzahl der verschiedenen Werte in der Liste ist.

Verwandte Themen