Files
hello-algo/ru/docs/chapter_searching/replace_linear_by_hashing.md
2026-01-20 15:08:42 +08:00

3.7 KiB
Raw Blame History

Стратегия оптимизации с использованием хеширования

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

!!! question

Дан массив целых чисел `nums` и целевой элемент `target`. Необходимо найти в массиве два элемента, "сумма" которых равна `target`, и вернуть их индексы в массиве. Можно вернуть любое решение.

Линейный поиск: обмен времени на пространство

Рассмотрим прямой перебор всех возможных комбинаций. Как показано на рисунке ниже, мы запускаем двойной цикл, на каждой итерации проверяя, равна ли сумма двух целых чисел target, и если да, возвращаем их индексы.

Линейный поиск для решения задачи о двух суммах

Код выглядит следующим образом:

[file]{two_sum}-[class]{}-[func]{two_sum_brute_force}

Временная сложность этого метода составляет O(n^2), пространственная сложность -- O(1). При больших объемах данных это очень затратно по времени.

Хеш-поиск: обмен пространства на время

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

  1. Проверяем, находится ли число target - nums[i] в хеш-таблице. Если да, сразу возвращаем индексы этих двух элементов.
  2. Добавляем в хеш-таблицу пару ключ-значение: nums[i] и индекс i.

=== "<1>" Вспомогательная хеш-таблица для решения задачи о двух суммах

=== "<2>" two_sum_hashtable_step2

=== "<3>" two_sum_hashtable_step3

Реализация кода приведена ниже, требуется только один цикл:

[file]{two_sum}-[class]{}-[func]{two_sum_hash_table}

Этот метод с помощью хеш-поиска снижает временную сложность с O(n^2) до O(n), значительно повышая эффективность выполнения.

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