2010-12-29 24 views
362

HashSet Struktura danych C# HashSet została wprowadzona w .NET Framework 3.5. Pełną listę wdrożonych członków można znaleźć na stronie HashSet MSDN.Definiowanie: Co to jest HashSet?

  1. Gdzie jest używany?
  2. Dlaczego chcesz go użyć?
+3

http://en.wikipedia.org/wiki/Set_(computer_science) –

+2

możliwe duplikat [Gdy należy użyć typu HashSet ?] (Http://stackoverflow.com/questions/1247442/when-should -i-use-the-hashsett-type) – nawfal

+0

Używa wewnętrznie hashtable. jeśli masz dobrą implementację hashtable (na przykład Słownik ), możesz sam zaimplementować HashSet. –

Odpowiedz

532
    1. A HashSet posiada zestaw obiektów, ale w sposób, który pozwala łatwo i szybko określić, czy obiekt jest już w zestawie czy nie. Czyni to wewnętrznie zarządzając tablicą i przechowując obiekt za pomocą indeksu, który jest obliczany na podstawie kodu skrótu obiektu. Take a look here

    2. HashSet to nieuporządkowana kolekcja zawierająca unikatowe elementy. Ma standardowe operacje zbierania: Dodaj, Usuń, Zawiera, ale ponieważ używa implementacji opartej na mieszaniu, te operacje są O (1). (W przeciwieństwie do listy, na przykład, co O (n) w przypadku Zawiera i usuwanie). HashSet również standardowe operacje ustawione tak, jak związek, przecięcia i symetryczne różnice. Take a look here

  1. Istnieją różne implementacje zestawów. Niektóre z nich bardzo szybko wykonują operacje wstawiania i wyszukiwania za pomocą elementów mieszających. Oznacza to jednak, że kolejność dodawania elementów zostanie utracona. Inne implementacje zachowują dodany porządek kosztem wolniejszego czasu pracy.

Klasa C# HashSet idzie za pierwszym podejściem, co nie zachowując kolejność elementów. Jest znacznie szybszy niż zwykły List. Niektóre podstawowe testy wykazały, że HashSet jest przyzwoicie szybszy w przypadku typów podstawowych (int, double, bool itd.). Jest o wiele szybszy podczas pracy z obiektami klasy. Chodzi o to, że HashSet jest szybki.

Jedynym haczykiem HashSet jest brak dostępu według indeksów. Aby uzyskać dostęp do elementów, można użyć modułu wyliczającego lub użyć wbudowanej funkcji do przekonwertowania obiektu HashSet na wartość List i wykonać iterację. Take a look here

+12

Dwie rzeczy, hashset i podobne są .NET, a nie C#. Również HashSet nie zachowuje porządku. Spróbuj dodać i usunąć elementy z zestawu haszującego, będziesz wiedzieć, czy później powtórzysz. – nawfal

+0

wielkie proste wyjaśnienie i porównanie – Kings

8

A HashSet ma strukturę wewnętrzną (hash), w której przedmioty można szybko wyszukiwać i identyfikować. Minusem jest to, że iterowanie przez HashSet (lub uzyskanie pozycji po indeksie) jest raczej powolne.

Dlaczego więc ktoś chciałby wiedzieć, czy wpis już istnieje w zestawie?

Jedna z sytuacji, w której przydatna jest funkcja HashSet, polega na uzyskiwaniu różnych wartości z listy, w której mogą występować duplikaty. Po dodaniu elementu do HashSet można szybko sprawdzić, czy dany element istnieje (operator Contains).

Inne zalety HashSet, to zestaw operacji: IntersectWith, IsSubsetOf, IsSupersetOf, Overlaps, SymmetricExceptWith, UnionWith.

Jeśli znasz numer object constraint language, zidentyfikujesz te ustawienia. Zobaczysz także, że jest o krok bliżej implementacji wykonywanego UML.

+14

Re: minus. Nie, iteracja za pomocą HashSet jest całkowicie szybka. Po drugie, nie można uzyskać pozycji po indeksie. W rzeczywistości elementy są przechowywane nieuporządkowane. –

+0

@Nigel Touch. Iterowanie jest szybkie, jeśli nie interesuje Cię indeks (kolejność, w jakiej zostały dodane). Jednakże, jeśli obawiasz się o indeks, to indeks musi być przechowywany z każdym hash-kluczem, a zatem może być raczej powolny, ponieważ lista musi być przeszukiwana wyczerpująco, aby odzyskać prawidłowy element. To zachowanie różni się znacznie od listy, w której elementy są indeksowane według kolejności, w jakiej są dodawane. –

+0

To ma sens, dlaczego byłaby szybka, ponieważ żadne dwa hash nie są takie same. Włączenie zapytania w celu skorzystania z podejścia "zwarciowego", które szybko wyklucza pewne kryteria. –

1

Z perspektywy aplikacji, jeśli trzeba tylko uniknąć duplikatów, to szukamy HashSet, ponieważ jest to Wyszukiwanie, wstawianie i usuwanie complexities are O(1) - constant. Co to oznacza, że ​​nie ma znaczenia, ile elementów ma być HashSet zajmie tyle samo czasu, aby sprawdzić, czy istnieje taki element, czy też nie, a także ponieważ wstawiasz elementy w O (1) też czyni to idealnym dla tego rodzaju rzeczy.

5

Mówiąc prosto i bez ujawniania sekretów kuchni: zestaw w ogóle, to zbiór, który nie zawiera zduplikowane elementy, i którego elementy są w przypadkowej kolejności. Tak więc A HashSet<T> jest podobny do standardowego List<T>, ale jest zoptymalizowany do szybkiego wyszukiwania (poprzez hashtables, jak sama nazwa wskazuje) kosztem utraty zamówienia.