mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-29 19:37:14 +00:00
deploy
This commit is contained in:
@@ -65,8 +65,8 @@
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
|
||||
<style>:root{--md-text-font:"Noto Sans";--md-code-font:"JetBrains Mono"}</style>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
|
||||
<style>:root{--md-text-font:"PT Sans";--md-code-font:"JetBrains Mono"}</style>
|
||||
|
||||
|
||||
|
||||
@@ -574,7 +574,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Глава 1. Знакомство с алгоритмами
|
||||
Глава 1. Введение в алгоритмы
|
||||
|
||||
|
||||
|
||||
@@ -596,7 +596,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
Глава 1. Знакомство с алгоритмами
|
||||
Глава 1. Введение в алгоритмы
|
||||
|
||||
|
||||
</label>
|
||||
@@ -646,7 +646,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
1.2 Что такое структуры данных и алгоритмы
|
||||
1.2 Что такое алгоритм
|
||||
|
||||
|
||||
|
||||
@@ -1181,7 +1181,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Глава 4. Массив и связный список
|
||||
Глава 4. Массивы и списки
|
||||
|
||||
|
||||
|
||||
@@ -1203,7 +1203,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
Глава 4. Массив и связный список
|
||||
Глава 4. Массивы и списки
|
||||
|
||||
|
||||
</label>
|
||||
@@ -1309,7 +1309,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
4.4 Память и кеш *
|
||||
4.4 Оперативная память и кэш *
|
||||
|
||||
|
||||
|
||||
@@ -1591,7 +1591,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Глава 6. Хеширование
|
||||
Глава 6. Хеш-таблицы
|
||||
|
||||
|
||||
|
||||
@@ -1613,7 +1613,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
Глава 6. Хеширование
|
||||
Глава 6. Хеш-таблицы
|
||||
|
||||
|
||||
</label>
|
||||
@@ -1691,7 +1691,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
6.3 Хеш-алгоритмы
|
||||
6.3 Алгоритмы хеширования
|
||||
|
||||
|
||||
|
||||
@@ -1786,7 +1786,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Глава 7. Дерево
|
||||
Глава 7. Деревья
|
||||
|
||||
|
||||
|
||||
@@ -1808,7 +1808,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
Глава 7. Дерево
|
||||
Глава 7. Деревья
|
||||
|
||||
|
||||
</label>
|
||||
@@ -1886,7 +1886,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
7.3 Представление дерева массивом
|
||||
7.3 Представление двоичного дерева массивом
|
||||
|
||||
|
||||
|
||||
@@ -1970,7 +1970,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
7.6 Резюме
|
||||
7.6 Краткие итоги
|
||||
|
||||
|
||||
|
||||
@@ -2133,7 +2133,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
8.3 Задача Top-K
|
||||
8.3 Задача Top-k
|
||||
|
||||
|
||||
|
||||
@@ -2226,7 +2226,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Глава 9. Граф
|
||||
Глава 9. Графы
|
||||
|
||||
|
||||
|
||||
@@ -2248,7 +2248,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
Глава 9. Граф
|
||||
Глава 9. Графы
|
||||
|
||||
|
||||
</label>
|
||||
@@ -2298,7 +2298,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
9.2 Базовые операции над графами
|
||||
9.2 Базовые операции графа
|
||||
|
||||
|
||||
|
||||
@@ -2480,7 +2480,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
9.4 Резюме
|
||||
9.4 Краткие итоги
|
||||
|
||||
|
||||
|
||||
@@ -2619,7 +2619,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.2 Точка вставки двоичного поиска
|
||||
10.2 Двоичный поиск точки вставки
|
||||
|
||||
|
||||
|
||||
@@ -2647,7 +2647,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.3 Граничные случаи двоичного поиска
|
||||
10.3 Двоичный поиск границ
|
||||
|
||||
|
||||
|
||||
@@ -2675,7 +2675,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.4 Стратегия оптимизации через хеширование
|
||||
10.4 Стратегии оптимизации хеширования
|
||||
|
||||
|
||||
|
||||
@@ -2703,7 +2703,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.5 Алгоритмы поиска: новый взгляд
|
||||
10.5 Переосмысление алгоритмов поиска
|
||||
|
||||
|
||||
|
||||
@@ -2908,7 +2908,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
11.3 Пузырьковая сортировка
|
||||
11.3 Сортировка пузырьком
|
||||
|
||||
|
||||
|
||||
@@ -2936,7 +2936,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
11.4 Сортировка вставкой
|
||||
11.4 Сортировка вставками
|
||||
|
||||
|
||||
|
||||
@@ -3241,7 +3241,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.1 Алгоритмы разделяй и властвуй
|
||||
12.1 Стратегия разделяй и властвуй
|
||||
|
||||
|
||||
|
||||
@@ -3269,7 +3269,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.2 Стратегия поиска разделяй и властвуй
|
||||
12.2 Поисковая стратегия разделяй и властвуй
|
||||
|
||||
|
||||
|
||||
@@ -3546,7 +3546,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.4 Задача о $n$ ферзях
|
||||
13.4 Задача о n ферзях
|
||||
|
||||
|
||||
|
||||
@@ -3687,7 +3687,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.1 Введение в динамическое программирование
|
||||
14.1 Первое знакомство с динамическим программированием
|
||||
|
||||
|
||||
|
||||
@@ -3799,7 +3799,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.5 Задача о неограниченном рюкзаке
|
||||
14.5 Задача о полном рюкзаке
|
||||
|
||||
|
||||
|
||||
@@ -4467,24 +4467,24 @@
|
||||
|
||||
<!-- Page content -->
|
||||
<h1 id="93">9.3 Обход графа<a class="headerlink" href="#93" title="Permanent link">¶</a></h1>
|
||||
<p>Дерево представляет отношение "один ко многим", а граф имеет более высокую степень свободы и может выражать произвольные отношения "многие ко многим". Поэтому мы можем рассматривать дерево как частный случай графа. Очевидно, что <strong>операции обхода дерева также являются частным случаем операций обхода графа</strong>.</p>
|
||||
<p>И графы, и деревья требуют использования поисковых алгоритмов для реализации обхода. Способы обхода графа также делятся на два типа: <u>обход в ширину</u> и <u>обход в глубину</u>.</p>
|
||||
<p>Дерево представляет отношение "один ко многим", тогда как граф обладает большей свободой и может выражать произвольные отношения "многие ко многим". Поэтому дерево можно рассматривать как частный случай графа. Очевидно, что <strong>операции обхода дерева также являются частным случаем операций обхода графа</strong>.</p>
|
||||
<p>И графы, и деревья требуют применения алгоритмов обхода. Способы обхода графа также делятся на два типа: <u>обход в ширину</u> и <u>обход в глубину</u>.</p>
|
||||
<h2 id="931">9.3.1 Обход в ширину<a class="headerlink" href="#931" title="Permanent link">¶</a></h2>
|
||||
<p><strong>Обход в ширину - это способ обхода "от близкого к далекому": начиная с некоторого узла, мы всегда в первую очередь посещаем ближайшие вершины и слой за слоем расширяемся наружу</strong>. Как показано на рисунке 9-9, начиная с вершины в левом верхнем углу, мы сначала обходим все смежные вершины этой вершины, затем все смежные вершины следующей вершины и так далее, пока не будут посещены все вершины.</p>
|
||||
<p><strong>Обход в ширину - это способ обхода от ближнего к дальнему, при котором начиная с некоторого узла сначала посещают ближайшие вершины, а затем слой за слоем расширяются наружу</strong>. Как показано на рисунке 9-9, начиная с вершины в левом верхнем углу, мы сначала обходим все смежные вершины этой вершины, затем все смежные вершины следующей вершины и так далее, пока не будут посещены все вершины.</p>
|
||||
<p><img alt="Обход графа в ширину" class="animation-figure" src="../graph_traversal.assets/graph_bfs.png" /></p>
|
||||
<p align="center"> Рисунок 9-9 Обход графа в ширину </p>
|
||||
|
||||
<h3 id="1">1. Реализация алгоритма<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<p>BFS обычно реализуется с помощью очереди, код приведен ниже. Очередь обладает свойством "первым пришел - первым вышел", что хорошо соответствует идее BFS "от близкого к далекому".</p>
|
||||
<p>BFS обычно реализуется с помощью очереди, код приведен ниже. Очередь обладает свойством "первым пришел - первым вышел", что хорошо соответствует идее BFS "от ближнего к дальнему".</p>
|
||||
<ol>
|
||||
<li>Поместить стартовую вершину обхода <code>startVet</code> в очередь и запустить цикл.</li>
|
||||
<li>На каждой итерации цикла извлекать вершину из головы очереди и записывать факт ее посещения, после чего добавлять все смежные вершины этой вершины в хвост очереди.</li>
|
||||
<li>На каждой итерации цикла извлекать вершину из головы очереди и записывать ее посещение, после чего добавлять все смежные вершины этой вершины в хвост очереди.</li>
|
||||
<li>Повторять шаг <code>2.</code> до тех пор, пока не будут посещены все вершины.</li>
|
||||
</ol>
|
||||
<p>Чтобы предотвратить повторный обход вершин, нам нужен хеш-набор <code>visited</code> , в котором будет записываться, какие узлы уже посещены.</p>
|
||||
<p>Чтобы предотвратить повторный обход вершин, нам нужно хеш-множество <code>visited</code> , в котором записывается, какие вершины уже посещены.</p>
|
||||
<div class="admonition tip">
|
||||
<p class="admonition-title">Tip</p>
|
||||
<p>Хеш-набор можно рассматривать как хеш-таблицу, которая хранит только <code>key</code> и не хранит <code>value</code> . Он позволяет выполнять добавление, удаление, поиск и изменение <code>key</code> за <span class="arithmatex">\(O(1)\)</span> времени. Благодаря уникальности <code>key</code> хеш-набор обычно используется, например, для устранения повторов.</p>
|
||||
<p>Хеш-множество можно рассматривать как хеш-таблицу, которая хранит только <code>key</code> и не хранит <code>value</code> . Оно позволяет выполнять добавление, удаление и проверку наличия <code>key</code> за <span class="arithmatex">\(O(1)\)</span> времени. Благодаря уникальности <code>key</code> хеш-множество обычно используется, например, для устранения повторов.</p>
|
||||
</div>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="1:13"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><input id="__tabbed_1_9" name="__tabbed_1" type="radio" /><input id="__tabbed_1_10" name="__tabbed_1" type="radio" /><input id="__tabbed_1_11" name="__tabbed_1" type="radio" /><input id="__tabbed_1_12" name="__tabbed_1" type="radio" /><input id="__tabbed_1_13" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Java</label><label for="__tabbed_1_4">C#</label><label for="__tabbed_1_5">Go</label><label for="__tabbed_1_6">Swift</label><label for="__tabbed_1_7">JS</label><label for="__tabbed_1_8">TS</label><label for="__tabbed_1_9">Dart</label><label for="__tabbed_1_10">Rust</label><label for="__tabbed_1_11">C</label><label for="__tabbed_1_12">Kotlin</label><label for="__tabbed_1_13">Ruby</label></div>
|
||||
<div class="tabbed-content">
|
||||
@@ -4956,18 +4956,18 @@
|
||||
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">Является ли последовательность обхода в ширину единственной?</p>
|
||||
<p>Нет. Обход в ширину требует только соблюдения порядка "от близкого к далекому", <strong>а порядок обхода нескольких вершин на одинаковом расстоянии может произвольно меняться</strong>. Например, на рисунке 9-10 можно поменять местами порядок посещения вершин <span class="arithmatex">\(1\)</span> и <span class="arithmatex">\(3\)</span> , а также в произвольном порядке переставить вершины <span class="arithmatex">\(2\)</span>, <span class="arithmatex">\(4\)</span>, <span class="arithmatex">\(6\)</span> .</p>
|
||||
<p>Нет. Обход в ширину требует только соблюдения порядка "от ближнего к дальнему", <strong>а порядок обхода нескольких вершин на одинаковом расстоянии может произвольно меняться</strong>. Например, на рисунке 9-10 можно поменять местами порядок посещения вершин <span class="arithmatex">\(1\)</span> и <span class="arithmatex">\(3\)</span> , а вершины <span class="arithmatex">\(2\)</span>, <span class="arithmatex">\(4\)</span>, <span class="arithmatex">\(6\)</span> также можно переставлять произвольно.</p>
|
||||
</div>
|
||||
<h3 id="2">2. Анализ сложности<a class="headerlink" href="#2" title="Permanent link">¶</a></h3>
|
||||
<p><strong>Временная сложность</strong>: все вершины по одному разу помещаются в очередь и извлекаются из нее, что требует <span class="arithmatex">\(O(|V|)\)</span> времени; при обходе смежных вершин, поскольку граф неориентированный, все ребра будут посещены по <span class="arithmatex">\(2\)</span> раза, что требует <span class="arithmatex">\(O(2|E|)\)</span> времени; в сумме получается <span class="arithmatex">\(O(|V| + |E|)\)</span> .</p>
|
||||
<p><strong>Пространственная сложность</strong>: список <code>res</code> , хеш-набор <code>visited</code> и очередь <code>que</code> в худшем случае могут содержать до <span class="arithmatex">\(|V|\)</span> вершин, поэтому требуется <span class="arithmatex">\(O(|V|)\)</span> памяти.</p>
|
||||
<p><strong>Пространственная сложность</strong>: список <code>res</code> , хеш-множество <code>visited</code> и очередь <code>que</code> в худшем случае могут содержать до <span class="arithmatex">\(|V|\)</span> вершин, поэтому требуется <span class="arithmatex">\(O(|V|)\)</span> памяти.</p>
|
||||
<h2 id="932">9.3.2 Обход в глубину<a class="headerlink" href="#932" title="Permanent link">¶</a></h2>
|
||||
<p><strong>Обход в глубину - это способ обхода, при котором сначала идут до самого конца, а когда дальше идти нельзя, откатываются назад</strong>. Как показано на рисунке 9-11, начиная с вершины в левом верхнем углу, мы выбираем некоторую смежную вершину текущей вершины, идем до упора, затем возвращаемся назад, снова идем до упора и так далее, пока не будут посещены все вершины.</p>
|
||||
<p><strong>Обход в глубину - это способ обхода, при котором сначала идут до самого конца, а когда дальше идти нельзя, возвращаются назад</strong>. Как показано на рисунке 9-11, начиная с вершины в левом верхнем углу, мы выбираем некоторую смежную вершину текущей вершины, идем до упора, затем возвращаемся назад, снова идем до упора и так далее, пока не будут посещены все вершины.</p>
|
||||
<p><img alt="Обход графа в глубину" class="animation-figure" src="../graph_traversal.assets/graph_dfs.png" /></p>
|
||||
<p align="center"> Рисунок 9-11 Обход графа в глубину </p>
|
||||
|
||||
<h3 id="1_1">1. Реализация алгоритма<a class="headerlink" href="#1_1" title="Permanent link">¶</a></h3>
|
||||
<p>Такой алгоритмический шаблон "дойти до конца и вернуться" обычно реализуется через рекурсию. Подобно обходу в ширину, в обходе в глубину мы также используем хеш-набор <code>visited</code> для записи уже посещенных вершин и тем самым избегаем повторного посещения.</p>
|
||||
<p>Такой алгоритмический шаблон "дойти до конца и вернуться" обычно реализуется через рекурсию. Подобно обходу в ширину, в обходе в глубину мы также используем хеш-множество <code>visited</code> для записи уже посещенных вершин и тем самым избегаем повторного посещения.</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="3:13"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><input id="__tabbed_3_3" name="__tabbed_3" type="radio" /><input id="__tabbed_3_4" name="__tabbed_3" type="radio" /><input id="__tabbed_3_5" name="__tabbed_3" type="radio" /><input id="__tabbed_3_6" name="__tabbed_3" type="radio" /><input id="__tabbed_3_7" name="__tabbed_3" type="radio" /><input id="__tabbed_3_8" name="__tabbed_3" type="radio" /><input id="__tabbed_3_9" name="__tabbed_3" type="radio" /><input id="__tabbed_3_10" name="__tabbed_3" type="radio" /><input id="__tabbed_3_11" name="__tabbed_3" type="radio" /><input id="__tabbed_3_12" name="__tabbed_3" type="radio" /><input id="__tabbed_3_13" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Python</label><label for="__tabbed_3_2">C++</label><label for="__tabbed_3_3">Java</label><label for="__tabbed_3_4">C#</label><label for="__tabbed_3_5">Go</label><label for="__tabbed_3_6">Swift</label><label for="__tabbed_3_7">JS</label><label for="__tabbed_3_8">TS</label><label for="__tabbed_3_9">Dart</label><label for="__tabbed_3_10">Rust</label><label for="__tabbed_3_11">C</label><label for="__tabbed_3_12">Kotlin</label><label for="__tabbed_3_13">Ruby</label></div>
|
||||
<div class="tabbed-content">
|
||||
<div class="tabbed-block">
|
||||
@@ -5349,8 +5349,8 @@
|
||||
</details>
|
||||
<p>Алгоритмический процесс обхода в глубину показан на рисунках ниже.</p>
|
||||
<ul>
|
||||
<li><strong>Прямая пунктирная линия обозначает нисходящее рекурсивное развертывание</strong> , то есть запуск нового рекурсивного метода для посещения новой вершины.</li>
|
||||
<li><strong>Изогнутая пунктирная линия обозначает обратный возврат по рекурсии</strong> , то есть данный рекурсивный метод завершился и управление вернулось туда, откуда он был вызван.</li>
|
||||
<li><strong>Прямая пунктирная линия обозначает нисходящую рекурсию</strong> , то есть запуск нового рекурсивного метода для посещения новой вершины.</li>
|
||||
<li><strong>Изогнутая пунктирная линия обозначает восходящую рекурсию</strong> , то есть данный рекурсивный метод завершился и управление вернулось туда, откуда он был вызван.</li>
|
||||
</ul>
|
||||
<p>Чтобы лучше понять алгоритм, рекомендуется совместить рисунки ниже с кодом и мысленно проследить весь процесс DFS, включая моменты запуска и возврата каждого рекурсивного вызова.</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="4:11"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><input id="__tabbed_4_3" name="__tabbed_4" type="radio" /><input id="__tabbed_4_4" name="__tabbed_4" type="radio" /><input id="__tabbed_4_5" name="__tabbed_4" type="radio" /><input id="__tabbed_4_6" name="__tabbed_4" type="radio" /><input id="__tabbed_4_7" name="__tabbed_4" type="radio" /><input id="__tabbed_4_8" name="__tabbed_4" type="radio" /><input id="__tabbed_4_9" name="__tabbed_4" type="radio" /><input id="__tabbed_4_10" name="__tabbed_4" type="radio" /><input id="__tabbed_4_11" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1"><1></label><label for="__tabbed_4_2"><2></label><label for="__tabbed_4_3"><3></label><label for="__tabbed_4_4"><4></label><label for="__tabbed_4_5"><5></label><label for="__tabbed_4_6"><6></label><label for="__tabbed_4_7"><7></label><label for="__tabbed_4_8"><8></label><label for="__tabbed_4_9"><9></label><label for="__tabbed_4_10"><10></label><label for="__tabbed_4_11"><11></label></div>
|
||||
@@ -5399,7 +5399,7 @@
|
||||
</div>
|
||||
<h3 id="2_1">2. Анализ сложности<a class="headerlink" href="#2_1" title="Permanent link">¶</a></h3>
|
||||
<p><strong>Временная сложность</strong>: все вершины будут посещены по <span class="arithmatex">\(1\)</span> разу, что требует <span class="arithmatex">\(O(|V|)\)</span> времени; все ребра будут посещены по <span class="arithmatex">\(2\)</span> раза, что требует <span class="arithmatex">\(O(2|E|)\)</span> времени; суммарно получается <span class="arithmatex">\(O(|V| + |E|)\)</span> .</p>
|
||||
<p><strong>Пространственная сложность</strong>: число вершин в списке <code>res</code> и хеш-наборе <code>visited</code> в худшем случае достигает <span class="arithmatex">\(|V|\)</span> , максимальная глубина рекурсии тоже равна <span class="arithmatex">\(|V|\)</span> , поэтому требуется <span class="arithmatex">\(O(|V|)\)</span> памяти.</p>
|
||||
<p><strong>Пространственная сложность</strong>: число вершин в списке <code>res</code> и хеш-множестве <code>visited</code> в худшем случае достигает <span class="arithmatex">\(|V|\)</span> , максимальная глубина рекурсии тоже равна <span class="arithmatex">\(|V|\)</span> , поэтому требуется <span class="arithmatex">\(O(|V|)\)</span> памяти.</p>
|
||||
|
||||
<!-- Source file information -->
|
||||
|
||||
@@ -5422,7 +5422,7 @@ aria-label="Нижний колонтитул"
|
||||
<a
|
||||
href="../graph_operations/"
|
||||
class="md-footer__link md-footer__link--prev"
|
||||
aria-label="Назад: 9.2 Базовые операции над графами"
|
||||
aria-label="Назад: 9.2 Базовые операции графа"
|
||||
rel="prev"
|
||||
>
|
||||
<div class="md-footer__button md-icon">
|
||||
@@ -5434,7 +5434,7 @@ aria-label="Нижний колонтитул"
|
||||
Назад
|
||||
</span>
|
||||
<div class="md-ellipsis">
|
||||
9.2 Базовые операции над графами
|
||||
9.2 Базовые операции графа
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
@@ -5446,7 +5446,7 @@ aria-label="Нижний колонтитул"
|
||||
<a
|
||||
href="../summary/"
|
||||
class="md-footer__link md-footer__link--next"
|
||||
aria-label="Вперед: 9.4 Резюме"
|
||||
aria-label="Вперед: 9.4 Краткие итоги"
|
||||
rel="next"
|
||||
>
|
||||
<div class="md-footer__title">
|
||||
@@ -5454,7 +5454,7 @@ aria-label="Нижний колонтитул"
|
||||
Вперед
|
||||
</span>
|
||||
<div class="md-ellipsis">
|
||||
9.4 Резюме
|
||||
9.4 Краткие итоги
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-footer__button md-icon">
|
||||
|
||||
Reference in New Issue
Block a user