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?
- Gdzie jest używany?
- Dlaczego chcesz go użyć?
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?
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
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
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
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.
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. –
@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. –
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. –
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.
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.
http://en.wikipedia.org/wiki/Set_(computer_science) –
możliwe duplikat [Gdy należy użyć typu HashSet?] (Http://stackoverflow.com/questions/1247442/when-should -i-use-the-hashsett-type) –
nawfal
Używa wewnętrznie hashtable. jeśli masz dobrą implementację hashtable (na przykład Słownik), możesz sam zaimplementować HashSet. –