Как представить граф в программе?
- Чем матрица смежности отличается от списка смежности?
- Какие бывают графы?
Два основных способа: матрица смежности (таблица 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 минут бесплатно.