290 likes | 771 Views
İçerik : Gra flar. Tanım Yönlendirilmiş ve y önlendirilmemiş graflar Ağırlıklı graflar Gösterim Komşuluk Matrisi Komşuluk Listesi Dolaşma Algoritmaları BFS ( Breath F irst Search ) DFS ( Depth-First Search ). Graflar.
E N D
İçerik: Graflar • Tanım • Yönlendirilmiş ve yönlendirilmemiş graflar • Ağırlıklı graflar • Gösterim • Komşuluk Matrisi • Komşuluk Listesi • Dolaşma Algoritmaları • BFS (BreathFirst Search) • DFS (Depth-First Search)
Graflar • Graf, matematiksel anlamda, düğümlerden ve bu düğümler arasındaki ilişkiyi gösteren kenarlardan oluşan bir kümedir. • Bağlantılı listeler ve ağaçlar grafların özel örneklerindendir. • Bir G grafı D ile gösterilen düğümlerden (node veya vertex) ve K ile gösterilen kenarlardan (Edge) oluşur. • Her kenar iki düğümü birleştirir. • Her kenar, iki bilgi (Düğüm) arasındaki ilişkiyi gösterir ve (u,v) şeklinde ifade edilir. • (u,v) iki düğümü göstermektedir.
Graflar - Örnek • G = (D, K) grafı aşağıda verilmiştir. • D = {A, B, C, D, E, F} • K = {(A, B), (A, D), (B, C), (C, D), (C, E), (D, E)} C B F A D E
Uygulama Alanları • Elektronik devreler • Baskı devre kartları (PCB) • Entegre devreler • Ulaşım Ağları • Otoyol Ağı • Havayolu Ağı • Bilgisayar Ağları • Lokal alan ağları • İnternet • Veritabanları • Entity-relationship diyagram
Graflar – Kenar Türleri • Yönlendirilmiş Kenar (Directed Edge) • Sıralı kenar çiftleri ile ifade edilir. • (u, v) ile (v, u) aynı değildir. • İlk kenar orijin ikinci kenar ise hedef olarak adlandırılır. • Yönlendirilmemiş Kenar (Undirected Edge) • Sırasız kenar çiftleri ile ifade edilir. • (u, v) ile (v, u) aynı şeyi ifade ederler. • Yönlendirilmiş Graf (Directed Graphs) • Bütün kenarları yönlendirilmiş graftır. • Digraph şeklinde de ifade edilirler. • Yönlendirilmemiş Graf (Undirected Graphs) • Hiçbir kenarı yönlendirilmemiş graftır.
Graflar - Tanımlar • Komşu(Adjacent): Eğer (u, v) ∈ K ise u ve v düğümleri komşudur. • (A, B) komşudur. • (B, D), (C, F) komşu değildir. C B F A D E
Graflar - Tanımlar • Graf kenarları üzerinde ağırlıkları olabilir. Eğer kenarlar üzerinde ağırlıklar varsa bu tür graflara ağırlıklı/maliyetli graf (Weighted Graphs) denir. • Ağırlık uygulamadan uygulamaya değişir. • Şehirler arasındaki uzaklık. • Routerler ararı bant genişliği
Graf Gösterimi • Zaman ve yer karmaşıklığı aşağıdaki her iki ifade ile de ölçülür. • Düğüm sayısı = |D| = n • Kenar sayısı = |K| = k • Graf gösterimi için iki farklı yol vardır. • Komşuluk matrisi • Komşuluk listesi
Komşuluk Matrisi Gösterimi • Komşuluk Matrisi Gösterimi: • 1 (u,v) K’nın içindeyse • 0 diğer M(u, v) = C B F A D E Yer? O(n2)
Komşuluk Matrisi Gösterimi • Komşuluk Matrisi Gösterimi (Ağırlıklı Graf): ağırlık(u, v) (u, v) K’nın içindeyse ∞ diğer M(u, v) = 20 C B 10 30 50 F A 5 15 D E
Komşuluk Listesi Gösterimi • Komşuluk Listesi: B D A B A C C B B E D C F A D A C E D E E C D F b a n*a + 2*b*k = O(n+2k) Yer?
Komşuluk Listesi Gösterimi • Komşuluk Listesi(Yönlendirilmiş Graflar) B A D C B B C F A C E D D E D E E F b a n*a + b*k = O(n+k) Yer?
Graf Üzerinde Dolaşma • Graf üzerinde dolaşma grafın düğümleri ve kenarları üzerinde istenen bir işi yapacak veya bir problemi çözecek biçimde hareket etmektir. • Graf üzerinde dolaşma yapan birçok yaklaşım yöntemi vardır. En önemli iki tanesi aşağıda listelenmiştir. • BFS (Breadth First Search) Yöntemi • DFS (Depth First Search ) Yöntemi
Graf Üzerinde Dolaşma • Breath-First Search (BFS): • Başlangıç düğümünden başla ve tüm komşuları ziyaret et. • Daha sonra komşunun komşularını ziyaret et. • Başlangıç düğümünden başlayıp dışa doğru dalga gibi. • Depth-First Search (DFS) • Bir düğümden başla düğümün bir kenarında o kenar üzerinde gidilebilecek en uzak düğüme kadar sürdür. • Geri gel ve düğer kenarı dene • Tüm düğümler gezilene kadar devam et.
Breath-First Search (BFS) • Verilen G = (D, K) grafında,“s” başlangıç düğümünden başla ve s den erişilebilecek düğümleri belirle. • Bulunan ama işlenmeyen düğümler sınır düğümleridir (gri düğümler). • Sınır düğümlerine sırası ile gidilir ardından bunların komşuları bulunur ve bu komşulara gidilir. 3 2 3 1 2 2 s 3 1 2 2 1 2 3 3
Breath-First Search (BFS) • İşlem adımları: • Seçilen düğümün tüm komşuları sırasıyla seçilir ve ziyaret edilir. • Her komşu kuyruk içerisine atılır. • Komşu kalmadığında Kuyruk içerisindeki ilk düğüm alınır ve 2. adıma gidilir.
Breath-First Search (BFS) • Sonuçların gösterilmesi • Her bir v düğümü için, d[v]’yi (s ve v arasındaki uzaklığı) kaydetmemiz gerekiyor. • “v” ve “s” düğümleri arasındaki uzaklık, “s” den “v” ye giden yol üzerindeki minimum düğüm sayısıdır. • Dolayısıyla d[s] = 0 • Ayrıca aile (parent) düğümünü de tutmamız gerekiyor. v den s ye giderken yoldaki ilk düğüm • pred[s] = 0 (pred predecessor önceki)
BFS – Gerçekleştirimi • Başlangıçta tüm düğümler (başlangıç düğümü hariç) beyaza boyanır. Anlamı henüz bulunmadı demektir. • Düğüm bulunduğu zaman, griye boyanıyor. • Gri düğüm işlendiği zaman siyaha boyanıyor. 2 1 2 2 s s s 1 2 2 1 2
BFS – Gerçekleştirimi • Arama da kuyruk (FIFO) kullanılıyor. • Ayrıca dizi de kullanılır. • color[u], u düğümünün rengini tutar • Beyaz, gri veya siyah • pred[u], u düğümünün önceki düğümünü tutar • u’yu bulan düğüm • d[u], s den u’ya uzaklık 2 1 2 2 s s s 1 2 2 1 2
BFS Gerçekleştirimi BFS(G, s){ for each u in D- {s} { // İlk değerleri atama color[u] = white; d[u] = SONSUZ; pred[u] = NULL; } //end-for color[s] = GRAY; // s’nin ilk değerlerini atama d[s] = 0; pred[s] = NULL; K = {s}; // s’yi kuyruğa koy while (K boş değilken){ u = Cikart(K); // u bir sonraki düğüm for each v in Adj[u] { if (color[v] == white){ // Eğer v bulunmadı ise color[v] = gray; // … Bulundu şeklinde işaretle d[v] = d[u] + 1; // … uzaklığı ayarla pred[v] = u; // … öncekini ayarla Ekle(v); //… kuyruğa ekle } //end-if } //end-for color[u] = black; // u ile işimiz bitti } //end-while } //end-BFS O(n) n kez Çalışma Zamanı? O(n + k) O(1) O(k)
BFS - Örnek w w u v u v w u v 2 ∞ 2 ∞ 1 1 1 ∞ ∞ 2 2 ∞ ∞ ∞ 0 0 ∞ 0 1 1 1 ∞ t t s s t s x x x K: v, x K: x, u, w K: s w u v w u v w u v 2 1 2 2 1 2 2 1 2 3 ∞ 0 1 3 0 t 1 s 3 x 0 1 t s x t s x K: u, w K: w, t K:
BFS Ağacı s 0 • BSF nin önceki işaretçisini izleyerek ters ağaç oluşturulabilir. • BFS ağacı için bir çok olasılık vardır. Aramanın nerede başladığı ve düğümlerin hangi sıraya göre kuyruğa eklendiği önemlidir. w u v v x 1 1 2 1 2 u w 2 2 3 0 1 t x t 3
Depth-First Search (DFS) • Bir v düğümüne gidildikten sonra v düğümünün bir komşusu seçilir ve ziyaret edilir. • Ardından onun bir komşusu seçilir ve ard arda komşu seçimi yapılarak devam edilir. • Komşu kalmadığında geri dönülür.
DFS - Örnek DFS(a) ağacı f b b b f f a a a a c c c g g g b f c g e e e d d d d e
DFS - Gerçekleştirim • Yönlendirilmiş G = (V, E) grafının verildiğini düşünelim. • Aynı algoritma yönlendirilmemiş graflar için de çalışır. • 4 tane yardımcı dizi kullanıyoruz. • color[u] • White – bulunmamış • Gray – bulunmuş fakat işlenmemiş • Black – işlenmiş • pred[u], u’dan önceki eleman • u’yu bulan eleman • İki tane zaman tutucu • d[u]: Düğümün bulunma zamanı • BSF deki uzaklık ile karıştırmayın. • f[u]: Düğümün işlenme zamanı
DFS - Gerçekleştirim • DFS işlem adımları • Önce bir başlangıç düğümü seçilir ve ziyaret edilir. • Seçilen düğümün bir komşusu seçilir ve ziyaret edilir. • 2. adımda ziyaret edilecek komşu kalmayıncaya kadar devam edilir. • Komşu kalmadığında tekrar geri dönülür ve önceden ziyaret edilmiş düğümler için adım 2 ve 3 tekrarlanır.
DFS – Gerçekleştirim DFS(G, s){ for each u in V { // İlk değerleri atama color[u] = white; pred[u] = NULL; } //end-for time = 0; for each u in V if (color[u] == white) // Ziyaret edilmemiş düğüm bulundu DFSVisit(u); // Yeni bir aramaya başla } // end-DFS DFSVisit(u){ // u üzerinde yeni bir arama başlat color[u] = gray; // u’yu ziyaret edildi şeklinde işaretle d[u] = ++time; for each v in Adj[u] { if (color[v] == white){ // Eğer komşu v bulunmadı ise pred[v] = u; // … önceki olarak kaydet DFSVisit(v); // …v’yi ziyaret et } //end-if } //end-for color[u] = black; // u ile işimiz bitti. f[u] = ++time; } //end-while } //end-DFSVisit O(n) Çalışma Zamanı? O(n + k) O(k)
DFS - Örnek a d e d 11/14 C 1/10 f b b a C 2/5 f 6/9 e 12/13 F B c g 3/4 c 7/8 g C
Parantez Yapısı a • Zaman tutucu ile güzel bir yapı oluşturulabilir. • d[u] sol parantezi “(“ • f[u] sağ parantezi “)“ temsil eder. d 11/14 C 1/10 d a f b C 2/5 6/9 e 12/13 F B b e f 3/4 c 7/8 g C c g 9 6 10 5 4 2 3 7 8 11 12 13 14 1