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



