This commit is contained in:
krahets
2026-04-14 18:06:19 +08:00
parent 17b2a0b630
commit cf0747ba3e
131 changed files with 604 additions and 609 deletions
@@ -4389,17 +4389,17 @@
<h2 id="1051">10.5.1 &nbsp; Полный перебор<a class="headerlink" href="#1051" title="Permanent link">&para;</a></h2>
<p>Полный перебор заключается в том, что мы обходим каждый элемент структуры данных, чтобы найти целевой элемент.</p>
<ul>
<li>"Линейный поиск" применяется к линейным структурам данных, таким как массивы и списки. Он начинается с одного конца структуры данных и последовательно проверяет элементы, пока не найдет целевой элемент или пока не достигнет другого конца структуры данных.</li>
<li>"Обход в ширину" и "обход в глубину" - это две стратегии обхода графов и деревьев. Обход в ширину стартует из начального узла и исследует все узлы текущего уровня, прежде чем переходить к следующему. Обход в глубину стартует из начального узла, проходит один путь до конца, затем возвращается назад и пробует другие пути, пока не будет полностью пройдена вся структура данных.</li>
<li>«Линейный поиск» применяется к линейным структурам данных, таким как массивы и списки. Он начинается с одного конца структуры данных и последовательно проверяет элементы, пока не найдет целевой элемент или пока не достигнет другого конца структуры данных.</li>
<li>«Обход в ширину» и «обход в глубину» - это две стратегии обхода графов и деревьев. Обход в ширину стартует из начального узла и исследует все узлы текущего уровня, прежде чем переходить к следующему. Обход в глубину стартует из начального узла, проходит один путь до конца, затем возвращается назад и пробует другие пути, пока не будет полностью пройдена вся структура данных.</li>
</ul>
<p>Преимущество полного перебора состоит в его простоте и универсальности, <strong>поскольку он не требует предварительной обработки данных и использования дополнительных структур данных</strong>.</p>
<p>Однако <strong>временная сложность таких алгоритмов равна <span class="arithmatex">\(O(n)\)</span></strong> , где <span class="arithmatex">\(n\)</span> - число элементов, поэтому при больших объемах данных их производительность невысока.</p>
<h2 id="1052">10.5.2 &nbsp; Адаптивный поиск<a class="headerlink" href="#1052" title="Permanent link">&para;</a></h2>
<p>Адаптивный поиск использует специфические свойства данных (например, упорядоченность), чтобы оптимизировать процесс поиска и тем самым эффективнее находить целевой элемент.</p>
<ul>
<li>"Двоичный поиск" использует упорядоченность данных для эффективного поиска и применим только к массивам.</li>
<li>"Хеш-поиск" использует хеш-таблицу для построения отображения между поисковыми данными и целевыми данными, благодаря чему запросы выполняются эффективно.</li>
<li>"Поиск в дереве" ведется в конкретной древовидной структуре (например, в двоичном дереве поиска) и позволяет быстро отсекать узлы на основе сравнения значений, чтобы найти цель.</li>
<li>«Двоичный поиск» использует упорядоченность данных для эффективного поиска и применим только к массивам.</li>
<li>«Хеш-поиск» использует хеш-таблицу для построения отображения между поисковыми данными и целевыми данными, благодаря чему запросы выполняются эффективно.</li>
<li>«Поиск в дереве» ведется в конкретной древовидной структуре (например, в двоичном дереве поиска) и позволяет быстро отсекать узлы на основе сравнения значений, чтобы найти цель.</li>
</ul>
<p>Преимущество этих алгоритмов заключается в высокой эффективности: <strong>их временная сложность может достигать <span class="arithmatex">\(O(\log n)\)</span> и даже <span class="arithmatex">\(O(1)\)</span></strong> .</p>
<p>Однако <strong>для использования таких алгоритмов обычно требуется предварительная обработка данных</strong>. Например, для двоичного поиска нужно заранее отсортировать массив, а хеш-поиск и поиск в дереве требуют дополнительных структур данных, поддержание которых тоже отнимает время и память.</p>
@@ -4481,13 +4481,13 @@
</ul>
<p><strong>Двоичный поиск</strong></p>
<ul>
<li>Подходит для больших наборов данных и демонстрирует стабильную эффективность; его худшая временная сложность равна <span class="arithmatex">\(O(\log n)\)</span> .</li>
<li>Подходит для больших наборов данных и демонстрирует стабильную эффективность. Его худшая временная сложность равна <span class="arithmatex">\(O(\log n)\)</span> .</li>
<li>Объем данных не должен быть слишком большим, потому что массив требует непрерывного участка памяти.</li>
<li>Не подходит для сценариев с частыми вставками и удалениями данных, так как поддержание массива в отсортированном виде требует больших затрат.</li>
</ul>
<p><strong>Хеш-поиск</strong></p>
<ul>
<li>Подходит для сценариев, в которых требования к скорости запросов очень высоки; средняя временная сложность равна <span class="arithmatex">\(O(1)\)</span> .</li>
<li>Подходит для сценариев, в которых требования к скорости запросов очень высоки. Средняя временная сложность равна <span class="arithmatex">\(O(1)\)</span> .</li>
<li>Не подходит для сценариев, где требуется упорядоченность данных или поиск по диапазону, потому что хеш-таблица не умеет поддерживать порядок данных.</li>
<li>Сильно зависит от хеш-функции и стратегии обработки коллизий, поэтому риск деградации производительности сравнительно велик.</li>
<li>Не подходит для слишком больших объемов данных, так как хеш-таблице требуется дополнительное пространство, чтобы максимально снизить число коллизий и обеспечить хорошую производительность поиска.</li>