Bölüm 11: Çizgeler

İlişkiler, dolaşımlar ve yol problemleri
Düğüm/kenarGösterimDFSBFSYayılım ağacıEn kısa 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

Düğüm/kenar ve Gösterim

Bu bölümün hedefi

Yön, ağırlık, derece, yol, döngü ve bağlılık kavramlarını kullanmak.

Başlangıç sorusu

Çizge ile ağaç arasındaki temel fark nedir?

Giriş

Öğrenme Çıktıları

Çizgeyi tanımlamak

Yön, ağırlık, derece, yol, döngü ve bağlılık kavramlarını kullanmak.

Gösterim seçmek

Komşuluk matrisi ve listesini yoğunluğa göre karşılaştırmak.

Dolaşmak

DFS ve BFS algoritmalarını doğru yardımcı yapıyla uygulamak.

Problemi eşlemek

MST, en kısa yol ve topolojik sıralama problemlerini ayırmak.

Temel Kavramlar

Çizge birçoğa-birçok ilişkiyi modeller

Ağaçtan farklı olarak bir düğüme birden çok yoldan ulaşılabilir ve döngüler bulunabilir.

Yönsüz

Kenar iki yönde ilişki kurar.

Yönlü

(u,v) ile (v,u) farklı olabilir.

Ağırlıklı

Kenar maliyet, mesafe veya süre taşır.

Bağlı

Her düğüm çifti arasında bir yol vardır.

Temel Kavramlar

Kavram Haritası

1Düğüm/kenar
2Gösterim
3DFS
4BFS
5Yayılım ağacı
6En kısa yol
Ağaçtan farklı olarak bir düğüme birden çok yoldan ulaşılabilir ve döngüler bulunabilir.

Gösterim

Gösterim seçimi çizgenin yoğunluğuna bağlıdır

ÖzellikKomşuluk matrisiKomşuluk listesi
BellekO(V²)O(V+E)
Kenar var mı?O(1)O(deg(v))
Komşuları dolaşO(V)O(deg(v))
Uygun durumyoğunseyrek

C ile Gerçekleştirim

Komşuluk listesi

typedef struct Kenar {
    int hedef, agirlik;
    struct Kenar *sonraki;
} Kenar;

typedef struct {
    size_t dugum_sayisi;
    Kenar **komsu;
} Cizge;
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 ziyaret işaretini çok geç koyup düğümü tekrar kuyruğa eklemek riskiyle birlikte test et.

Temel İşlemler

Önce derinliğine arama

void dfs(const Cizge *g, int v, bool ziyaret[]) {
    ziyaret[v] = true;
    printf("%d ", v);
    for (Kenar *e = g->komsu[v]; e; e = e->sonraki)
        if (!ziyaret[e->hedef])
            dfs(g, e->hedef, ziyaret);
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Çizge ile ağaç arasındaki temel fark nedir?

Değişmez

Her adımda yönsüz kuralı korunuyor mu?

Son koşul

Komşuluk matrisi ve listesini yoğunluğa göre karşılaştırmak.

Hata yolu

Yönlü çizgede ters kenarı kendiliğinden var saymak

Adım Adım

BFS neden kuyruk kullanır?

Başlat

Kaynağı ziyaret et ve kuyruğa ekle.

Önden al

Sıradaki düğümün henüz görülmemiş tüm komşularını keşfet.

Arkaya ekle

Yeni komşuları kuyruğun arkasına koy; böylece katman sırası korunur.

Bitir

Kuyruk boşaldığında erişilebilir tüm düğümler en az kenar sayısı sırasıyla görülmüştür.

Sınıf Notu

Dersten Sesler

“Aklınıza gelen ilk çözüm iyi bir yöntem olmayabilir. Veri yapısını değiştirince n³, n'e inebilir.”
“Döngü varsa proje hiç bitmeyecektir. Çizgedeki bir ok bazen bütün takvimi kilitler.”

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
BFS, listeO(V+E)O(V)
DFS, listeO(V+E)O(V)
Kenar sorgusu, matrisO(1)O(V²) toplam
Dijkstra (heap)O((V+E) log V)O(V+E)
KruskalO(E log E)O(V+E)

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ıksız en kısa yol ve katman dolaşımı.

DFS

Bileşen, döngü, topolojik düşünme ve geri izleme.

Dijkstra

Negatif olmayan ağırlıklarda tek kaynaktan en kısa yol.

Prim/Kruskal

Tüm düğümleri en düşük toplam maliyetle bağlayan yayılım ağacı.

Dikkat

Sık Yapılan Hatalar

1Ziyaret işaretini çok geç koyup düğümü tekrar kuyruğa eklemek
2Yönlü çizgede ters kenarı kendiliğinden var saymak
3Negatif kenarla Dijkstra kullanmak
4Komşuluk matrisi ve liste karmaşıklıklarını karıştırmak

Alıştırmalar

Kendini Sına

  1. Çizge ile ağaç arasındaki temel fark nedir?
  2. Seyrek çizgede hangi gösterim uygundur?
  3. DFS hangi yapıyı doğal olarak kullanır?
  4. BFS ne zaman en kısa yol verir?
  5. Minimum yayılım ağacı ile en kısa yol ağacı aynı şey midir?
Cevapları göster
  1. Çizgede döngü ve bir düğüme birden çok yol olabilir.
  2. Komşuluk listesi.
  3. Yığın veya özyineli çağrı yığını.
  4. Tüm kenarlar eşit maliyetliyse/ağırlıksızsa.
  5. Hayır; amaç fonksiyonları farklıdır.

Uygulama

Mini Laboratuvar

1 · Çiz

Çizge ile ağaç arasındaki temel fark nedir?

2 · Kodla

DFS hangi yapıyı doğal olarak kullanır?

3 · Ölç

Minimum yayılım ağacı ile en kısa yol ağacı aynı şey midir?

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

Özet

Bölüm Özeti

Gösterim önemlidir

V ve E büyüklükleri maliyeti belirler.

DFS ve BFS temel araçtır

Birçok ileri algoritmanın başlangıcıdır.

Problemi doğru sınıflandır

En kısa yol, MST ve topolojik sıra farklı hedeflerdir.

Özet

Kaynaklar ve Devam

Son

Bölüm 11: Çizgeler
Ders planına dön
1 / 1 C ile Veri Yapıları

← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt