You are on page 1of 17

Design and Analysis of Algorithms

Zahra ELMI

Zahra.elmi@izu.edu.tr
Grafik Teorik Problemler

Temel tanımlar
Grafik Gösterimi
Grafik Geçişi (BFS, DFS)
Topolojik sıralama
Güçlü Bağlantılı BileşenlerEn
Kısa Yollar
Tek Kaynaklı Tüm Hedefler (Bellman-Ford, Dijkestra)
Tüm Çiftler (Floyd-Warshall, Johnson)
Minimum Yayılan Ağaç (Kruskal, Prim)
En Kısa Yollar
Tanım
Bize ağırlık fonksiyonu w: E → R olan G = (V, E ) ağırlıklı bir yönlendirilmiş
grafik verildiğini varsayalım. p = ⟨v0, v1,··· ,vk ⟩ yolunun ağırlığı, kenarlarının
ağırlıklarının toplamıdır

k
w ( p) = ∑ w ( vi − 1 , vi ).
i =1

u'dan v'ye en kısa yol ağırlığını şu şekilde tanımlarız:

min{𝑤 𝑝 : 𝑢 →𝑝 𝑣} if there is a path from u to v ,


𝛿( 𝑢 , 𝑣 ) = ቊ
∞ 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒

u köşesinden v köşesine en kısa yol, w ( p) = δ( u ,v ) ağırlıklı herhangi bir p


yolu olarak tanımlanır.

Tek Kaynaklı Tüm Hedef en kısa yol (Bellman-Ford, Dijkstra)


Tüm Çiftler için en kısa yol (Floyd-Warshall, Johnson)
En Kısa Yollar
Lemma
Ağırlık fonksiyonu w: E→R olan ağırlıklı bir yönlendirilmiş grafik G= (V,
E) verildiğinde, p = ⟨v1 ,v2 ,· ·· ,vk ⟩ v1 tepe noktasından vk tepe noktasına
en kısa yol olsun ve herhangi bir i için ve j öyle ki 1 ≤ i ≤ j ≤ k, pij = ⟨vi ,vi
+1,·· · ,vj ⟩ p'nin vi tepe noktasından vj tepe noktasına alt yolu olsun. O
halde pij, vi 'den vj 'ye giden en kısa yoldur.

Proof.
p1i pij pjk
Decompose path p into v 1 → v i → v j → vk .
w ( p ) = w ( p1i ) + w ( pij ) + w ( pjk ) .
Assume that there is a path pi′j from vi to vj with weight
w ( pi′j ) < w ( pij ) .
p1i pij′ pjk
Then, v 1 → v i → v j → vk is a path from v 1 to v k whose weight
w (p1i ) + w (pi′j ) + w (pjk ) is less than w ( p ) (contradiction).
En Kısa Yollar
Negatif ağırlıklı kenarlar: G = (V, E ), s'den erişilebilen negatif ağırlıklı
döngüler içermiyorsa, o zaman tüm v ∈ V için, en kısa yol ağırlığı δ(s, v ) iyi
tanımlanmış olarak kalır. s'den erişilebilen bir negatif ağırlık döngüsü varsa,
en kısa yol ağırlıkları iyi tanımlanmamıştır ve δ(s, v ) = −∞ varsayılır.

Döngüler: En kısa yol bir döngü içerebilir mi? Hayır, döngünün yoldan
kaldırılması, aynı kaynak ve hedef köşelere ve daha düşük yol ağırlığına sahip
bir yol ürettiğinden. G = (V, E ) içindeki herhangi bir döngüsel olmayan yol en
fazla |V | farklı köşeler (ve böylece en fazla |V| − 1 kenar), Bu nedenle,
dikkatimizi en fazla |V| − 1 kenara odaklanmalıyız.
En Kısa Yollar: Başlatma

Her v ∈ V köşesi için, d [v ]'nin s kaynağından v'ye giden en kısa yolun


ağırlığı üzerinde bir üst sınır olduğunu varsayalım (d [v]'ye en kısa yol
tahmini diyoruz).
Başlatmak için aşağıdaki prosedür kullanılır:
En Kısa Yollar: Gevşeme
Bir kenarı (u, v ) gevşetme süreci, şimdiye kadar bulunan v'ye giden
en kısa yolu u'dan geçerek iyileştirip iyileştiremeyeceğimizi test
etmekten ve eğer öyleyse d [v] ve π[v]'yi güncellemekten oluşur.
u

w(u,v)
s

Aşağıdaki kod, kenarda (u, v ) bir gevşeme adımı gerçekleştirir:


En kısa yolların özellikleri ve gevşeme

Üçgen eşitsizliği: Herhangi bir kenar (u, v ) ∈ E için


δ( s ,v ) ≤ δ( s ,u ) + w ( u ,v ) .
Üst sınır özelliği: Tüm v ∈ V köşeleri için her zaman d [v] ≥ δ(s, v)
vardır ve d [v ], δ(s, v ) değerine ulaştığında asla değişmez.

Yolsuz özellik: s'den v'ye bir yol yoksa, o zaman her zaman d [v ] =
δ( s ,v ) = ∞ vardır.
Yakınsama özelliği: s ⇝ u → v, bazı u, v ∈ V için G'deki en kısa
yol ise ve eğer d [u] = δ(s, u ) kenar gevşetmeden (u, v ) önce
herhangi bir zamanda ise, daha sonra her zaman d [v ] = δ(s, v) olur.
Yol-gevşeme özelliği: p = ⟨v0, v1,· ·· ,vk ⟩ ise, s = v0 ile vk
arasındaki en kısa yoldur ve p'nin kenarları (v0, v 1 ) , (v1, v 2 ) , · · · ,
(v k − 1 , vk ) , sırasıyla gevşetilir, ardından d [vk ] = δ(s, vk ) olur.
En Kısa Yollar: Dijkstra'nın algoritması
Dijkstra'nın algoritması, kaynak s'den son en kısa yol ağırlıkları zaten
belirlenmiş olan bir S köşe kümesini korur. Algoritma, minimum en kısa
yol tahminiyle u ∈ V − S tepe noktasını tekrar tekrar seçer, u'yu S'ye
ekler ve u'dan ayrılan tüm kenarları gevşetir.

Dijkstra'nın algoritması, S kümesine eklemek için her zaman V − S'deki


en hafif tepe noktasını seçer, bu nedenle açgözlü bir strateji kullanır.
En Kısa Yollar: Dijkstra'nın algoritması

