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

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

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

Ответы

Ответ 1

    • A HashSet содержит набор объектов, но позволяет легко и быстро определить, находится ли объект уже в наборе или нет. Он делает это, внутренне управляя массивом и сохраняя объект, используя индекс, который вычисляется из хэш-кода объекта. Посмотрите здесь

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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