Harddijkstra
Как найти кратчайший путь (Dijkstra)?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Dijkstra — кратчайший путь от одной вершины во weighted graph с неотрицательными весами. Greedy: всегда выбираем ближайшую непосещённую вершину через min-priority queue.
import heapq
def dijkstra(graph, start):
dist = {v: float('inf') for v in graph}
dist[start] = 0
heap = [(0, start)]
while heap:
d, u = heapq.heappop(heap)
if d > dist[u]: # устаревшая запись
continue
for v, w in graph[u]:
nd = d + w
if nd < dist[v]:
dist[v] = nd
heapq.heappush(heap, (nd, v))
return distСложность O((V+E) log V) с binary heap, O(V²) с array. Не работает с отрицательными весами — нужен Bellman-Ford O(VE), который также detect negative cycle. Все пары — Floyd-Warshall O(V³). A* — с heuristic для конкретного endpoint. Оптимизация: lazy deletion (d > dist[u]), а не удаление из heap.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.