logo

BFS ve DFS

BFS ve DFS arasındaki farklara bakmadan önce öncelikle BFS ve DFS'yi ayrı ayrı bilmeliyiz.

BFS nedir?

BFS anlamına gelir Genişlik Öncelikli Arama . Aynı zamanda şu şekilde de bilinir: seviye sırası geçişi . Kuyruk veri yapısı, Önce Genişlik Arama geçişi için kullanılır. Bir grafikte geçiş için BFS algoritmasını kullandığımızda herhangi bir düğümü kök düğüm olarak düşünebiliriz.

Genişlik ilk arama geçişi için aşağıdaki grafiği ele alalım.

ahh sn
BFS ve DFS

0 nolu düğümü kök düğüm olarak ele aldığımızı varsayalım. Bu nedenle geçiş düğüm 0'dan başlatılacaktır.

BFS ve DFS

Düğüm 0 Kuyruktan kaldırıldığında yazdırılır ve şu şekilde işaretlenir: düğümü ziyaret etti.

0 nolu düğüm Kuyruktan çıkarıldığında, 0 nolu düğümün bitişik düğümleri aşağıda gösterildiği gibi bir Kuyruğa eklenecektir:

BFS ve DFS

Şimdi düğüm 1 Kuyruktan kaldırılacak; yazdırılır ve ziyaret edilen düğüm olarak işaretlenir

Düğüm 1 Kuyruktan çıkarıldığında, düğüm 1'in tüm bitişik düğümleri Kuyruğa eklenecektir. 1. düğümün bitişik düğümleri 0, 3, 2, 6 ve 5'tir. Ancak bir Kuyruğa yalnızca ziyaret edilmemiş düğümleri eklememiz gerekir. 3, 2, 6 ve 5 numaralı düğümler ziyaret edilmediğinden; bu nedenle bu düğümler aşağıda gösterildiği gibi bir Kuyruğa eklenecektir:

BFS ve DFS

Bir sonraki düğüm Kuyruktaki 3'tür. Böylece, düğüm 3 Kuyruktan kaldırılacak, yazdırılacak ve aşağıda gösterildiği gibi ziyaret edildi olarak işaretlenecektir:

BFS ve DFS

Düğüm 3 Kuyruktan çıkarıldığında, ziyaret edilen düğümler dışındaki düğüm 3'ün tüm bitişik düğümleri Kuyruğa eklenecektir. 3. düğümün bitişik düğümleri 0, 1, 2 ve 4'tür. 0, 1 numaralı düğümler zaten ziyaret edildiğinden ve 2. düğüm bir Kuyrukta mevcut olduğundan; bu nedenle bir Kuyruğa yalnızca 4. düğümü eklememiz gerekir.

dizi dilimleme java
BFS ve DFS

Şimdi Kuyruktaki bir sonraki düğüm 2'dir. Yani 2, Kuyruktan silinecektir. Aşağıda gösterildiği gibi yazdırılır ve ziyaret edildi olarak işaretlenir:

BFS ve DFS

Düğüm 2 Kuyruktan çıkarıldığında, ziyaret edilen düğümler dışındaki düğüm 2'nin tüm bitişik düğümleri Kuyruğa eklenecektir. 2. düğümün bitişik düğümleri 1, 3, 5, 6 ve 4'tür. 1 ve 3 numaralı düğümler zaten ziyaret edildiğinden ve 4, 5, 6 zaten Kuyruğa eklendiğinden; bu nedenle Kuyruğa herhangi bir düğüm eklememize gerek yok.

Bir sonraki eleman 5'tir. Yani 5, Kuyruktan silinecektir. Aşağıda gösterildiği gibi yazdırılır ve ziyaret edildi olarak işaretlenir:

BFS ve DFS

Düğüm 5 Kuyruktan çıkarıldığında, ziyaret edilen düğümler dışındaki düğüm 5'in tüm bitişik düğümleri Kuyruğa eklenecektir. 5. düğümün komşu düğümleri 1 ve 2'dir. Her iki düğüm de zaten ziyaret edildiğinden; bu nedenle Kuyruğa eklenecek bir tepe noktası yoktur.

Bir sonraki düğüm 6'dır. Yani 6, Kuyruktan silinecektir. Aşağıda gösterildiği gibi yazdırılır ve ziyaret edildi olarak işaretlenir:

BFS ve DFS

Düğüm 6 Kuyruktan çıkarıldığında, ziyaret edilen düğümler dışındaki düğüm 6'nın tüm bitişik düğümleri Kuyruğa eklenecektir. 6. düğümün komşu düğümleri 1 ve 4'tür. 1. düğüm zaten ziyaret edildiğinden ve 4. düğüm zaten Kuyruğa eklendiğinden; bu nedenle Kuyruğa eklenecek köşe yoktur.

