COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Graf temelleri ve yollar · 25 / 53

Graf modeli ve adjacency temsilleri

Anla → iz sür → uygula → gerekçelendir

2 dk okuma · uygulama için ayrıca zaman ayır

Graf G=(V,E), nesneleri ve aralarındaki ilişkileri tanımlar. Yönlü/yönsüz, ağırlıklı/ağırlıksız, multigraph, self-loop ve bağlantısız bileşenler sözleşmede belirtilmelidir. Yönsüz edge listesinde bir ilişki, adjacency listesinde çoğunlukla iki komşuluk kaydıdır; E sayımını karıştırma.

Adjacency matrix V² hücre kullanır ve edge lookup O(1)'dir; komşu tarama O(V). Adjacency list O(V+E) alan ve degree kadar komşu taraması sağlar; düz listede belirli edge lookup O(degree). Edge list Kruskal gibi bütün kenarları sıralayan algoritmalara uygundur. Çok büyük graflarda CSR sıkıştırılmış ardışık komşulukla locality iyileştirir.

Düğüm etiketi ile array indeksi farklı olabilir. Önce etiketleri dense ID'lere eşle veya dictionary kullan. Grafı immutable snapshot mı canlı güncellenen yapı mı kabul ediyorsun? Traversal sırasında değişen adjacency iteration davranışını bozabilir. Her algoritmada yalnız root'tan erişilen düğümler ile bütün V'nin işlenmesini ayır.

Adım adım iz sürme

Edges A–B veB–C: list A:[B],B:[A,C],C:[B]; E=2 ama4 komşuluk kaydı var.

Maliyet ve varsayımlar

List O(V+E), matrix Θ(V²). Seyrek graf için matrix büyük alan israfı yaratabilir.

Çalıştırılabilir örnek

Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.

Python 3
def undirected_graph(vertices, edges):
    g = {v: [] for v in vertices}
    for a, b in edges:
        g[a].append(b); g[b].append(a)
    return g
assert undirected_graph("ABC", [("A","B"),("B","C")])["B"] == ["A","C"]

KAVRADIĞINI KONTROL ET

Sıra sende

Bir edge'in ağırlığı0 ise matrix'te0 yokluğu gösterebilir mi?

Çözümün mantığını göster

Hayır. None veya ayrı present mask gerekir. Yok kenar ile sıfır maliyetli kenar farklıdır.

Bir adım ileri

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.

Temel kaynaklar ve ders notları

Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.

MIT 6.006 · Introduction to Algorithms ↗
İlerlemeden önce alıştırmayı çöz.