2009-03-05 9 views
7

Mam problemy z zliczaniem unikatowych wartości w tablicy i muszę to zrobić bez zmiany rozmieszczenia elementów tablicy.Jak mogę policzyć unikalne liczby w tablicy bez zmiany rozmieszczenia elementów tablicy?

Jak mogę to zrobić?

+1

to jest domowe? –

+0

on on kinda; P .... – jarus

+0

Nic złego w odrabianiu lekcji ... Pod warunkiem, że nie wystarczy wziąć odpowiedzi takimi, jakimi są. (tzn. Weź odpowiedź i spraw, aby była * lepsza *). – Arafangion

Odpowiedz

15

Jeśli masz .NET 3.5 można łatwo osiągnąć z LINQ poprzez:

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

Jeśli jest to zadanie domowe, to odpowiedź nie jest prawdopodobna, aby uzyskać mu wiele punktów, ale nadal dobrą odpowiedź pod względem linq. – andleer

+0

@Andrew Dodano przykład pracy domowej bez LINQ. –

+0

Przykład inny niż linq jest naprawdę zły, ale pozwólmy Richowi wymyślić lepsze rozwiązanie, jeśli rzeczywiście jest to zadanie domowe. :) (WSKAZÓWKA: Jak można uniknąć konieczności powtarzania całej tablicy dla każdego elementu?) – Arafangion

6

To jest o wiele bardziej efektywne wdrożenie non 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

Dlaczego zamiast ? – sharptooth

+0

Pod względem wydajności powinny być identyczne, czyszczone, aby używać HashSet, aby kod demonstracyjny wyglądał mniej brzydko. –

+0

Słownik powinien znajdować się znacznie szybciej na dużych tablicach niż lista zawiera. –

0

Czy należy liczyć tylko różne wartości lub czy należy liczyć każdą liczbę w tablicy (np. "Numer 5 zawiera 3 razy")?

Drugie wymaganie można spełnić, rozpoczynając kroki algorytmu sortowania zliczania.
To byłoby coś takiego:

  • budować zestaw gdzie indeks/klucz jest element należy zaliczyć
  • kluczowym jest podłączony do zmiennej, która przechowuje liczbę wystąpień klucza Element
  • iteracyjne Array (tablica [indeks])
  • wartość przyrostu klucza

Chodzi

1

wykorzystanie O (n), czas trwania pamięci MAX_VALUE

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