First version.

This commit is contained in:
krahets
2026-01-20 15:08:42 +08:00
parent 2213a59ff6
commit 8071daddaa
106 changed files with 11790 additions and 0 deletions
@@ -0,0 +1,47 @@
# Стратегия оптимизации с использованием хеширования
В задачах по алгоритмам **мы часто снижаем временную сложность алгоритма, заменяя линейный поиск на хеш-поиск**. Давайте углубим понимание на примере алгоритмической задачи.
!!! 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)$. **Несмотря на это, данный метод обеспечивает более сбалансированную общую эффективность по времени и пространству, поэтому он является оптимальным решением для этой задачи**.