Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Граф — вершины (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)]

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

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

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

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

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

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем