mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-09 10:30:59 +00:00
deploy
This commit is contained in:
@@ -3202,7 +3202,7 @@
|
||||
<a href="#1" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
1. Реализация двоичного поиска на основе "разделяй и властвуй"
|
||||
1. Реализация двоичного поиска на основе «разделяй и властвуй»
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -4290,7 +4290,7 @@
|
||||
<a href="#1" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
1. Реализация двоичного поиска на основе "разделяй и властвуй"
|
||||
1. Реализация двоичного поиска на основе «разделяй и властвуй»
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -4340,32 +4340,32 @@
|
||||
<li><strong>Полный перебор</strong>: реализуется через обход структуры данных, временная сложность равна <span class="arithmatex">\(O(n)\)</span> .</li>
|
||||
<li><strong>Адаптивный поиск</strong>: использует особую организацию данных или априорную информацию, временная сложность может достигать <span class="arithmatex">\(O(\log n)\)</span> и даже <span class="arithmatex">\(O(1)\)</span> .</li>
|
||||
</ul>
|
||||
<p>На практике <strong>алгоритмы поиска с временной сложностью <span class="arithmatex">\(O(\log n)\)</span> обычно реализуются на основе стратегии "разделяй и властвуй"</strong>, например двоичный поиск и деревья.</p>
|
||||
<p>На практике <strong>алгоритмы поиска с временной сложностью <span class="arithmatex">\(O(\log n)\)</span> обычно реализуются на основе стратегии «разделяй и властвуй»</strong>, например двоичный поиск и деревья.</p>
|
||||
<ul>
|
||||
<li>На каждом шаге двоичный поиск раскладывает задачу (поиск целевого элемента в массиве) на более мелкую задачу (поиск целевого элемента в одной половине массива), и этот процесс продолжается, пока массив не станет пустым или пока не будет найден целевой элемент.</li>
|
||||
<li>Деревья являются типичными представителями идей "разделяй и властвуй"; в таких структурах данных, как двоичное дерево поиска, AVL-дерево и куча, временная сложность различных операций равна <span class="arithmatex">\(O(\log n)\)</span> .</li>
|
||||
<li>Деревья являются типичными представителями идей «разделяй и властвуй». В таких структурах данных, как двоичное дерево поиска, AVL-дерево и куча, временная сложность различных операций равна <span class="arithmatex">\(O(\log n)\)</span> .</li>
|
||||
</ul>
|
||||
<p>Стратегия "разделяй и властвуй" для двоичного поиска выглядит следующим образом.</p>
|
||||
<p>Стратегия «разделяй и властвуй» для двоичного поиска выглядит следующим образом.</p>
|
||||
<ul>
|
||||
<li><strong>Задача раскладывается на части</strong>: двоичный поиск рекурсивно разбивает исходную задачу (поиск в массиве) на подзадачу (поиск в одной половине массива), и это достигается сравнением среднего элемента с целевым значением.</li>
|
||||
<li><strong>Подзадачи независимы</strong>: в двоичном поиске на каждом шаге обрабатывается только одна подзадача, и она не зависит от других подзадач.</li>
|
||||
<li><strong>Решения подзадач не нужно объединять</strong>: двоичный поиск нацелен на поиск конкретного элемента, поэтому объединять решения подзадач не требуется. Как только подзадача решена, одновременно считается решенной и исходная задача.</li>
|
||||
</ul>
|
||||
<p>Иными словами, стратегия "разделяй и властвуй" повышает эффективность поиска потому, что при полном переборе за один шаг удается исключить только один вариант, <strong>тогда как при поиске на основе "разделяй и властвуй" за один шаг можно исключить половину вариантов</strong>.</p>
|
||||
<h3 id="1">1. Реализация двоичного поиска на основе "разделяй и властвуй"<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<p>В предыдущих главах двоичный поиск реализовывался через итерацию. Теперь реализуем его с помощью стратегии "разделяй и властвуй", то есть через рекурсию.</p>
|
||||
<p>Иными словами, стратегия «разделяй и властвуй» повышает эффективность поиска потому, что при полном переборе за один шаг удается исключить только один вариант, <strong>тогда как при поиске на основе «разделяй и властвуй» за один шаг можно исключить половину вариантов</strong>.</p>
|
||||
<h3 id="1">1. Реализация двоичного поиска на основе «разделяй и властвуй»<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<p>В предыдущих главах двоичный поиск реализовывался через итерацию. Теперь реализуем его с помощью стратегии «разделяй и властвуй», то есть через рекурсию.</p>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">Question</p>
|
||||
<p>Дан отсортированный массив <code>nums</code> длины <span class="arithmatex">\(n\)</span> , в котором все элементы уникальны. Найдите элемент <code>target</code> .</p>
|
||||
</div>
|
||||
<p>С точки зрения стратегии "разделяй и властвуй" обозначим подзадачу, соответствующую интервалу поиска <span class="arithmatex">\([i, j]\)</span> , через <span class="arithmatex">\(f(i, j)\)</span> .</p>
|
||||
<p>С точки зрения стратегии «разделяй и властвуй» обозначим подзадачу, соответствующую интервалу поиска <span class="arithmatex">\([i, j]\)</span> , через <span class="arithmatex">\(f(i, j)\)</span> .</p>
|
||||
<p>Начиная с исходной задачи <span class="arithmatex">\(f(0, n-1)\)</span> , выполняем двоичный поиск по следующим шагам.</p>
|
||||
<ol>
|
||||
<li>Вычислить середину <span class="arithmatex">\(m\)</span> интервала поиска <span class="arithmatex">\([i, j]\)</span> и с ее помощью исключить половину интервала.</li>
|
||||
<li>Рекурсивно решить подзадачу вдвое меньшего размера; это может быть либо <span class="arithmatex">\(f(i, m-1)\)</span> , либо <span class="arithmatex">\(f(m+1, j)\)</span> .</li>
|
||||
<li>Рекурсивно решить подзадачу вдвое меньшего размера. Это может быть либо <span class="arithmatex">\(f(i, m-1)\)</span> , либо <span class="arithmatex">\(f(m+1, j)\)</span> .</li>
|
||||
<li>Повторять шаг <code>1.</code> и шаг <code>2.</code> , пока не будет найден <code>target</code> или пока интервал не станет пустым.</li>
|
||||
</ol>
|
||||
<p>На рисунке 12-4 показан процесс применения стратегии "разделяй и властвуй" для поиска элемента <span class="arithmatex">\(6\)</span> в массиве.</p>
|
||||
<p>На рисунке 12-4 показан процесс применения стратегии «разделяй и властвуй» для поиска элемента <span class="arithmatex">\(6\)</span> в массиве.</p>
|
||||
<p><img alt="Процесс двоичного поиска в стиле разделяй и властвуй" class="animation-figure" src="../binary_search_recur.assets/binary_search_recur.png" /></p>
|
||||
<p align="center"> Рисунок 12-4 Процесс двоичного поиска в стиле разделяй и властвуй </p>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user