2026-07-26

Dijkstra Algoritması: En Kısa Yol Bulma Algoritması

Dijkstra Algoritması: En Kısa Yol Bulma Algoritması

Dijkstra algoritması, bilgisayar bilimlerinin en önemli ve en çok kullanılan algoritmalarından biridir. Graf teorisinde, ağırlandırılmış (weighted) bir graf üzerinde, kaynak bir düğümden diğer tüm düğümlere olan en kısa yolları bulmak için tasarlanmıştır. Algoritma, kenar ağırlıklarının negatif olmadığı durumlarda garantiyle doğru sonuç verir.

Tarihçe

Algoritma, Hollandalı bilgisayar bilimcisi Edsger W. Dijkstra tarafından 1956 yılında geliştirilmiştir. Dijkstra, o dönemde ARMAC (Amsterdam'daki matematik merkezi) için bir bilgisayar tasarımı üzerinde çalışırken bu algoritmayı bulduğunu söyler. 1959 yılında resmî olarak yayımlanmıştır. Algoritma, günümüzde navigasyon sistemlerinden (Google Maps, Yandex Navi), ağ yönlendirmesine (routing), oyun yapay zekâsına ve birçok optimizasyon problemine kadar geniş bir kullanım alanına sahiptir.

Temel Kavramlar

  • Graf (Graph): Düğümler (vertices/nodes) ve bunları birbirine bağlayan kenarlardan (edges) oluşur.
  • Yönlü/Yönsüz Graf: Kenarlar tek yönlü veya çift yönlü olabilir.
  • Ağırlık (Weight): Kenarların üzerindeki sayısal maliyet (mesafe, süre, ücret vb.).
  • Kaynak Düğüm (Source): En kısa yolların hesaplanacağı başlangıç noktası.

Dijkstra, açgözlü (greedy) bir algoritmadır. Her adımda “şu anda en umut verici” görünen düğümü seçer ve bu seçimden asla vazgeçmez.

Algoritmanın Çalışma Prensibi

  1. Tüm düğümlere sonsuz mesafe atayın (kaynak düğüme 0).
  2. Tüm düğümleri “ziyaret edilmemiş” olarak işaretleyin.
  3. Kaynak düğümü öncelik sırasına (priority queue) koyun.
  4. Öncelik kuyruğu boş olana kadar tekrarlayın:
    • En küçük mesafeye sahip ziyaret edilmemiş düğümü seçin.
    • Bu düğümü “ziyaret edilmiş” olarak işaretleyin.
    • Komşularını kontrol edin: Eğer komşuya giden yeni yol, bilinen mesafeden daha kısaysa, mesafeyi güncelleyin ve öncelik kuyruğuna ekleyin.

Önemli Kural: Bir düğüm ziyaret edildikten sonra (settled), o düğüme olan en kısa mesafe kesinleşmiştir. Artık değiştirilemez.

Adım Adım Örnek

Aşağıdaki basit grafı ele alalım:

Düğümler: A, B, C, D, E
Kaynak: A

Kenarlar ve ağırlıklar:

  • A → B: 4
  • A → C: 2
  • C → B: 1
  • C → D: 7
  • B → D: 3
  • B → E: 6
  • D → E: 2

Adımlar:

  1. Başlangıç:
    Mesafeler: A=0, B=∞, C=∞, D=∞, E=∞
    Ziyaret: Hiçbiri

  2. A’yı ziyaret et (mesafe 0).
    Güncellemeler: B=4, C=2

  3. C’yi ziyaret et (en küçük = 2).
    Güncellemeler: B=min(4, 2+1)=3, D=2+7=9

  4. B’yi ziyaret et (en küçük = 3).
    Güncellemeler: D=min(9, 3+3)=6, E=3+6=9

  5. D’yi ziyaret et (en küçük = 6).
    Güncellemeler: E=min(9, 6+2)=8

  6. E’yi ziyaret et (en küçük = 8).
    Bitti.

Sonuç:
A’dan E’ye en kısa yol mesafesi 8’dir (örnek yol: A→C→B→D→E).

Pseudocode (Sözde Kod)

function Dijkstra(Graf, kaynak):  
    mesafe = {tüm düğümler: sonsuz}  
    mesafe[kaynak] = 0  
    öncelik_kuyruğu = [(0, kaynak)]  # (mesafe, düğüm)  
    ziyaret_edildi = set()  
  
    while öncelik_kuyruğu:  
        u = en_küçük_mesafeli_düğümü_al(öncelik_kuyruğu)  
        if u in ziyaret_edildi: continue  
        ziyaret_edildi.add(u)  
  
        for her komşu v ve ağırlık w of u:  
            if v ziyaret_edilmediyse:  
                yeni_mesafe = mesafe[u] + w  
                if yeni_mesafe < mesafe[v]:  
                    mesafe[v] = yeni_mesafe  
                    öncelik_kuyruğu'ya ekle(yeni_mesafe, v)  
      
    return mesafe  

Zaman Karmaşıklığı

  • Naive (basit dizi ile): O(V²) — V = düğüm sayısı
  • İkili Heap (Binary Heap) ile: O((V + E) log V) — E = kenar sayısı
  • Fibonacci Heap ile (teorik olarak en iyi): O(E + V log V)

Günlük uygulamalarda binary heap versiyonu en çok tercih edilir.

Avantajlar ve Sınırlamalar

Avantajlar:

  • Kolay anlaşılır ve implemente edilir.
  • Negatif ağırlık olmayan graf’larda optimaldir.
  • Çok hızlıdır (özellikle seyrek graf’larda).

Sınırlamalar:

  • Negatif ağırlık varsa çalışmaz (negatif ağırlıklar için Bellman-Ford algoritması kullanılır).
  • Negatif ağırlık döngüsü varsa (negative cycle) en kısa yol problemi tanımsızdır.
  • Tüm çiftler arası en kısa yol için (All-Pairs) Floyd-Warshall daha uygundur.

Gerçek Dünya Uygulamaları

  • Navigasyon sistemleri: En kısa rota hesaplama (Google Maps, Apple Maps).
  • Ağ yönlendirme protokolleri (OSPF).
  • Oyun geliştirme: Karakterlerin en kısa yoldan hareket etmesi.
  • Lojistik ve tedarik zinciri optimizasyonu.
  • Robotik: Engelli alanda en kısa yol planlama.
  • Sosyal ağ analizleri ve öneri sistemleri.

İyileştirmeler ve Varyasyonlar

  • A Algoritması*: Dijkstra’nın heuristik (tahmini) bilgi kullanan hali. Özellikle oyunlarda ve harita rotalarında çok daha hızlıdır.
  • Bidirectional Dijkstra: Hem kaynaktan hem hedeften aynı anda arama yaparak performansı artırır.
  • Paralel ve dağıtık versiyonları (büyük graf’lar için).

Sonuç

Dijkstra algoritması, “açgözlü seçim” stratejisinin ne kadar güçlü olabileceğini gösteren klasik bir örnektir. Basit görünmesine rağmen, modern teknolojinin altyapısında sessizce çalışan temel taşlardan biridir. Anlamak, veri yapıları (priority queue) ve graf algoritmaları konusunda sağlam bir temel oluşturur.

Hiç yorum yok: