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
+6 -6
View File
@@ -4464,21 +4464,21 @@ G & = \{ V, E \} \newline
<p><img alt="Связный и несвязный графы" class="animation-figure" src="../graph.assets/connected_graph.png" /></p>
<p align="center"> Рисунок 9-3 &nbsp; Связный и несвязный графы </p>
<p>Мы также можем добавить к ребрам переменную "вес" и получить показанный ниже <u>взвешенный граф (weighted graph)</u>. Например, в мобильных играх вроде Honor of Kings система рассчитывает "близость" между игроками по времени совместной игры, и такую сеть близости можно представить взвешенным графом.</p>
<p>Мы также можем добавить к ребрам переменную «вес» и получить <u>взвешенный граф (weighted graph)</u>, как показано на рисунке 9-4. Например, в мобильных играх вроде Honor of Kings система рассчитывает «близость» между игроками по времени совместной игры, и такую сеть близости можно представить взвешенным графом.</p>
<p><img alt="Взвешенный и невзвешенный графы" class="animation-figure" src="../graph.assets/weighted_graph.png" /></p>
<p align="center"> Рисунок 9-4 &nbsp; Взвешенный и невзвешенный графы </p>
<p>Со структурой данных "граф" связаны следующие основные термины.</p>
<p>Со структурой данных «граф» связаны следующие основные термины.</p>
<ul>
<li><u>Смежность (adjacency)</u>: если между двумя вершинами существует ребро, то такие вершины называются смежными. На рисунке 9-4 с вершиной 1 смежны вершины 2, 3 и 5.</li>
<li><u>Путь (path)</u>: последовательность ребер от вершины A до вершины B называется путем из A в B. На рисунке 9-4 последовательность ребер 1-5-2-4 является одним из путей от вершины 1 к вершине 4.</li>
<li><u>Степень (degree)</u>: количество ребер, принадлежащих вершине. Для ориентированного графа <u>входящая степень (in-degree)</u> показывает, сколько ребер входит в вершину, а <u>исходящая степень (out-degree)</u> показывает, сколько ребер из нее выходит.</li>
</ul>
<h2 id="912">9.1.2 &nbsp; Представление графа<a class="headerlink" href="#912" title="Permanent link">&para;</a></h2>
<p>Распространенные способы представления графа включают "матрицу смежности" и "список смежности". Ниже для примера рассматривается неориентированный граф.</p>
<p>Распространенные способы представления графа включают «матрицу смежности» и «список смежности». Ниже для примера рассматривается неориентированный граф.</p>
<h3 id="1">1. &nbsp; Матрица смежности<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p>Пусть число вершин графа равно <span class="arithmatex">\(n\)</span> ; тогда <u>матрица смежности (adjacency matrix)</u> использует матрицу размера <span class="arithmatex">\(n \times n\)</span> для представления графа, где каждая строка и каждый столбец соответствуют вершине, а элементы матрицы показывают наличие или отсутствие ребра.</p>
<p>Как показано на рисунке 9-5, обозначим матрицу смежности через <span class="arithmatex">\(M\)</span> , а список вершин через <span class="arithmatex">\(V\)</span> ; тогда элемент матрицы <span class="arithmatex">\(M[i, j] = 1\)</span> означает наличие ребра между вершинами <span class="arithmatex">\(V[i]\)</span> и <span class="arithmatex">\(V[j]\)</span> , а элемент <span class="arithmatex">\(M[i, j] = 0\)</span> означает отсутствие ребра.</p>
<p>Пусть число вершин графа равно <span class="arithmatex">\(n\)</span>. Тогда <u>матрица смежности (adjacency matrix)</u> использует матрицу размера <span class="arithmatex">\(n \times n\)</span> для представления графа, где каждая строка и каждый столбец соответствуют вершине, а элементы матрицы показывают наличие или отсутствие ребра.</p>
<p>Как показано на рисунке 9-5, обозначим матрицу смежности через <span class="arithmatex">\(M\)</span> , а список вершин через <span class="arithmatex">\(V\)</span>. Тогда элемент матрицы <span class="arithmatex">\(M[i, j] = 1\)</span> означает наличие ребра между вершинами <span class="arithmatex">\(V[i]\)</span> и <span class="arithmatex">\(V[j]\)</span> , а элемент <span class="arithmatex">\(M[i, j] = 0\)</span> означает отсутствие ребра.</p>
<p><img alt="Представление графа матрицей смежности" class="animation-figure" src="../graph.assets/adjacency_matrix.png" /></p>
<p align="center"> Рисунок 9-5 &nbsp; Представление графа матрицей смежности </p>
@@ -4495,7 +4495,7 @@ G &amp; = \{ V, E \} \newline
<p align="center"> Рисунок 9-6 &nbsp; Представление графа списком смежности </p>
<p>Список смежности хранит только реально существующие ребра, а общее число ребер обычно значительно меньше <span class="arithmatex">\(n^2\)</span> , поэтому он лучше экономит память. Однако для поиска ребра в списке смежности требуется обходить список, поэтому по времени он уступает матрице смежности.</p>
<p>Если посмотреть на рисунок 9-6, можно заметить, что <strong>структура списка смежности очень похожа на цепную адресацию в хеш-таблицах, поэтому здесь можно использовать похожие методы оптимизации эффективности</strong>. Например, если список слишком длинный, его можно преобразовать в AVL-дерево или красно-черное дерево, чтобы снизить временную сложность с <span class="arithmatex">\(O(n)\)</span> до <span class="arithmatex">\(O(\log n)\)</span> ; также список можно преобразовать в хеш-таблицу, чтобы довести временную сложность до <span class="arithmatex">\(O(1)\)</span> .</p>
<p>Как видно на рисунке 9-6, <strong>структура списка смежности очень похожа на цепную адресацию в хеш-таблицах, поэтому здесь можно использовать похожие методы оптимизации эффективности</strong>. Например, если список слишком длинный, его можно преобразовать в AVL-дерево или красно-черное дерево, чтобы снизить временную сложность с <span class="arithmatex">\(O(n)\)</span> до <span class="arithmatex">\(O(\log n)\)</span>. Также список можно преобразовать в хеш-таблицу, чтобы довести временную сложность до <span class="arithmatex">\(O(1)\)</span> .</p>
<h2 id="913">9.1.3 &nbsp; Типичные применения графов<a class="headerlink" href="#913" title="Permanent link">&para;</a></h2>
<p>Как показано в таблице 9-1, многие реальные системы можно моделировать с помощью графов, а соответствующие задачи затем сводить к задачам вычислений на графах.</p>
<p align="center"> Таблица 9-1 &nbsp; Распространенные графы в реальной жизни </p>