2009-03-05 8 views
7

Ho problemi nel conteggio dei valori univoci in un array e ho bisogno di farlo senza riorganizzare gli elementi dell'array.Come posso contare i numeri univoci in un array senza riorganizzare gli elementi dell'array?

Come posso realizzare questo?

+1

è questo compito? –

+0

he he kinda; P .... – jarus

+0

Niente di sbagliato con i compiti ... A condizione che uno non prenda solo le risposte come sono. (ad esempio, prendi la risposta e rendila * migliore *). – Arafangion

risposta

15

Se si dispone di .NET 3.5 si può facilmente raggiungere questo obiettivo con LINQ tramite:

int numberOfElements = myArray.Distinct().Count(); 

non LINQ:

List<int> uniqueValues = new List<int>(); 
for(int i = 0; i < myArray.Length; ++i) 
{ 
    if(!uniqueValues.Contains(myArray[i])) 
     uniqueValues.Add(myArray[i]); 
} 
int numberOfElements = uniqueValues.Count; 
+0

Se questa è una domanda per i compiti a casa, la risposta non è la stessa per ottenere molti punti ma una buona risposta in termini di linq. – andleer

+0

@Andrew Aggiunto un esempio di lavoro non LINQ. –

+0

L'esempio di non-linq è davvero pessimo, ma lascia che Rich B trovi una soluzione migliore se è davvero una domanda sui compiti. :) (SUGGERIMENTO: come evitare di dover eseguire un'iterazione sull'intera matrice per ciascun articolo?) – Arafangion

6

Questa è un'implementazione non LINQ molto più efficiente.

 var array = new int[] { 1, 2, 3, 3, 3, 4 }; 
     // .Net 3.0 - use Dictionary<int, bool> 
     // .Net 1.1 - use Hashtable 
     var set = new HashSet<int>(); 
     foreach (var item in array) { 
      if (!set.Contains(item)) set.Add(item); 
     } 
     Console.WriteLine("There are {0} distinct values. ", set.Count); 
+0

Perché anziché ? – sharptooth

+0

Le prestazioni dovrebbero essere identiche, lo puliscono per usare HashSet, quindi questo codice demo sembra meno brutto –

+0

Il dizionario contiene dovrebbe essere molto più veloce su array di grandi dimensioni di quanto non contenga l'Elenco. –

0

caso solo i valori distinti essere imputate o dovrebbe ciascun numero nell'array essere contati (ad esempio "numero 5 è contenuto 3 volte")?

Il secondo requisito può essere soddisfatto con le fasi iniziali dell'algoritmo di calcolo del conteggio.
Sarebbe qualcosa di simile:

  • costruire un insieme in cui il/chiave dell'indice è l'elemento da contare
  • una chiave è collegata ad una variabile che rappresenta il numero di occorrenze della chiave elemento
  • iterare matrice
    • valore di incremento di chiave (array [index])

saluti

1

utilizzo O (n) in esecuzione tempo di memoria MAX_VALUE

boolean[] data = new boolean[maxValue]; 
for (int n : list) { 
    if (data[n]) counter++ 
    else data[n] = true; 
}