Kuyruktaki bir sonraki öğe 4'tür. Yani 4, Kuyruktan silinecektir. Yazdırılır ve ziyaret edildi olarak işaretlenir.

Düğüm 4 Kuyruktan çıkarıldığında, ziyaret edilen düğümler dışındaki düğüm 4'ün tüm bitişik düğümleri Kuyruğa eklenecektir. 4. düğümün komşu düğümleri 3, 2 ve 6'dır. Bitişik düğümlerin tümü zaten ziyaret edildiğinden; dolayısıyla Kuyruğa eklenecek bir tepe noktası yoktur.

DFS nedir?

DFS Derinlik İlk Arama anlamına gelir. DFS geçişinde LIFO (Son Giren İlk Çıkar) prensibine göre çalışan yığın veri yapısı kullanılır. DFS'de çaprazlama herhangi bir düğümden başlatılabilir veya problemde kök düğümden bahsedilmeyene kadar herhangi bir düğümün kök düğüm olarak değerlendirilebileceğini söyleyebiliriz.

Kuyruktan silinen eleman olan BFS durumunda, silinen düğümün bitişik düğümleri Kuyruğa eklenir. Bunun aksine, DFS'de yığından kaldırılan öğe, daha sonra silinen düğümün yalnızca bir bitişik düğümü yığına eklenir.

java istisnaları

Derinlik Önce Arama geçişi için aşağıdaki grafiği ele alalım.

BFS ve DFS

Düğüm 0'ı kök düğüm olarak düşünün.

Öncelikle 0 elemanını aşağıda gösterildiği gibi yığına ekliyoruz:

BFS ve DFS

0 düğümünün iki bitişik düğümü vardır, yani 1 ve 3. Şimdi geçiş için yalnızca bir bitişik düğümü (1 veya 3) alabiliriz. Diyelim ki düğüm 1'i ele alıyoruz; bu nedenle bir yığına 1 eklenir ve aşağıda gösterildiği gibi yazdırılır:

BFS ve DFS

Şimdi 1. düğümün komşu köşelerine bakacağız. 1. düğümün ziyaret edilmemiş komşu köşeleri 3, 2, 5 ve 6'dır. Bu dört köşeden herhangi birini düşünebiliriz. 3. düğümü aldığımızı ve onu aşağıda gösterildiği gibi yığına yerleştirdiğimizi varsayalım:

BFS ve DFS

3. düğümün ziyaret edilmemiş bitişik köşelerini düşünün. 3. düğümün ziyaret edilmemiş bitişik köşeleri 2 ve 4'tür. Köşelerden herhangi birini alabiliriz, yani 2 veya 4. 2. köşeyi aldığımızı ve onu aşağıda gösterildiği gibi yığına yerleştirdiğimizi varsayalım:

BFS ve DFS

2. düğümün ziyaret edilmemiş bitişik köşeleri 5 ve 4'tür. Köşelerden birini seçebiliriz, yani 5 veya 4. 4. köşeyi aldığımızı ve aşağıda gösterildiği gibi yığına yerleştirdiğimizi varsayalım:

join sql'den güncelleme
BFS ve DFS

Şimdi 4. düğümün ziyaret edilmemiş bitişik köşelerini ele alacağız. 4. düğümün ziyaret edilmemiş bitişik köşesi 6. düğümdür. Bu nedenle, 6. öğe yığına aşağıda gösterildiği gibi eklenir:

BFS ve DFS

6. elemanı yığına yerleştirdikten sonra 6. düğümün ziyaret edilmemiş bitişik köşelerine bakacağız. 6. düğümün ziyaret edilmemiş bitişik köşeleri olmadığından 6. düğümün ötesine geçemiyoruz. Bu durumda aşağıdaki işlemi gerçekleştireceğiz: geriye doğru izleme . En üstteki öğe, yani 6, aşağıda gösterildiği gibi yığından dışarı fırlayacaktır:

BFS ve DFS
BFS ve DFS

Yığındaki en üstteki eleman 4'tür. 4 nolu düğümden geriye ziyaret edilmemiş bitişik köşe kalmadığından; bu nedenle, düğüm 4 aşağıda gösterildiği gibi yığından çıkarılır:

BFS ve DFS
BFS ve DFS

Yığındaki bir sonraki en üstteki öğe 2'dir. Şimdi, düğüm 2'nin ziyaret edilmemiş bitişik köşelerine bakacağız. Yalnızca bir ziyaret edilmemiş düğüm, yani 5 kaldığı için, düğüm 5, 2'nin üzerindeki yığına itilecek ve yazdırılacaktır. Aşağıda gösterildiği gibi:

BFS ve DFS

