Bölüm 18: En Kısa Yol ve Aktivite Ağları

Dijkstra, topolojik sıra ve kritik yol
Tek kaynakDijkstraYol geri kurmaDAGTopolojik sıraKritik yol
C ile Veri Yapıları · İki ciltlik ders notları temel alınmıştır

Hazırlık

Başlamadan Önce

C ön bilgisi

Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.

İlk kavram

Tek kaynak ve Dijkstra

Bu bölümün hedefi

Negatif olmayan ağırlıklarda kesinleşen en küçük uzaklığı seçmek.

Başlangıç sorusu

Gevşetme nedir?

Giriş

Öğrenme Çıktıları

Dijkstra uygulamak

Negatif olmayan ağırlıklarda kesinleşen en küçük uzaklığı seçmek.

Yolu geri kurmak

Öncül dizisiyle hedef-kaynak yolunu üretmek.

Topolojik sıra bulmak

Öncül sayısı sıfır olan düğümleri sistemli işlemek.

Kritik yolu yorumlamak

Erken/geç zaman ve bolluk üzerinden proje süresini belirlemek.

Temel Kavramlar

Uzaklık ve öncül birlikte tutulur

En kısa mesafeyi bilmek yetmez; yolu üretmek için her gevşetmede en iyi öncül de kaydedilir.

Gevşetme

dist[u]+w(u,v) daha küçükse v güncellenir.

Kesinleşme

En küçük geçici uzaklık artık değişmez.

Topolojik sıra

Her öncül, ardılından önce gelir.

Bolluk

Aktivitenin projeyi geciktirmeden kaydırılabileceği süre.

Temel Kavramlar

Kavram Haritası

1Tek kaynak
2Dijkstra
3Yol geri kurma
4DAG
5Topolojik sıra
6Kritik yol
En kısa mesafeyi bilmek yetmez; yolu üretmek için her gevşetmede en iyi öncül de kaydedilir.

Gösterim

Dijkstra'nın karar tablosu

DüğümGeçici uzaklıkÖncülDurum
A0—kesin
B4Akesin
C7Baday
D∞—aday

C ile Gerçekleştirim

Uzaklık ve öncül dizileri

typedef struct { int dugum; long uzaklik; } Aday;
long *uzaklik;
int *onceki;
bool *kesin;
Tür tanımı veri yapısının bellekteki biçimini; yordamlar ise bu yapı üzerindeki davranışı kurar.

C ile Gerçekleştirim

C'de Bellek ve Sahiplik

Sahip kim?

Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.

Yaşam süresi

Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.

Sınırlar

Boyut, kapasite ve geçerli indisleri her işlemde koru.

Boş durum

NULL, boş yapı ve tek öğe durumlarını özellikle negatif ağırlıkta dijkstra kullanmak riskiyle birlikte test et.

Temel İşlemler

Kenar gevşetme

long yeni = uzaklik[u] + e->agirlik;
if (yeni < uzaklik[e->hedef]) {
    uzaklik[e->hedef] = yeni;
    onceki[e->hedef] = u;
    pq_ekle(&adaylar, e->hedef, yeni);
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Gevşetme nedir?

Değişmez

Her adımda gevşetme kuralı korunuyor mu?

Son koşul

Öncül dizisiyle hedef-kaynak yolunu üretmek.

Hata yolu

Sonsuz uzaklığa ağırlık ekleyip taşma oluşturmak

Adım Adım

Topolojik sıra üret

Dereceleri say

Her düğümün giriş derecesini hesapla.

Sıfırları koy

Giriş derecesi 0 olanları yığın veya kuyruğa ekle.

Sil ve azalt

Düğümü çıktıya yaz; çıkan kenarların hedef derecelerini azalt.

Döngüyü bul

Yazılan düğüm sayısı V'den küçükse çizgede döngü vardır.

Sınıf Notu

Dersten Sesler

“Bir yordam int döndürüyor da nereye dönüyor? Seninki havada duruyor! Sonucu kullanacaksın.”
“Döngü varsa proje hiç bitmeyecektir; iki iş karşılıklı birbirini bekliyor demektir.”

Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.

Analiz

Karmaşıklık Özeti

İşlemZamanEk bellek
Dijkstra + heapO((V+E) log V)O(V+E)
Dijkstra + matrisO(V²)O(V)
Yolu geri kurmaO(yol uzunluğu)O(yol uzunluğu)
Topolojik sıraO(V+E)O(V)
Kritik yolO(V+E)O(V)

n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı

Tasarım Kararı

Hangi Durumda Hangisi?

BFS

Ağırlıkların tümü eşitse.

Dijkstra

Ağırlıklar negatif değilse.

DAG en kısa yol

Çizge döngüsüzse topolojik sırayla.

Kritik yol

Aktivitelerin bağımlılık ve süreleri proje zamanını belirliyorsa.

Dikkat

Sık Yapılan Hatalar

1Negatif ağırlıkta Dijkstra kullanmak
2Sonsuz uzaklığa ağırlık ekleyip taşma oluşturmak
3Öncül dizisini güncellememek
4Topolojik sırayı yönsüz çizgeye uygulamak

Alıştırmalar

Kendini Sına

  1. Gevşetme nedir?
  2. Dijkstra hangi ağırlıkları kabul eder?
  3. Yol nasıl geri kurulur?
  4. Topolojik sıra ne zaman vardır?
  5. Bolluğu sıfır aktivite neyi gösterir?
Cevapları göster
  1. Bir kenar üzerinden daha kısa yol bulunursa uzaklık ve öncülü güncellemektir.
  2. Negatif olmayanları.
  3. Hedeften önceki dizisini izleyip diziyi ters çevirerek.
  4. Yönlü döngüsüz çizgede.
  5. Kritik aktiviteyi.

Uygulama

Mini Laboratuvar

1 · Çiz

Gevşetme nedir?

2 · Kodla

Yol nasıl geri kurulur?

3 · Ölç

Bolluğu sıfır aktivite neyi gösterir?

Teslim: küçük bir C modülü, üç uç test ve zaman/bellek karmaşıklığı tablosu.

Özet

Bölüm Özeti

Mesafe + yol

Uzaklık kadar öncül de saklanır.

DAG sırası

Bağımlılıklar doğrusal işleme düzenine dönüşür.

Kritik işler

Sıfır bolluk proje süresini belirler.

Özet

Kaynaklar ve Devam

Son

Bölüm 18: En Kısa Yol ve Aktivite Ağları
Ders planına dön
1 / 1 C ile Veri Yapıları