Wiki Легостаев

Материал из Wiki
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «'''Алгоритм Дейкстры''' — алгоритм на графах, изобретённый нидерландским учёным [[Дейкстр…»)
 
Строка 1: Строка 1:
'''Алгоритм Дейкстры''' — алгоритм на графах, изобретённый нидерландским учёным [[Дейкстра, Эдсгер Вибе|Эдсгером Дейкстрой]] в 1959 году. Находит [[Кратчайший путь|кратчайшие пути]] от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса.
+
[[Файл:вик1.jpg]][[Файл:вик2.jpg]][[Файл:вик3.jpg]]
 +
 
 +
 
 +
 
 +
'''Полужирное начертание''''''Алгоритм Дейкстры''' — алгоритм на графах, изобретённый нидерландским учёным [[Дейкстра, Эдсгер Вибе|Эдсгером Дейкстрой]] в 1959 году. Находит [[Кратчайший путь|кратчайшие пути]] от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса.
  
 
__TOC__
 
__TOC__

Версия 08:32, 22 декабря 2025

Файл:Вик1.jpgВик2.jpgВик3.jpg


'Полужирное начертание'Алгоритм Дейкстры — алгоритм на графах, изобретённый нидерландским учёным Эдсгером Дейкстрой в 1959 году. Находит кратчайшие пути от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса.

Содержание


Математическое описание

Алгоритм Дейкстры использует жадную стратегию. Для каждой вершины v хранится текущая длина d[v] кратчайшего пути из начальной вершины s в v, а также булевый флаг used[v] — посещена ли вершина.

Изначально d[s] = 0, для всех остальных вершин расстояние считается бесконечным (d[v] = \infty), used[v] = false.

На каждом шаге алгоритма выбирается вершина u с минимальным d[u] среди ещё не посещённых. Для каждого соседа v вершины u пересчитывается расстояние:

d[v] = \min(d[v], d[u] + w(u, v))

где w(u, v) — вес ребра из u в v.

Алгоритм завершается, когда все вершины посещены или минимальное расстояние среди непосещённых равно бесконечности.

Пример реализации на Python

<syntaxhighlight lang="python"> import heapq

def dijkstra(graph, start):

   distances = {vertex: float('infinity') for vertex in graph}
   distances[start] = 0
   priority_queue = [(0, start)]
   while priority_queue:
       current_distance, current_vertex = heapq.heappop(priority_queue)
       if current_distance > distances[current_vertex]:
           continue
       for neighbor, weight in graph[current_vertex].items():
           distance = current_distance + weight
           if distance < distances[neighbor]:
               distances[neighbor] = distance
               heapq.heappush(priority_queue, (distance, neighbor))
   return distances
  1. Пример графа в виде словаря смежности

graph = {

   'A': {'B': 1, 'C': 4},
   'B': {'A': 1, 'C': 2, 'D': 5},
   'C': {'A': 4, 'B': 2, 'D': 1},
   'D': {'B': 5, 'C': 1}

}

print(dijkstra(graph, 'A')) </syntaxhighlight>

Химическая аналогия

Процесс поиска кратчайшего пути можно сравнить с диффузией вещества в среде с переменной проводимостью. Рассмотрим реакцию диффузии ионов через мембрану:

<chem>Na^+_{(aq)} + Cl^{-}_{(aq)} ->[\text{diffusion}] Na^+_{(membrane)} + Cl^{-}_{(membrane)}</chem>

Скорость перемещения ионов аналогична «весу» ребра в графе — чем выше проводимость (меньше сопротивление), тем быстрее ион достигает цели, что соответствует меньшему весу ребра в алгоритме Дейкстры.

Примечания

Шаблон:Примечания <ref name="Dijkstra1959">Шаблон:Статья</ref> <ref name="Cormen">Шаблон:Книга</ref>

См. также

Литература

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты