HashSet Struktura danych C # HashSet została wprowadzona w .NET Framework 3.5. Pełna lista zaimplementowanych elementów znajduje się na stronie MSDN HashSet .
- Gdzie jest używany?
- Dlaczego chcesz tego używać?
HashSet Struktura danych C # HashSet została wprowadzona w .NET Framework 3.5. Pełna lista zaimplementowanych elementów znajduje się na stronie MSDN HashSet .
Odpowiedzi:
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. Odbywa się to poprzez wewnętrzne zarządzanie tablicą i przechowywanie obiektu za pomocą indeksu obliczanego na podstawie kodu skrótu obiektu. Spójrz tutaj
HashSet
to nieuporządkowana kolekcja zawierająca unikalne elementy. Ma standardowe operacje gromadzenia: Dodaj, Usuń, Zawiera, ale ponieważ używa implementacji opartej na haszowaniu, te operacje to O (1). (W przeciwieństwie na przykład do Listy, która jest O (n) dla Zawartości i Usuń.) HashSet
Zapewnia również standardowe operacje ustawiania, takie jak suma , przecięcie i różnica symetryczna . Spójrz tutaj
Istnieją różne implementacje zestawów. Niektóre sprawiają, że operacje wstawiania i wyszukiwania są super szybkie dzięki elementom mieszającym. Oznacza to jednak, że kolejność dodawania elementów została utracona. Inne implementacje pozwalają zachować dodatkową kolejność kosztem dłuższego czasu działania.
HashSet
Klasy w języku C # idzie za pierwszym podejściem, a tym samym nie zachowując kolejność elementów. Jest znacznie szybszy niż zwykły List
. Niektóre podstawowe testy porównawcze wykazały, że HashSet jest przyzwoicie szybszy w przypadku typów podstawowych (int, double, bool itp.). Jest znacznie szybszy podczas pracy z obiektami klasy. Chodzi o to, że HashSet jest szybki.
Jedynym haczykiem HashSet
jest to, że indeksy nie mają dostępu. Aby uzyskać dostęp do elementów, możesz użyć modułu wyliczającego lub użyć wbudowanej funkcji, aby przekonwertować HashSet
plik na List
i iterować przez to. Spójrz tutaj
HashSet
Ma strukturę wewnętrzną (hash), gdzie elementy mogą być wyszukiwane i identyfikowane szybko. Minusem jest to, że iteracja po HashSet
(lub uzyskiwanie elementu według indeksu) jest raczej powolna.
Dlaczego więc ktoś chciałby wiedzieć, czy pozycja istnieje już w zestawie?
Jedną z sytuacji, w których HashSet
użyteczne jest a, jest uzyskanie odrębnych wartości z listy, na której mogą istnieć duplikaty. Po dodaniu elementu HashSet
można szybko ustalić, czy element istnieje ( Contains
operator).
Inne zalety HashSet
to operacje Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Jeśli znasz język ograniczeń obiektowych , rozpoznasz te ustawione operacje. Zobaczysz również, że jest to krok bliżej implementacji wykonywalnego UML.
Mówiąc prosto i bez ujawniania tajemnic kuchni:
zestaw ogólnie, to kolekcja, która nie zawiera zduplikowanych elementów i której elementy nie są ułożone w określonej kolejności. Tak więc A HashSet<T>
jest podobny do ogólnego List<T>
, ale jest zoptymalizowany do szybkiego wyszukiwania (za pomocą skrótów, jak sama nazwa wskazuje) kosztem utraty zamówienia.
Z perspektywy aplikacji, jeśli trzeba tylko unikać duplikatów, to HashSet
jest to, czego szukasz, ponieważ złożoność wyszukiwania, wstawiania i usuwania jest stała O (1) - stała . Co to znaczy, że nie ma znaczenia, ile elementów HashSet
ma to tyle samo czasu, aby sprawdzić, czy jest taki element, czy nie, a ponadto, ponieważ wstawiasz elementy również w O (1), to czyni go idealnym do tego rodzaju rzeczy.