Определите: что такое HashSet? - PullRequest
       6

Определите: что такое HashSet?

398 голосов
/ 30 декабря 2010

HashSet Структура данных C # HashSet была представлена ​​в .NET Framework 3.5.Полный список реализованных членов можно найти на странице HashSet MSDN .

Где это используется? Почему вы хотите его использовать?

Ответы [ 4 ]

591 голосов
/ 30 декабря 2010
    1. A HashSet содержит набор объектов, но таким образом, что позволяет легко и быстро определить, находится ли объект в наборе или нет. Это достигается за счет внутреннего управления массивом и сохранения объекта с использованием индекса, который вычисляется из хеш-кода объекта. Взгляните сюда

    2. HashSet - неупорядоченная коллекция, содержащая уникальные элементы. Он имеет стандартные операции сбора Add, Remove, Contains, но, поскольку он использует реализацию на основе хеша, эти операции являются O (1). (В отличие от List, например, O (n) для Contains и Remove.) HashSet также предоставляет стандартные операции над множествами, такие как union , пересечение и симметричная разница . Взгляните сюда

  1. Существуют разные реализации множеств. Некоторые делают операции вставки и поиска очень быстрыми за счет хэширования элементов. Однако это означает, что порядок, в котором были добавлены элементы, теряется. Другие реализации сохраняют добавленный порядок за счет более медленного времени выполнения.

Класс HashSet в C # используется для первого подхода, поэтому не сохраняет порядок элементов. Это намного быстрее, чем обычный List. Некоторые базовые тесты показали, что HashSet работает быстрее при работе с основными типами (int, double, bool и т. Д.). Это намного быстрее при работе с объектами класса. Итак, суть в том, что HashSet работает быстро.

Единственный улов HashSet в том, что нет доступа по индексам. Чтобы получить доступ к элементам, вы можете использовать перечислитель или встроенную функцию для преобразования HashSet в List и итерации по нему. Посмотрите здесь

11 голосов
/ 30 декабря 2010

A HashSet имеет внутреннюю структуру (хэш), где элементы можно быстро найти и идентифицировать. Недостатком является то, что итерация по HashSet (или получение элемента по индексу) довольно медленная.

Так почему кто-то хочет знать, существует ли запись в наборе?

Одна из ситуаций, когда HashSet полезна, - получение различных значений из списка, в котором могут существовать дубликаты. После добавления элемента в HashSet можно быстро определить, существует ли элемент (оператор Contains).

Другими преимуществами HashSet являются операции Set: IntersectWith, IsSubsetOf, IsSupersetOf, Overlaps, SymmetricExceptWith, UnionWith.

Если вы знакомы с языком ограничения объектов , тогда вы определите эти операции над множествами. Вы также увидите, что это на один шаг ближе к реализации исполняемого UML.

6 голосов
/ 07 ноября 2016

Проще говоря и не раскрывая кухонных секретов: набор в общем случае - это коллекция, которая не содержит повторяющихся элементов и элементы которой не имеют определенного порядка. Таким образом, A HashSet<T> аналогичен универсальному List<T>, но оптимизирован для быстрого поиска (с помощью хеш-таблиц, как следует из названия) за счет потери порядка.

2 голосов
/ 07 июля 2015

С точки зрения приложения, если нужно только избежать дубликатов, то HashSet - это то, что вы ищете, так как сложности поиска, вставки и удаления равны O (1) - постоянная .Что это означает, что не имеет значения, сколько элементов HashSet имеет, потребуется столько же времени, чтобы проверить, есть ли такой элемент или нет, плюс, поскольку вы вставляете элементы в O (1), это делает его идеальным для такого родавещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...