Список смежности и матричное представление графа

⚡ Умное резюме

В представлении графа в виде списка смежности и матрицы вершины и ребра хранятся в памяти, что позволяет алгоритмам перемещаться по сетям. Список смежности использует связанные списки для каждой вершины, тогда как матрица смежности использует квадратную двумерную сетку.

  • 📐 Список смежности: Массив из V связанных списков, где каждый список с индексом i хранит все вершины, смежные с вершиной i, что обеспечивает O(V + E) памяти.
  • 🗺️ Матрица смежности: Двумерный массив AV × V, где matrix[i][j] содержит вес ребра или 1, если ребро существует между вершинами i и j.
  • Скорость поиска: Матрица смежности отвечает на вопрос «есть ли ребро между i и j?» за время O(1), в то время как для сканирования списка соседей списку смежности требуется время O(степени).
  • 💾 Память: Матрица смежности всегда потребляет O(V²) памяти даже для разреженных графов, тогда как список смежности масштабируется в зависимости от фактического количества ребер.
  • 🔍 Лучше всего подходит: Для плотных графов с частыми запросами к ребрам выбирайте матрицу смежности, а для разреженных графов и графов с высокой интенсивностью обхода — список смежности.
  • 🇧🇷 Области применения: Оба представления лежат в основе алгоритмов BFS, DFS, алгоритма Дейкстры, алгоритма PageRank, маршрутизации по дорожным сетям и конвейеров графовых нейронных сетей, используемых в системах искусственного интеллекта.

Список смежности и матричное представление графа

Хотя они выглядят по-разному, все типы графиков Их можно представить аналогичным образом. В целом, существует два типа представления графов:

  1. Матрица смежности
  2. Список смежности

Список смежности

Список смежности состоит из связанных списков. Каждая вершина рассматривается как индекс массива, а каждый элемент представляет собой связанный список. Эти связанные списки содержат вершины, имеющие общее ребро с вершиной, указанной в индексе.

Вот пример списка смежности:

Список смежности

Пусть граф содержит V вершин и E ребер. Пространственная сложность списка смежности равна O(V + E), которая масштабируется в зависимости от количества реальных ребер, а не от каждой возможной пары вершин.

В худшем случае пространственная сложность становится O(V²) Если данный граф является полным, то каждая вершина соединяется с каждой другой вершиной.

Матрица смежности

Матрица смежности представляет собой двумерный массив. Для графа с V вершинами размер матрицы будет равен V × V.

Сказать matrix[i][j] = 5Это означает, что между узлом i и узлом j существует ребро с весом 5.

Рассмотрим следующий граф и его матрицу смежности:

Матрица смежности

Мы построили 2D массив используя эти шаги:

Шаг 1) Вершина А имеет прямое ребро с вершиной В, и вес ребра равен 5. Следовательно, ячейка в строке А и столбце В будет заполнена числом 5. Остальные ячейки в строке А будут заполнены числом ноль.

Шаг 2) Вершина B имеет прямое ребро с вершиной C, и вес этого ребра равен 4. Таким образом, ячейка в строке B и столбце C будет заполнена числом 4. Остальные ячейки в строке B будут заполнены нулевым числом, поскольку у вершины B нет исходящего ребра ни к одной другой вершине.

Шаг 3) Вершина C не имеет прямых ребер ни с одной другой вершиной. Поэтому строка C будет заполнена нулями.

Шаг 4) Вершина D имеет направленное ребро с вершинами A и C.

  • В ячейке в строке D и столбце A будет значение 7. В ячейке в строке D и столбце C будет значение 2.
  • Остальные ячейки строки D будут заполнены нулями.

Шаг 5) Вершина E имеет направленное ребро с вершинами B и D. Ячейка в строке E и столбце B будет иметь значение 6. Ячейка в строке E и столбце D будет иметь значение 3. Остальные ячейки в строке E будут заполнены нулями.

Вот некоторые моменты, на которые следует обратить внимание:

  • Когда главная диагональ матрицы смежности равна 0, граф не имеет петель.
  • Граф является ориентированным, если ячейки в точках (a, b) и (b, a) не принимают одинаковое значение. В противном случае граф является неориентированным.
  • Граф является взвешенным, если значение любой ячейки больше 1.

Главная проблема матрицы смежности заключается в том, что она требует квадратного пространства. Даже несуществующие ребра все равно выделяют ячейки в памяти.

Например, если у нас есть граф со 100 узлами, то для его хранения потребуется 10 000 ячеек. Оперативная памятьПри меньшем количестве ребер в графе выделение такого большого объема памяти может быть неэффективным. Поэтому пространственная сложность при использовании матрицы смежности составляет O(N²)где N — количество узлов в графе.

Список смежности против матрицы смежности

Прежде чем выбирать способ представления данных, полезно сравнить обе модели параллельно по операциям, которые доминируют в реальных рабочих нагрузках на графах:

ЭксплуатацияМатрица смежностиСписок смежности
Пространство сложностиО(В²)O(V + E)
Добавить вершинуО(В²)O (1)
Добавить крайO (1)O (1)
Удалите крайO (1)О (Э)
Проверьте, существует ли ребро (i, j).O (1)O(степень i)
Пройтись по соседям iО (В)O(степень i)
лучше всего дляПлотные графы, частые запросы к ребрам.Разреженные графы, задачи, требующие интенсивного обхода графов.

