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 tutajHashSet
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 tutajIstnieją 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łyList
. 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 naList
i iterować przez to. Spójrz tutajźródło
HashSet
Ma strukturę wewnętrzną (hash), gdzie elementy mogą być wyszukiwane i identyfikowane szybko. Minusem jest to, że iteracja poHashSet
(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 elementuHashSet
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.
źródło
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ólnegoList<T>
, ale jest zoptymalizowany do szybkiego wyszukiwania (za pomocą skrótów, jak sama nazwa wskazuje) kosztem utraty zamówienia.źródło
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ówHashSet
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.źródło