Algoritmalar II Ders 11 Çizgeler. Çizgelerin bilgisayarda gösterimi. BFS algoritması
Çizgeler Çizge G=(V,E), ikilisine denir, burada V sonlu bir kümedir, E ise bu kümenin elemanları arasında ikili bir bağıntıdır. V kümesine G çizgesinin köşeler(vertex) kümesi denir. E kümesine ise G çizgesinin kirişler kümesi (edge set) denir. Çizgelerin 2 çeşidi vardır: yönlü ve yönsüz
Yönlü çizge örneği Öz-döngüler(Self-loops)-yani bir köşenin kendisinden kendisine kirişler olabilir. a d e b c f
Yönsüz çizgelere örnek f c a d b
Tanımlar Yönlü ve yönsüz çizgeler için bir çok tanım aynıdır. Sadece bazı kavramlar az da olsa farklılık göstermektedir. Eğer (u,v) yönlü G=(V,E) çizgesinin bir kirişi ise, (u,v) kirişi u köşesinden çıkıyor ve v köşesine giriyor denir. Eğer (u,v) yönsüz G=(V,E) çizgesinin bir kirişi ise, (u,v) kirişi u ve v köşelerini bağlıyor denir. Eğer (u,v) G=(V,E) çizgesinin bir kirişi ise v köşesi u köşesinin komşusudur (adjacent) denir.
Tanımlar Yönsüz bir çizgede bir köşesinin derecesi bu köşeye bağlı kirişlerin sayısına eşittir. 0 dereceli köşeye tecrit olunmuş(isolated) köşe denir. Yönlü çizgelerde, bir köşenin dış-derecesi bu köşeden çıkan kirişlerin sayısına eşittir. Yönlü çizgelerde, bir köşenin iç-derecesi bu köşeye giren kirişlerin sayısına eşittir. Yönlü çizgelerde, bir köşenin derecesi bu köşenin dış-derecesi ile iç-derecesinin toplamına eşittir.
Tanımlar Bir G=(V,E) çizgesinde u köşesinden w köşesine olan k uzunluklu yol, köşelerin (v0,v1,…,vk) dizisine denir, burada u=v0,w=vk ve {(v0,v1),(v1,v2),…(vk-1),vk)} kümesi E nin bir altkümesidir. Bir yolun uzunluğu bu yoldaki kiriş sayısına eşittir. Eğer u köşesinden w köşesine bir p yolu varsa w köşesi u köşesinden p yolu ile ulaşılabilirdir(reachable) denir. Bir yoldaki tüm köşeler birbirinden farklı ise bu yola basit (simple) yol denir.
Tanımlar Eğer yönlü bir çizgenin (v0,v1,…vk) yolunda v0=vk ve yolda en az bir kiriş varsa bu yola devir(cycle) denir. Eğer bir devirde başlangıç ve son köşe dışında diğer tüm köşeler farklı ise bu devire basit devir. Yönlü çizgede basit devirde öz-döngü olamaz. Yönsüz bir çizgede (v0,v1,…vk) yolunda k>=3, v0=vk ve başlangıç ve son köşeler dışında tüm köşeler farklı ise bu yola devir denir. Bir çizgede devir yoksa bu çizgeye devirsiz çizge denir.
Tanımlar Yönsüz bir çizgede her hangi 2 köşenin birinden diğerine yol varsa bu çizgeye bağlantılı (connected ) çizge denir. Bir çizgenin köşelerinin “ulaşılabilir” bağıntısının oluşturduğu denklik sınıflarına bağlantılı bileşenleri (connected components) denir. Yönlü bir çizgede eğer her hangi 2 köşe birbirinden ulaşılabilirse bu çizgeye kuvvetli bağlantılı (strongly connected) çizge denir. Yönlü bir çizgenin köşelerinin “karşılıklı ulaşılabilir” bağıntısının oluşturduğu denklik sınıflarına kuvvetli bağlantılı bileşenleri (strongly connected components) denir.
Tanımlar G1=(V1,E1) ve G=(V,E) çizgeleri için eğer V1 kümesi V nin ve E1 kümesi E nin altkümesi ise G1=(V1,E1) çizgesine G=(V,E) çizgesinin altçizgesi (subgraph) denir. Her hangi 2 köşesi bir birine komşe olan yönsüz bir çizgeye tam çizge(complete graph) denir. Yönsüz bir G=(V,E) çizgesinde V kümesi V1 ve V2 gibi 2 kümeye ayrılabiliyorsa ve bir (u,v) ikilisinin E nin elemanı olmasından ya u nun V1 de ve v nin V2 de olması ya da tam tersı u nun V2 de ve v nin V1 de oması çıkarsa bu çizgeye iki kümeli (biparite graph) çizge denir.
Çİ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
BFT Aşağıdaki algoritma s den v ye olan en kısa yolu yazıyor. (Bu algoritma BFS algoritması bittikten sonra çalıştırılmalıdır)
Print-Path(G,s,v) 1 if v=s 2 then print s 3 else if π[v]=NIL 4 then print “no path from” s “to” v “exists” 5 else Print-Path(G,s,π[v]) 6 print v