Algorytm Dijkstry

Algorytm Dijkstry jest jednym z najważniejszych algorytmów stosowanych w informatyce do znajdowania najkrótszej ścieżki w grafie o nieujemnych wagach krawędzi. Algorytm został opracowany przez Edsgera Dijkstrę w 1956 roku i jest szeroko stosowany w różnych aplikacjach, takich jak nawigacja GPS, analiza sieci komputerowych czy optymalizacja tras.

Opis algorytmu Dijkstry

Algorytm Dijkstry działa na grafach skierowanych i nieskierowanych, w których wagi krawędzi są nieujemne. Algorytm znajduje najkrótszą ścieżkę z danego wierzchołka początkowego do wszystkich pozostałych wierzchołków w grafie.

Kroki algorytmu Dijkstry

1. Inicjalizacja
Ustaw odległość do wierzchołka początkowego na 0 i odległość do wszystkich innych wierzchołków na nieskończoność.
Umieść wszystkie wierzchołki w zbiorze nieodwiedzonych wierzchołków.

2. Wybór wierzchołka
Wybierz wierzchołek z najmniejszą odległością ze zbioru nieodwiedzonych wierzchołków (na początku będzie to wierzchołek początkowy).

3. Aktualizacja odległości
Dla wybranego wierzchołka, sprawdź wszystkich jego sąsiadów.
Jeśli suma odległości od wierzchołka początkowego do sąsiada przez wybrany wierzchołek jest mniejsza niż obecnie znana odległość do sąsiada, zaktualizuj odległość do sąsiada.

4. Odwiedzenie wierzchołka
Przenieś wybrany wierzchołek ze zbioru nieodwiedzonych do zbioru odwiedzonych.

5. Powtórzenie
Powtarzaj kroki 2-4, aż wszystkie wierzchołki zostaną odwiedzone.

Implementacja algorytmu Dijkstry w języku Python

Poniżej przedstawiono implementację algorytmu Dijkstry w Pythonie:

import heapq
def dijkstra(graph, start):
    # Inicjalizacja odległości
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    # Kolejka priorytetowa do przechowywania wierzchołków do odwiedzenia
    priority_queue = [(0, start)]
    while priority_queue:
        current_distance, current_vertex = heapq.heappop(priority_queue)
        # Sprawdzenie wszystkich sąsiadów obecnego wierzchołka
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            # Jeśli znaleziono krótszą ścieżkę do sąsiada, zaktualizuj odległość
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))
    return distances
# Przykładowy graf reprezentowany jako słownik
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}
}
start_vertex = 'A'
distances = dijkstra(graph, start_vertex)
print(distances)

Złożoność obliczeniowa algorytmu Dijkstry

  • Złożoność czasowa - O(E log ⁡V), gdzie E to liczba krawędzi, a V to liczba wierzchołków. Użycie kolejki priorytetowej pozwala na efektywne zarządzanie wierzchołkami.
  • Złożoność pamięciowa - O(V+E), ponieważ musimy przechowywać wszystkie wierzchołki, krawędzie oraz strukturę danych do przechowywania kolejki priorytetowej.

Zastosowania algorytmu Dijkstry - przykłady

Algorytm Dijkstry jest stosowany w wielu dziedzinach, takich jak:

  • nawigacja GPS - przy znajdowaniu najkrótszych tras.
  • sieci komputerowe - przy optymalizacji tras przesyłania danych.
  • logistyka - przy optymalizacji tras dostaw.

Algorytm Dijkstry jest potężnym narzędziem do znajdowania najkrótszych ścieżek w grafach z nieujemnymi wagami. Dzięki efektywności czasowej i pamięciowej jest szeroko stosowany w różnych aplikacjach inżynieryjnych i naukowych.

Komentarze