Что такое множество?

Что такое множество?
В этом уроке ты
  • Узнаешь, что такое множество.
  • Научишься использовать его в своём языке программирования.
  • Решишь задачу с использованием множества.
Знакомство с множеством

Множество (хеш-сет) — это одна из ключевых структур данных, которая используется для хранения уникальных элементов без соблюдения их порядка.

Как ты узнал из предыдущей лекции, хеш-таблица хранит пары "ключ — значение", тогда как множество содержит только уникальные ключи без значений. Это позволяет экономить память в задачах, где нужно хранить только ключи.

Множество в твоём языке программирования
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        HashSet<int> hashSet = new HashSet<int>();

        // Вставка
        hashSet.Add(1);

        // Проверка наличия
        Console.WriteLine(hashSet.Contains(1)); // true

        // Удаление
        hashSet.Remove(1);

        // Узнать размер
        Console.WriteLine(hashSet.Count);
    }
}
Задача на поиск повторяющихся элементов

Подобная задача может встретиться не только на собеседовании, но и в реальной работе. Каждый разработчик должен знать, как быстро и эффективно находить совпадающие элементы. Давай разберемся!

Условие

Дан массив целых чисел nums. Надо вернуть true, если массив содержит повторяющиеся элементы и false, если нет.  

Пример 1
Ввод: nums = [1,3,5,2,5]
Вывод: true
Объяснение: элемент 5 встречается два раза
Пример 2
Ввод: nums = [3,5,7,9]
Вывод: false
Объяснение: все элементы уникальны
Решение с использованием хеш-таблицы

При решении с использованием хеш-таблицы значение элемента из массива используется в качестве ключа, а в качестве значения записывается true, как индикатор того, что данный элемент ранее встречался.  

//Время: O(n), где n — размер входного массива.
//Память: O(n), где n — размер входного массива.
function containsDuplicate(nums) {
    // Создаем хеш-таблицу
    const used = {};
    for (let num of nums) {
        // Проверяем наличие в хеш-таблице
        if (num in used) {
            return true;
        }
        // Добавляем элемент в хеш-таблицу
        used[num] = true;
    }
    return false;
}

Такое решение абсолютно верное, но расходует чуть больше памяти, потому что нам надо хранить и ключ, и значение. Поэтому в таких случаях лучше использовать множество.

Решение с использованием множества
using System;
using System.Collections.Generic;

class Solution
{
    public bool ContainsDuplicate(int[] nums)
    {
        // Создаем множество
        HashSet<int> used = new HashSet<int>();
        
        foreach (int num in nums)
        {
            // Проверяем наличие в множестве
            if (used.Contains(num))
            {
                return true;
            }
            // Добавляем элемент в множество
            used.Add(num);
        }
        
        return false;
    }
}
Какое решение лучше?

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

Заключение

На этой лекции мы познакомились с множеством, изучили принцип его работы и решили задачу. Теперь приступай к практической части, чтобы закрепить свои знания!