Analysis
Q bir dizi tarafından gerçeklenirse, Dijkstra algoritmasının zaman
karmaşıklığı O(|V |2) olur. (Daha iyi performansa nasıl ulaşabiliriz?)
En Kısa Yollar: Dijkstra'nın algoritması
Theorem
Negatif olmayan ağırlık fonksiyonu w ve source s ile ağırlıklı bir yönlendirilmiş grafik
G=(V, E) üzerinde çalışan Dijkstra'nın algoritması, tüm u ∈ V köşeleri için d [u] = δ(s, u)
ile sona erer.
Proof.
Şunu kanıtlamak yeterlidir: her bir u ∈ V köşesi için, u kümesi S'ye eklendiğinde d [u] =
δ(s, u)'ye sahibiz.
▪ Başlatma: Başlangıçta, S = 0 ve bu nedenle ifade önemsiz derecede
doğrudur.
▪ Bakım:
• S kümesine eklendiğinde d [u] != δ(s, u) olan ilk tepe noktası u olsun.
• s'den u'ya bir yol olmalıdır (aksi takdirde d [u] = δ(s, u) = ∞ d [u] != δ(s,
u)'yu ihlal eder)
• En az bir yol olduğundan, s'den u'ya giden en kısa yol p vardır. u'yu
S'ye eklemeden önce, yol p, S'deki bir tepe noktasını, yani s'yi, V −
S'deki bir tepe noktasına, yani u'ya bağlar.
• p boyunca ilk tepe noktası y olsun, öyle ki y ∈ V − S olsun ve x ∈ S y'nin
öncülü olsun.
• Bir sonraki sayfada devam edin...
Shortest Paths: Dijkstra’s algorithm
Proof.
▪ Maintenance (cont.):
p1 p2
• p yolu şu şekilde ayrıştırılabilir: s → x → y → u.

• y, s'den u'ya giden en kısa yolda u'dan önce meydana geldiğinden


ve tüm kenar ağırlıkları negatif olmadığından, δ(s, y ) ≤ δ(s, u)
vardır, bu da d [y ] = δ(s, y ) ≤ anlamına gelir. δ(s, u) ≤ d [u].
• Ancak u seçildiğinde hem u hem de y köşeleri V − S'de
olduğundan, d [u] ≤ d [y ]'ye sahibiz.
• Yani elimizde d [y ] = δ(s, y ) = δ(s, u) = d [u] var.
• Sonuç olarak, d [u] = δ(s, u), bu da bizim u seçimimizle çelişir.
• Bu nedenle, u S'ye eklendiğinde d [u] = δ(s, u) olduğu sonucuna
varırız.

▪ Sonlandırma: Sonlandırmada, Q = 0, bu da S = V anlamına gelir. Böylece,


tüm u ∈ V köşeleri için d [u] = δ(s, u) olur.
En Kısa Yollar: Bellman-Ford algoritması
Kaynak s ve ağırlık fonksiyonu w: E → R olan ağırlıklı bir yönlendirilmiş
grafik G = (V, E ) verildiğinde, Bellman-Ford algoritması, kaynaktan
erişilebilen bir negatif ağırlık döngüsü olup olmadığını gösteren bir
boole değeri döndürür . Böyle bir döngü varsa, algoritma çözümün
olmadığını belirtir. Aksi takdirde, algoritma en kısa yolları ve bunların
ağırlıklarını üretir.
En Kısa Yollar: Bellman-Ford algoritması

Analysis
BELLMAN-FORD algoritmasının zaman karmaşıklığı O(|V| ×|E|).
(Nasıl?)
En Kısa Yollar: Bellman-Ford algoritması

Lemma
G = (V, E ) kaynağı s ve ağırlık fonksiyonu w: E → R olan ağırlıklı, yönlendirilmiş bir
grafik olsun ve G'nin s'den erişilebilen hiçbir negatif ağırlıklı döngü içermediğini
varsayalım. Ardından, |V | − BELLMAN-FORD'un 2 − 4 satırlarının for döngüsünün 1
yinelemesi, s'den ulaşılabilen tüm v köşeleri için d [v ] = δ(s, v ) var.

Proof.
s'den ulaşılabilen herhangi bir v köşesini düşünün.
p = ⟨v0 , v1, · · · , vk ⟩, burada v0 = s ve vk = v, s'den v'ye herhangi bir döngüsel olmayan en
kısa yol olsun.

Yol p en fazla |V | − 1 kenar ve böylece k ≤ |V | - 1 dir.

2 − 4 satırlarının for döngüsünün (|V |−1) yinelemelerinin her biri, tüm E kenarlarını
gevşetir.
i iterasyonda gevşetilen kenarlar arasında, çünkü i = 1, 2, …, k , (vi−1, vi) kenarıdır.
Bu nedenle, yol-gevşeme özelliği ile, d [v ] = d [vk ] = δ(s, vk ) = δ(s, v ) olur.
En Kısa Yollar: Bellman-Ford algoritması
Theorem
BELLMAN-FORD, kaynak s ve ağırlık fonksiyonu w: E → R olan ağırlıklı,
yönlendirilmiş bir G = (V, E ) grafiği üzerinde çalıştırılsın. , tüm v ∈ V köşeleri
için d [v ] = δ(s, v ) var. G, s'den erişilebilen bir negatif ağırlıklı döngü
içeriyorsa, algoritma YANLIŞ döndürür.

Proof.
- G grafiğinin, s'den erişilebilen negatif ağırlıklı döngüler içermediğini varsayalım.
Vertex v'ye s'den ulaşılabiliyorsa, önceki lemma iddiayı kanıtlar.
v'ye s'den ulaşılamıyorsa, talep no-path özelliğinden gelir.
BELLMAN-FORD'un TRUE değerini döndürdüğünü göstermek için iddiayı
kullanıyoruz.
Sonlandırmada, tüm kenarlar için (u, v ) ∈ E ,

d [v ] = δ( s,v )
≤ δ( s,u ) + w ( u ,v ) (by the triangle inequality)
= d [u ] + w ( u , v ),

ve böylece 6. satırdaki testlerin hiçbiri BELLMAN-FORD'un YANLIŞ döndürmesine


neden olmaz. Bu nedenle, TRUE değerini döndürür.
En Kısa Yollar: Bellman-Ford algoritması
Proof.
-Tersine, G'nin s'den erişilebilen bir negatif ağırlık
döngüsü içerdiğini varsayalım.
Bu döngü c = ⟨v0 , v1 , · · · , vk ⟩ olsun, burada v0 = vk .

O zaman, ∑k w ( vi − 1 ,vi ) < 0.


i =1
Çelişki amacıyla Bellman-Ford algoritmasının DOĞRU döndürdüğünü varsayın.
Böylece, i = 1, 2, · · · , k için d [vi ] ≤ d [vi -1 ] + w (vi -1 , vi ) .
c döngüsü etrafındaki eşitsizlikleri toplamak bize şunu verir:
k k
∑ d [vi ] ≤ ∑ ( d [vi − 1 ] + w ( vi − 1 ,vi ))
i =1 i =1
k k
= ∑ d [vi − 1 ] + ∑ w ( vi − 1 ,vi )
i =1 i =1

v0 = vk olduğundan, c'deki her köşe, toplamların her birinde tam olarak bir kez görünür.
∑ik=1 d [vi ] and ∑ki =1 d [vi − 1 ], ve bu yüzden

k
∑ w ( vi − 1 ,vi ) ≥ 0
i =1

ki bu bir çelişkidir.

You might also like