Вопрос с собеседования · Основы

Как представить граф в программе?

JuniorГрафы
Ещё спрашивают так:
  • Чем матрица смежности отличается от списка смежности?
  • Какие бывают графы?
Коротко

Два основных способа: матрица смежности (таблица V×V) и список смежности (для каждой вершины — список соседей).

  • Матрица: проверка ребра O(1), память O(V²) — для плотных графов
  • Список: память O(V + E), перебор соседей быстрый — выбор по умолчанию для разреженных графов

А ещё Сначала уточните вид графа: ориентированный или нет, со весами или нет, есть ли циклы

Подробно

Граф — вершины (V) и рёбра (E) между ними. Виды: ориентированный (у ребра есть направление: подписки, зависимости) или неориентированный (дружба, дороги в обе стороны); взвешенный (у ребра есть вес: расстояние, стоимость); ациклический (DAG — нет циклов: зависимости задач).

Матрица смежности — двумерный массив V×V, где m[u][v] — есть ли ребро (или его вес).

  • проверить ребро — O(1);
  • перебрать соседей вершины — O(V);
  • память — O(V²): для миллиона вершин нереально.

Подходит для небольших и плотных графов.

Список смежности — для каждой вершины список её соседей (словарь списков).

  • память — O(V + E);
  • перебрать соседей — O(степени вершины);
  • проверить конкретное ребро — O(степени), или O(1) в среднем, если соседей хранить множеством.

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

Ещё бывает список рёбер — просто перечень пар (u, v, вес); удобен для алгоритмов, перебирающих все рёбра (Краскал, Беллман — Форд).

Сетка (лабиринт, карта) — тоже граф: клетки — вершины, соседние клетки — рёбра, хранить отдельно не нужно.

Пример

from collections import defaultdict

edges = [("A", "B", 4), ("A", "C", 2), ("C", "B", 1), ("B", "D", 5)]

graph = defaultdict(list)          # список смежности, ориентированный, взвешенный
for u, v, w in edges:
    graph[u].append((v, w))

graph["A"]   # [('B', 4), ('C', 2)]

Что хотят услышать

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

Частые ошибки

  • Брать матрицу для большого разреженного графа.
  • Не уточнить, ориентирован ли граф.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Матрица смежности экономнее по памяти для разреженных графов, а список смежности проверяет наличие любого ребра за O(1) и подходит для плотных
  • ✓Матрица смежности — проверка ребра O(1) и память O(V²); список смежности — память O(V + E), выбор по умолчанию для разреженных графов
  • ✗Список смежности проверяет наличие ребра за O(1) всегда
  • ✗Граф можно представить только матрицей

Что спросят дальше

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

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

Разбор собеседования