Çizge Algoritmalari 5. ders
ÇİZGE GÖSTERİMLERİ G = (V, E) çizgesinin komşuluk listesi yöntemi ile gösterimi V den olan her köşe için V sayıda listenin olduğu bir dizidir. Her Adj[u] listesi u köşesinin bir kirişle bağlı olduğu tüm v köşelerini içerir. (rastgele olarak) Bu yöntem hem yönlü, hem de yönsüz çizgelerde kullanılabilir. 1 2 5 / 1 2 5 4 3 2 1 5 3 4 / 3 2 4 4 2 5 3 / 5 4 1 2 Yönsüz çizge
KOMŞULUK LİSTESİ GÖSTERİMİNİN ÖZELLİKLERİ Tüm komşuluk listelerinin uzunlukları toplamı, Yönlü çizgede: = Her (u, v) kirişi u köşesinin listesinde sadece bir defa vardır. Yönsüz çizgede:= Her (u, v) kirişi hem u köşesinin hem de v köşesinin listesinde bulunur. 1 2 3 4 E Yönlü çizge 1 2 5 4 3 2 E Yönsüz çizge
KOMŞULUK LİSTESİ GÖSTERİMİNİN ÖZELLİKLERİ Hafıza gereksinimi (V + E) Tercih edildiği zaman: Seyrek çizgelerde, yani eğer E << V 2 Dezavantajı Verilen u ve v köşeleri arasında kiriş olup olmadığını kontrol etmenin hızlı yolu yoktur u köşesinin tüm komşularını listeleme zamanı: (degree(u)) (u, v) E koşulunun kontrolü için gereken süre: O(degree(u)) 1 2 5 4 3 Yönsüz çizge 1 2 3 4 Yönlü çizge
Çizge Gösterimleri G = (V, E) çizgesinin komşuluk matrisi ile gösterimi Tüm köşeler 1, 2, … V olarak numaralandırılmış olsun .Gösterim aşağıdaki gibi tanımlanan bir A V x V : aij = 1, eğer (i, j) E 0, aksi halde 1 2 3 4 5 A matrisi simetriktir: aij = aji A = AT 1 1 2 1 1 2 5 4 3 3 1 4 1 5 1 Yönsüz çizge
KOMŞULUK MATRİSİ GÖSTERİMİNİN ÖZELLİKLERİ Hafıza gösterimi (V2), G de bulunan kiriş sayısından bağımsız olarak Tercih edildiği zaman Çizge yoğun çizge ise, yani E yaklaşık eşit V 2 2 köşe arasında kiriş olup olmadığını hızlı kontrol etmek gerekirse u köşesinin tüm komşularının listesini bulmak için gereken süre: (V) (u, v) E kontrolü için gereken süre: (1)
AğİrlIklI Çizgeler Yönlü Çizgeler = her kirişi için w(u, v) ağırlığı tanımlanan çizgeler, yani w: E R, ağırlık fonksiyonu veriliyor Ağırlıkları da hafızada tutmak gerekir Komşuluk listesi gösteriminde: w(u,v) sayısı u’nun komşuluk listesinde v nin yanında tutuluyor Komşuluk matrisi gösteriminde: w(u, v) sayısı komşuluk matrisinin (u, v) hücresinde tutuluyor
Çizgelerde Arama Çizgelerde arama = kirişlerden sistemli bir biçimde geçerek çizgenin köşelerinde bulunmak İki temel arama algoritması vardır: Genişlik öncelikli arama (Breadth-first search(BFS)) Derinlik öncelikli arama (Depth-first search(DFS)) Bu iki algoritma arasındaki fark: köşelerin her algoritma için farklı sıra ile ziyaret edilmesi
GENİŞLİK ÖNCELİKLİ ARAMA(BFS) Giriş: G = (V, E) çizgesi (yönlü veya yönsüz) Başlangıç (kaynak) köşesi s V Amaç: G çizgesinin s den ulaşılabilir olan tüm köşelerini «keşfetmek» için kirişleri üzerinde gezinmek (öncelikle s köşesine daha yakın olan köşeleri «keşfetmek» koşuluyla) Çıkış: d[v] = s den v ye olan uzaklık (en az kiriş sayısı), her v V için s köşesinden ulaşılabilir tüm köşelerin oluşturduğu derinlik öncelikli ağaç (BFT)
GENİŞLİK ÖNCELİKLİ ARAMA(BFS) Köşeler s kaynak köşesinden uzaklıklarının artan sırası ile keşfediliyorlar, yani derinlemesine değil, genişlemesine arama yapılıyor 1 2 5 4 3 11 12 6 7 9
GENİŞLİK ÖNCELİKLİ ARAMA(BFS) Arama sırasında iz bırakma: Her köşeyi beyaz, gri veya siyah renge boyama Başlangıçta her köşe beyaz olur Keşfedilmeye başlanan köşe gri olur Bir köşenin tüm komşuları keşfedildiğinde bu köşe siyah olur Gri köşelerin FIFO (Önce giren önce çıkar) mantıklı Q kuyruğu oluşturulur. kaynak 1 2 5 4 3 1 2 5 4 3 1 2 5 4 3
GENİŞLİK ÖNCELİKLİ AĞAÇ (BFT) BFS algoritması BFT oluşturur: Başlangıçta sadece kökü var (kaynak köşe s) v köşesi u köşesinin komşuluk listesi taranırken bulunduysa v köşesi ve (u, v) kirişi ağaca eklenir u köşesi BFT ağacında v köşesinin selefi(velisi) olur Her köşe sadece 1 defa keşfedilir her köşenin en fazla bir velisi vardır kaynak 1 2 5 4 3
BFS için ek veri yapıları G = (V, E) komşuluk listesi ile verilmiş olsun color[u] – her u V için renk [u] – u köşesinin velisi Eğer u = s (kök) veya u halen keşfedilmemişse [u] = NIL d[u] – s den u ya uzaklık Gri köşelerin FIFO mantıklı kuyruğu Q kaynak d=1 =1 1 2 5 4 3 d=2 =2 d=1 =1 d=2 =5
BFS(G, s) for each u V[G] - {s} do color[u] WHITE d[u] ← x y for each u V[G] - {s} do color[u] WHITE d[u] ← [u] = NIL color[s] GRAY d[s] ← 0 [s] = NIL Q Q ← ENQUEUE(Q, s) r s t u v w x y r s t u v w x y Q: s
BFS(V, E, s) while Q do u ← DEQUEUE(Q) for each v Adj[u] r s t u v w x y while Q do u ← DEQUEUE(Q) for each v Adj[u] do if color[v] = WHITE then color[v] ← GRAY d[v] ← d[u] + 1 [v] = u ENQUEUE(Q, v) color[u] BLACK Q: s 1 r s t u v w x y Q: w 1 r s t u v w x y Q: w, r
Örnek r s t u v w x y 1 r s t u v w x y v w x y 1 2 r s t u Q: s r s t u v w x y 1 r s t u v w x y v w x y 1 2 r s t u Q: s Q: w, r Q: r, t, x 1 2 r s t u v w x y 1 2 3 r s t u v w x y 1 2 3 r s t u v w x y Q: t, x, v Q: x, v, u Q: v, u, y 1 2 3 r s t u v w x y 1 2 3 r s t u v w x y r s t u 1 2 3 v w x y Q: u, y Q: y Q:
BFS Analİzİ for each u V - {s} do color[u] WHITE d[u] ← [u] = NIL color[s] GRAY d[s] ← 0 [s] = NIL Q Q ← ENQUEUE(Q, s) O(V) (1)
BFS Analİzİ while Q do u ← DEQUEUE(Q) for each v Adj[u] (1) do if color[v] = WHITE then color[v] = GRAY d[v] ← d[u] + 1 [v] = u ENQUEUE(Q, v) color[u] BLACK Adj[u] taranıyor her köşe için Her köşe bir defa tüm komşuluk listeleri toplamı= (E) tarama zamanı: O(E) (1) (1) Toplam süre BFS = O(V + E)
EN KISA YOL ÖZELLİĞİ BFS algoritması s V den çizgenin her köşesine olan en kısa yolu buluyor En kısa yol uzunluğu = (s, u) Yani s den u ya olan yoldaki minimum kiriş sayısı kaynak r s t u 1 2 3 v w x y