5.2. Представление графа в памяти компьютера

В этом параграфе вы узнаете, почему у графов нет единого «правильного» способа хранения и как выбор представления влияет на эффективность алгоритмов. Мы рассмотрим матрицу смежности, матрицу инцидентности, список смежности и список рёбер, сравним их сильные и слабые стороны и разберём, в каких случаях удобно использовать каждый из вариантов.

Ключевые вопросы параграфа

  • Какие основные способы хранения графа применяются на практике?
  • Как различия в представлениях отражаются на скорости работы алгоритмов и потреблении памяти?
  • По каким критериям выбирать подходящее представление графа для конкретной задачи?

Способ хранения графа

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

Рассмотрим такой способ хранения графа, как матрица смежности. Матрица смежности представляет собой матрицу, где по строкам и столбцам располагаются номера вершин. Если рёбра между вершинами отсутствует, то на пересечении -ой строки и -ого столбца ставится 0. Если ребро есть, то ставят 1. Пример графа и его матрицы смежности приведён на рисунке ниже.

algorithms

Остановитесь и подумайте:
Всегда ли матрица смежности для неориентированного графа симметрична?

Рассмотрим пример матрицы смежности для ориентированного графа. В целом, отличий не так много, кроме того, что матрица смежности перестала быть симметричной. Подумайте, почему.

algorithms

Также при работе с графами применяется и матрица инцидентности. По столбцам располагаются рёбра, а по строкам номера вершин. На пересечении -ой вершины и -ого ребра ставится 1, если одним из концов ребра была вершина . Пример приведён ниже.

algosy

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

algorithms

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

algorithms

В случае ориентированного графа список смежности выглядит аналогичным образом.

algosy

В некоторых случаях удобнее использовать список рёбер. Он представляет собой перечисление всех рёбер графа. Пример приведен ниже.

algorithms

Упражнение 1

Подумайте, а какой вариант хранения графа в памяти компьютера самый оптимальный. Почему?

Что дальше

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

Далее — перейдём к алгоритмам работы с графами. Начнём с базового действия — обхода графа, то есть последовательного просмотра всех его вершин и рёбер.

А пока вы не ушли дальше — закрепите материал на практике:

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

Хотите обсудить, задать вопрос или не понимаете, почему код не работает? Мы всё предусмотрели — вступайте в сообщество Хендбука! Там студенты помогают друг другу разобраться.

Ключевые выводы параграфа

  • Граф можно хранить с помощью матрицы смежности, инцидентности, списка смежности или списка рёбер.
  • Выбор способа зависит от размера графа, плотности связей и требований к скорости доступа.
  • Нет универсального способа — у каждого формата есть свои плюсы и минусы.
  • Эффективное представление графа — залог быстрого и надёжного алгоритма.
Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф5.1. Природа графа
Следующий параграф5.3. Обходы графа