mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-14 20:50:58 +00:00
build
This commit is contained in:
@@ -2,35 +2,35 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 12.2 Поисковая стратегия divide and conquer
|
||||
# 12.2 Поисковая стратегия разделяй и властвуй
|
||||
|
||||
Мы уже знаем, что алгоритмы поиска делятся на две большие категории.
|
||||
|
||||
- **Полный перебор**: реализуется через обход структуры данных, временная сложность равна $O(n)$ .
|
||||
- **Адаптивный поиск**: использует особую организацию данных или априорную информацию, временная сложность может достигать $O(\log n)$ и даже $O(1)$ .
|
||||
|
||||
На практике **алгоритмы поиска с временной сложностью $O(\log n)$ обычно реализуются на основе стратегии divide and conquer**, например двоичный поиск и деревья.
|
||||
На практике **алгоритмы поиска с временной сложностью $O(\log n)$ обычно реализуются на основе стратегии "разделяй и властвуй"**, например двоичный поиск и деревья.
|
||||
|
||||
- На каждом шаге двоичный поиск раскладывает задачу (поиск целевого элемента в массиве) на более мелкую задачу (поиск целевого элемента в одной половине массива), и этот процесс продолжается, пока массив не станет пустым или пока не будет найден целевой элемент.
|
||||
- Деревья являются типичными представителями идей divide and conquer; в таких структурах данных, как двоичное дерево поиска, AVL-дерево и куча, временная сложность различных операций равна $O(\log n)$ .
|
||||
- Деревья являются типичными представителями идей "разделяй и властвуй"; в таких структурах данных, как двоичное дерево поиска, AVL-дерево и куча, временная сложность различных операций равна $O(\log n)$ .
|
||||
|
||||
Стратегия divide and conquer для двоичного поиска выглядит следующим образом.
|
||||
Стратегия "разделяй и властвуй" для двоичного поиска выглядит следующим образом.
|
||||
|
||||
- **Задача раскладывается на части**: двоичный поиск рекурсивно разбивает исходную задачу (поиск в массиве) на подзадачу (поиск в одной половине массива), и это достигается сравнением среднего элемента с целевым значением.
|
||||
- **Подзадачи независимы**: в двоичном поиске на каждом шаге обрабатывается только одна подзадача, и она не зависит от других подзадач.
|
||||
- **Решения подзадач не нужно объединять**: двоичный поиск нацелен на поиск конкретного элемента, поэтому объединять решения подзадач не требуется. Как только подзадача решена, одновременно считается решенной и исходная задача.
|
||||
|
||||
По сути divide and conquer повышает эффективность поиска потому, что при полном переборе за один шаг удается исключить только один вариант, **тогда как при поиске на основе divide and conquer за один шаг можно исключить половину вариантов**.
|
||||
Иными словами, стратегия "разделяй и властвуй" повышает эффективность поиска потому, что при полном переборе за один шаг удается исключить только один вариант, **тогда как при поиске на основе "разделяй и властвуй" за один шаг можно исключить половину вариантов**.
|
||||
|
||||
### 1. Реализация двоичного поиска на основе divide and conquer
|
||||
### 1. Реализация двоичного поиска на основе "разделяй и властвуй"
|
||||
|
||||
В предыдущих главах двоичный поиск реализовывался через итерацию. Теперь реализуем его с помощью divide and conquer, то есть через рекурсию.
|
||||
В предыдущих главах двоичный поиск реализовывался через итерацию. Теперь реализуем его с помощью стратегии "разделяй и властвуй", то есть через рекурсию.
|
||||
|
||||
!!! question
|
||||
|
||||
Дан отсортированный массив `nums` длины $n$ , в котором все элементы уникальны. Найдите элемент `target` .
|
||||
|
||||
С точки зрения divide and conquer обозначим подзадачу, соответствующую интервалу поиска $[i, j]$ , через $f(i, j)$ .
|
||||
С точки зрения стратегии "разделяй и властвуй" обозначим подзадачу, соответствующую интервалу поиска $[i, j]$ , через $f(i, j)$ .
|
||||
|
||||
Начиная с исходной задачи $f(0, n-1)$ , выполняем двоичный поиск по следующим шагам.
|
||||
|
||||
@@ -38,11 +38,11 @@ comments: true
|
||||
2. Рекурсивно решить подзадачу вдвое меньшего размера; это может быть либо $f(i, m-1)$ , либо $f(m+1, j)$ .
|
||||
3. Повторять шаг `1.` и шаг `2.` , пока не будет найден `target` или пока интервал не станет пустым.
|
||||
|
||||
На рисунке 12-4 показан процесс применения divide and conquer для поиска элемента $6$ в массиве.
|
||||
На рисунке 12-4 показан процесс применения стратегии "разделяй и властвуй" для поиска элемента $6$ в массиве.
|
||||
|
||||
{ class="animation-figure" }
|
||||
{ class="animation-figure" }
|
||||
|
||||
<p align="center"> Рисунок 12-4 Процесс двоичного поиска в стиле divide and conquer </p>
|
||||
<p align="center"> Рисунок 12-4 Процесс двоичного поиска в стиле разделяй и властвуй </p>
|
||||
|
||||
В реализации кода мы объявляем рекурсивную функцию `dfs()` для решения задачи $f(i, j)$ :
|
||||
|
||||
|
||||
Reference in New Issue
Block a user