Şimdi 5. düğümün henüz ziyaret edilmemiş olan bitişik köşelerini kontrol edeceğiz. Ziyaret edilecek bir köşe kalmadığından, 5. öğeyi aşağıda gösterildiği gibi yığından çıkarıyoruz:

np.argmax
BFS ve DFS

5'ten fazla ilerleyemeyiz, dolayısıyla geri izleme yapmamız gerekiyor. Geri izlemede, en üstteki öğe yığından dışarı atılır. Yığından çıkarılacak en üstteki öğe 5'tir ve aşağıda gösterildiği gibi düğüm 2'ye geri dönüyoruz:

BFS ve DFS

Şimdi düğüm 2'nin ziyaret edilmemiş bitişik köşelerini kontrol edeceğiz. Ziyaret edilecek bitişik köşe kalmadığından geri izleme gerçekleştiriyoruz. Geri izlemede, en üstteki öğe, yani 2, yığından dışarı atılır ve aşağıda gösterildiği gibi düğüm 3'e geri döneriz:

BFS ve DFS
BFS ve DFS

Şimdi 3. düğümün ziyaret edilmemiş bitişik köşelerini kontrol edeceğiz. Ziyaret edilecek bitişik köşe kalmadığından geri izleme gerçekleştiriyoruz. Geri izlemede, en üstteki öğe, yani 3, yığından dışarı atılır ve aşağıda gösterildiği gibi düğüm 1'e geri döneriz:

BFS ve DFS
BFS ve DFS

3. elemanı çıkardıktan sonra 1. düğümün ziyaret edilmemiş komşu köşelerini kontrol edeceğiz. Ziyaret edilecek bir köşe kalmadığından; bu nedenle geri izleme gerçekleştirilecektir. Geri izlemede, en üstteki öğe, yani 1, yığından dışarı atılır ve aşağıda gösterildiği gibi 0 düğümüne geri döneriz:

BFS ve DFS
BFS ve DFS

Hala ziyaret edilmemiş olan 0 düğümünün bitişik köşelerini kontrol edeceğiz. Ziyaret edilecek bitişik bir köşe kalmadığından geri izleme gerçekleştiririz. Bunda, aşağıda gösterildiği gibi yığından yalnızca bir öğe, yani yığında kalan 0 öğe çıkarılacaktır:

BFS ve DFS

Yukarıdaki şekilde gördüğümüz gibi yığın boştur. Dolayısıyla DFS geçişini burada durdurmamız gerekiyor ve yazdırılan öğeler DFS geçişinin sonucudur.

BFS ve DFS arasındaki farklar

BFS ve DFS arasındaki farklar şunlardır:

BFS DFS
Tam form BFS, Genişlik Öncelikli Arama anlamına gelir. DFS, Derinlik Önce Arama anlamına gelir.
Teknik Bir grafikteki en kısa yolu bulmak için köşe tabanlı bir tekniktir. Kenar tabanlı bir tekniktir çünkü kenar boyunca köşeler ilk olarak başlangıçtan bitiş düğümüne kadar araştırılır.
Tanım BFS, önce aynı seviyedeki tüm düğümlerin araştırıldığı ve daha sonra bir sonraki seviyeye geçildiği bir geçiş tekniğidir. DFS aynı zamanda geçişin kök düğümden başlatıldığı ve ziyaret edilmemiş bitişik düğümleri olmayan düğüme ulaşana kadar düğümleri mümkün olduğunca araştırdığı bir geçiş tekniğidir.
Veri yapısı BFS geçişi için kuyruk veri yapısı kullanılır. BFS geçişi için yığın veri yapısı kullanılır.
Geri izleme BFS geri izleme konseptini kullanmaz. DFS, ziyaret edilmeyen tüm düğümleri geçmek için geri izlemeyi kullanır.
Kenar sayısı BFS, kaynaktan hedef tepe noktasına kadar geçilecek minimum sayıda kenara sahip en kısa yolu bulur. DFS'de kaynak tepe noktasından hedef tepe noktasına geçiş yapmak için daha fazla sayıda kenar gerekir.
Optimallik BFS geçişi, kaynak tepe noktasına daha yakın aranacak köşeler için idealdir. DFS geçişi, çözümlerin kaynak tepe noktasından uzakta olduğu grafikler için idealdir.
Hız BFS, DFS'den daha yavaştır. DFS, BFS'den daha hızlıdır.
Karar ağacına uygunluk Karar ağacı için uygun değildir çünkü öncelikle tüm komşu düğümlerin araştırılmasını gerektirir. Karar ağacına uygundur. Karara göre tüm yolları araştırır. Hedef bulunduğunda geçişini durdurur.
Bellek verimli DFS'den daha fazla bellek gerektirdiğinden bellek açısından verimli değildir. BFS'den daha az bellek gerektirdiğinden bellek açısından verimlidir.