2012-12-13 13 views

Odpowiedz

7

Aktualizacja: - wyraźny w porównaniu z unikalnym


Jeśli szukasz „unikalne” wartości (jak na razie widać element „Jason” więcej niż raz, to nie jest ponad już wyjątkowy i nie powinny być liczone)

można to zrobić w czasie liniowym przy użyciu HashMap;)

(uogólnione/language-agnostyk pomysł jest Hash table)

Każdy wpis HashMap/stołu mieszania jest <KEY, VALUE> pary, gdzie klucze są unikatowe (ale bez ograniczenia odpowiadających im wartości w para)

Etap 1:

iterację wszystkich elementy na liście kiedyś: o (n)

  • dla każdego elementu widoczne na liście, należy sprawdzić, czy to w HashMap już O (1), amortyzowane
    • Jeśli nie, dodaj go do HashMap z wartością elementu w liście jako klucz, a ile razy widziałeś tę wartość tak pod względem wartości o (1)
    • Jeśli tak, zwiększamy liczbę razy widziałem ten klucz dotychczas o (1)

Krok 2:

iterację HashMap i policzyć klawisze o wartości równej dokładnie 1 (w ten sposób wyjątkowe) O (n)

Analiza:

  • Czas: O (n), amortyzowane
  • Przestrzeń: O (U), gdzie U to liczba odrębnych wartości.

Jeśli jednak szukasz „odrębne” wartości (jak w jeśli chcesz policzyć ile różne elementy istnieją), użyj HashSet zamiast HashMap/Hash tabela, a następnie po prostu zapytaj o rozmiar HashSet.

+0

Oto jak znaleźć szereg unikalnych wartości na liście, a pytanie dotyczy znalezienia pewnej liczby różnych wartości. Aby policzyć różne wartości, użyj [HashSet] (http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html). Po prostu dodaj każdy element listy do HashSet i sprawdź jego liczność. – user1871166

+1

Czy nie chcesz policzyć WSZYSTKICH wartości w HashMap w kroku 2, a nie tylko tych o wartości 1? Wykonanie tego w ten sposób policzy tylko te elementy, które pojawią się dokładnie raz, np. lista {PAT, PAT, STEVE, JOEL} dałaby wartość 2 (tylko STEVE i JOEL występują raz) zamiast poprawnej wartości 3 różnych nazw. – Jason

+0

Uwaga! Istnieje tu rozbieżność interpretacyjna: zakładam, że jeśli widzisz określoną wartość 2 lub więcej razy, nie jest ona już "wyraźna"/"unikalna" - ale będę ją edytować, aby była bardziej przejrzysta. –

0

Dodaj każdy element listy do HashSet, a następnie sprawdź size (liczność) w HashSet, który jest liczbą różnych wartości na liście.

Powiązane problemy