Вкратце, матрица смежности выигрывает по времени поиска ребер, в то время как список смежности выигрывает по памяти и количеству итераций по соседям, поэтому такие алгоритмы, как BFS, DFS и Дейкстра, обычно используются в паре со списками смежности.

Преимущества и недостатки графового представления

Каждый способ представления имеет свои компромиссы. Знание сильных и слабых сторон обеих моделей поможет вам выбрать ту, которая лучше всего подходит для решения вашей задачи.

Преимущества матрицы смежности:

  • Запросы на существование ребер между любой парой вершин за постоянное время O(1).
  • Фиксированная индексация упрощает реализацию матричных алгоритмов, таких как алгоритм Флойда-Уоршалла и алгоритм транзитивного замыкания.
  • Взвешенные ребра естественным образом вписываются в единую матричную ячейку.

Недостатки матрицы смежности:

  • Тратит O(V²) памяти, когда граф разреженный.
  • Для добавления новой вершины необходимо изменить размер всей матрицы.
  • Итерация по соседям одной вершины занимает O(V) даже тогда, когда у вершины всего несколько рёбер.

Преимущества списка смежности:

  • Использует всего O(V + E) памяти, что близко к реальному количеству ребер в разреженных графах.
  • Добавление новой вершины или ребра занимает O(1).
  • Алгоритмы обхода, такие как BFS и DFS, перебирают соседей за O(степень), что в целом дает время выполнения O(V + E).

Недостатки списка смежности:

  • Проверка существования конкретного ребра занимает время O(степени) вместо O(1).
  • Локализация кэша слабее, поскольку связанные списки разбросаны по всей памяти.
  • Для взвешенных ребер требуется дополнительное поле или список пар, что несколько усложняет структуру данных.

Когда использовать список смежности, а когда матрицу смежности?

Выбор способа представления зависит от плотности графа и наиболее часто выполняемых операций. Воспользуйтесь этим кратким руководством, чтобы выбрать подходящую структуру:

  • Предпочтительнее использовать матрицу смежности. Когда граф плотный (E близко к V²), когда ребра редко меняются и когда ваш алгоритм многократно задает вопрос: «Есть ли ребро между i и j?».
  • Предпочтительнее использовать список смежности. когда граф разреженный (E значительно меньше V²), когда множество вершин или ребер увеличивается во время выполнения, и когда вы обходите граф с помощью BFS, DFS или Алгоритм Дейкстры для поиска кратчайшего пути.
  • Предпочтительна смешанная модель. (список смежности плюс хэш-множество ребер) когда вам нужна как быстрая итерация соседей, так и запросы ребер со сложностью O(1), ценой дополнительной памяти.

Современные библиотеки для работы с графами, такие как NetworkX и igraph, по умолчанию используют списки смежности, поскольку большинство реальных графов — социальные сети, дорожные карты, веб-страницы, зависимости пакетов — являются разреженными и требуют интенсивного обхода.

Часто задаваемые вопросы (FAQ)

Список смежности — это массив из V связанных списков, где каждый список с индексом i хранит все вершины, смежные с вершиной i. Использование памяти составляет O(V + E), что подходит для разреженных графов и алгоритмов обхода, таких как BFS и DFS.

Матрица смежности — это двумерный массив размером V × V, где matrix[i][j] содержит вес ребра или 1, если ребро существует между вершинами i и j. Поиск ребра занимает O(1), но объем памяти всегда O(V²).

Матрица смежности отвечает на запросы о существовании ребер за O(1). Список смежности перебирает соседей за O(степень), что быстрее для алгоритмов обхода, таких как BFS, DFS и Дейкстра. Лучший выбор зависит от операций, которые доминируют в вашей рабочей нагрузке.

Используйте список смежности, когда граф разреженный, когда вершины и ребра изменяются во время выполнения, и когда алгоритм часто проходит по соседним узлам. Социальные сети, дорожные карты и графы веб-страниц — все это соответствует данному профилю.

Матрица смежности используется, когда граф плотный, когда множество вершин фиксировано и когда алгоритм многократно обращается к одному и тому же ребру. Методы Флойда-Уоршалла и транзитивного замыкания естественным образом работают с матрицами смежности.

Да. Для ориентированных графов матрица несимметрична, и список хранит только исходящих соседей. Для взвешенных графов ячейка матрицы содержит вес, а список хранит пары сосед и вес.

Графовые нейронные сети подают матрицы смежности или разреженные тензоры ребер в слои машинного обучения для обнаружения мошенничества, прогнозирования свойств молекул и рекомендательных систем. Графы знаний также используют кодирование в виде списков смежности для искусственного интеллекта, расширяющего возможности поиска информации.

Да. GitHub Copilot и ChatGPT генерируют шаблоны для списков смежности и матриц. Python, C++ и JavaРазработчикам по-прежнему необходимо проверять такие крайние случаи, как дублирующиеся ребра, самозамыкания и корректную обработку ориентированных или взвешенных графов.

Подведем итог этой публикации следующим образом: