mirror of
https://github.com/krahets/hello-algo.git
synced 2026-09-19 21:17:15 +00:00
First version.
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
# Стратегия оптимизации с использованием хеширования
|
||||
|
||||
В задачах по алгоритмам **мы часто снижаем временную сложность алгоритма, заменяя линейный поиск на хеш-поиск**. Давайте углубим понимание на примере алгоритмической задачи.
|
||||
|
||||
!!! question
|
||||
|
||||
Дан массив целых чисел `nums` и целевой элемент `target`. Необходимо найти в массиве два элемента, "сумма" которых равна `target`, и вернуть их индексы в массиве. Можно вернуть любое решение.
|
||||
|
||||
## Линейный поиск: обмен времени на пространство
|
||||
|
||||
Рассмотрим прямой перебор всех возможных комбинаций. Как показано на рисунке ниже, мы запускаем двойной цикл, на каждой итерации проверяя, равна ли сумма двух целых чисел `target`, и если да, возвращаем их индексы.
|
||||
|
||||

|
||||
|
||||
Код выглядит следующим образом:
|
||||
|
||||
```src
|
||||
[file]{two_sum}-[class]{}-[func]{two_sum_brute_force}
|
||||
```
|
||||
|
||||
Временная сложность этого метода составляет $O(n^2)$, пространственная сложность -- $O(1)$. При больших объемах данных это очень затратно по времени.
|
||||
|
||||
## Хеш-поиск: обмен пространства на время
|
||||
|
||||
Рассмотрим использование хеш-таблицы, где ключами и значениями будут элементы массива и их индексы соответственно. Проходим по массиву в цикле, на каждой итерации выполняя шаги, показанные на рисунке ниже.
|
||||
|
||||
1. Проверяем, находится ли число `target - nums[i]` в хеш-таблице. Если да, сразу возвращаем индексы этих двух элементов.
|
||||
2. Добавляем в хеш-таблицу пару ключ-значение: `nums[i]` и индекс `i`.
|
||||
|
||||
=== "<1>"
|
||||

|
||||
|
||||
=== "<2>"
|
||||

|
||||
|
||||
=== "<3>"
|
||||

|
||||
|
||||
Реализация кода приведена ниже, требуется только один цикл:
|
||||
|
||||
```src
|
||||
[file]{two_sum}-[class]{}-[func]{two_sum_hash_table}
|
||||
```
|
||||
|
||||
Этот метод с помощью хеш-поиска снижает временную сложность с $O(n^2)$ до $O(n)$, значительно повышая эффективность выполнения.
|
||||
|
||||
Поскольку необходимо поддерживать дополнительную хеш-таблицу, пространственная сложность составляет $O(n)$. **Несмотря на это, данный метод обеспечивает более сбалансированную общую эффективность по времени и пространству, поэтому он является оптимальным решением для этой задачи**.
|
||||
Reference in New Issue
Block a user