2009-03-05 19 views
7

Tengo problemas para contar los valores únicos de una matriz, y tengo que hacerlo sin la reordenación de los elementos de la matriz.¿Cómo puedo contar los números únicos en una matriz sin reorganizar los elementos de la matriz?

¿Cómo puedo lograr esto?

+1

es esta tarea? –

+0

que él un poco; P .... – jarus

+0

No hay nada malo con la tarea ... Siempre y cuando uno no sólo toma las respuestas como son. (es decir, toma la respuesta y hazla * mejor *). – Arafangion

Respuesta

15

Si tiene .NET 3.5 se puede lograr fácilmente esto con LINQ a través de:

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

no 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

Si esta es una pregunta de tarea, entonces la respuesta no es conseguir muchos puntos, pero sigue siendo una buena respuesta en términos de linq. – andleer

+0

@Andrew Se agregó un ejemplo de tareas que no son LINQ. –

+0

El ejemplo que no es linq es realmente malo, pero dejemos que Rich B proponga una mejor solución si es una pregunta de tarea. :) (SUGERENCIA: ¿Cómo evitaría tener que iterar sobre toda la matriz para cada elemento?) – Arafangion

6

Esta es una aplicación mucho más eficiente no LINQ.

 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

¿Por qué en lugar de ? – sharptooth

+0

En cuanto al rendimiento, ambos deberían ser idénticos, lo limpiarán para usar HashSet, por lo que este código de demostración se ve menos feo –

+0

El diccionario que contiene debe ser mucho más rápido en las matrices grandes que contiene la Lista. –

0

se deben contar sólo los valores distintos o debería cada número en la matriz pueden contar (por ejemplo, "número 5 se contiene 3 veces")?

El segundo requisito se puede cumplir con los pasos de partida del algoritmo de recuento tipo.
que sería algo como esto:

  • construir un conjunto en el que el/clave de índice es el elemento a ser contados
  • una llave está conectada a una variable que contiene el número de ocurrencias de la llave elemento
  • iterar la matriz
    • valor de incremento de la clave (array [index])

Regards

1

uso de O (n) el tiempo de funcionamiento de memoria MAX_VALUE

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