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

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

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

5 ответов

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

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

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

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

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

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

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

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

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

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

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

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

HashSetэто какlistно не позволяет добавлять повторяющиеся элементы. Он используется, когда вы хотите иметь список с уникальными элементами.

пример:

      HashSet<int> HS = new HashSet<int>();
HS.Add(1);
HS.Add(2);
HS.Add(3);
HS.Add(1);
HS.Add(2);

foreach(int item in HS)
    Console.WriteLine(item); 

результат:

      1    
2    
3
Другие вопросы по тегам