2012-12-13 9 views

risposta

7

Aggiornamento: - distinta vs. unica


Se siete alla ricerca di "unici" valori (come se si vede un elemento di "Jason" più di una volta, che non è più unico e non devono essere conteggiati)

che si può fare in un tempo lineare utilizzando un HashMap;)

(La generalizzata/lingua-agnostic idea è Hash table)

Ciascuna voce di un HashMap tavolo/Hash è <KEY, VALUE> coppia in cui le chiavi sono unici (ma restrizioni al loro corrispondente valore della coppia)

Fase 1:

scorrere tutti elementi nell'elenco volta: O (n)

  • per ogni elemento nell'elenco visto, verificare se è nella HashMap già O (1), ammortizzata
    • In caso contrario, aggiungerlo alla HashMap con il valore dell'elemento della lista come chiave, e il numero di volte che hai visto questo valore per quanto riguarda la VALORE O (1)
    • Se è così, incrementare il numero di volte che hai visto questa chiave finora O (1)

Step2:

Scorrere HashMap e contare le chiavi con valore pari esattamente 1 (quindi unici) O (n)

Analysis:

  • Durata: O (n), ammortizzato
  • Spazio: O (U), dove U è il numero di valori distinti.

Se, invece, siete alla ricerca di "distinti" valori (Come se si vuole contare quanti diversi elementi ci sono), utilizzare un HashSet invece di una HashMap/Hash tabella, quindi interrogare semplicemente la dimensione di HashSet.

+0

Ecco come trovare un numero di valori univoci nell'elenco e la domanda riguarda il rilevamento di un numero di valori distinti. Per contare valori distinti utilizzare [HashSet] (http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html). Basta aggiungere ogni elemento della lista all'HashSet e controllarne la cardinalità. – user1871166

+1

Non vorreste contare TUTTI i valori in HashMap nel passo 2, piuttosto che quelli con valore 1? Facendolo in questo modo conterei solo gli elementi che appaiono esattamente una volta, ad es. l'elenco {PAT, PAT, STEVE, JOEL} risulterebbe in un valore di 2 (solo STEVE e JOEL si verificano una volta) anziché il valore corretto di 3 nomi distinti. – Jason

+0

Nota! C'è una discrepanza di interpretazione qui: la mia ipotesi è che se vedi un particolare valore 2 o più volte, non è più "distinto"/"unico" - ma lo modificherò per essere più chiaro. –

0

Aggiungere ogni elemento dell'elenco a HashSet e quindi controllare lo size (cardinalità) di HashSet, che è il numero di valori distinti nell'elenco.

Problemi correlati