# Стратегия оптимизации с использованием хеширования В задачах по алгоритмам **мы часто снижаем временную сложность алгоритма, заменяя линейный поиск на хеш-поиск**. Давайте углубим понимание на примере алгоритмической задачи. !!! question Дан массив целых чисел `nums` и целевой элемент `target`. Необходимо найти в массиве два элемента, "сумма" которых равна `target`, и вернуть их индексы в массиве. Можно вернуть любое решение. ## Линейный поиск: обмен времени на пространство Рассмотрим прямой перебор всех возможных комбинаций. Как показано на рисунке ниже, мы запускаем двойной цикл, на каждой итерации проверяя, равна ли сумма двух целых чисел `target`, и если да, возвращаем их индексы. ![Линейный поиск для решения задачи о двух суммах](../assets/two_sum_brute_force.png) Код выглядит следующим образом: ```src [file]{two_sum}-[class]{}-[func]{two_sum_brute_force} ``` Временная сложность этого метода составляет $O(n^2)$, пространственная сложность -- $O(1)$. При больших объемах данных это очень затратно по времени. ## Хеш-поиск: обмен пространства на время Рассмотрим использование хеш-таблицы, где ключами и значениями будут элементы массива и их индексы соответственно. Проходим по массиву в цикле, на каждой итерации выполняя шаги, показанные на рисунке ниже. 1. Проверяем, находится ли число `target - nums[i]` в хеш-таблице. Если да, сразу возвращаем индексы этих двух элементов. 2. Добавляем в хеш-таблицу пару ключ-значение: `nums[i]` и индекс `i`. === "<1>" ![Вспомогательная хеш-таблица для решения задачи о двух суммах](../assets/two_sum_hashtable_step1.png) === "<2>" ![two_sum_hashtable_step2](../assets/two_sum_hashtable_step2.png) === "<3>" ![two_sum_hashtable_step3](../assets/two_sum_hashtable_step3.png) Реализация кода приведена ниже, требуется только один цикл: ```src [file]{two_sum}-[class]{}-[func]{two_sum_hash_table} ``` Этот метод с помощью хеш-поиска снижает временную сложность с $O(n^2)$ до $O(n)$, значительно повышая эффективность выполнения. Поскольку необходимо поддерживать дополнительную хеш-таблицу, пространственная сложность составляет $O(n)$. **Несмотря на это, данный метод обеспечивает более сбалансированную общую эффективность по времени и пространству, поэтому он является оптимальным решением для этой задачи**.