Grafik arama: İlk önce, önce ilk önce genişlik


78

Grafikler ararken, iki kolay algoritma vardır: genişlik birinci ve derinlik ilk (Genellikle tüm bitişik grafik düğümlerini bir kuyruğa (genişlik ilk) veya yığına (derinlik ilk önce) ekleyerek yapılır).

Şimdi, birbiri ardına avantajları var mı?

Aklıma gelenler:

  • Verilerinizin grafiğin içinde oldukça uzakta olmasını beklerseniz, grafiğin daha derindeki bölümlerine girerken derinlik ilk önce onu daha erken bulabilir.
  • Tersine, verilerinizin grafikte oldukça fazla olmasını bekliyorsanız, en önce ilk önce sonuç verebilir.

Kaçırdığım bir şey var mı veya çoğunlukla kişisel tercihinize mi iniyor?

Yanıtlar:


43

Sorunu güzel bir şekilde kapsayan hstoerr tarafından Stack Overflow'tan bir cevap alıntı yapmak istiyorum :

Bu, büyük ölçüde arama ağacının yapısına ve çözümlerin sayısına ve konumuna bağlıdır .
Bir çözüm ağacın kökünden uzak değilse, geniş kapsamlı bir ilk arama (BFS) daha iyi olabilir. Ağaç çok derinse ve çözümler nadirse, derinlik ilk arama (DFS) sonsuza dek kök salmış olabilir, ancak BFS daha hızlı olabilir. Ağaç çok genişse, bir BFS'nin çok fazla belleğe ihtiyacı olabilir, bu nedenle tamamen pratik olmayabilir. Solüsyonlar sık, ancak ağacın derinliklerinde bulunursa, BFS pratik olmayabilir. Arama ağacı çok derinse, derinlik ilk arama (DFS) için arama derinliğini sınırlandırmanız gerekir (yine de yinelemeli derinleştirme ile).

Ancak bunlar sadece kurallar; Muhtemelen denemeniz gerekecek.

Rafał Dowgird ayrıca şöyle diyor:

Bazı algoritmalar çalışmak için DFS'nin (veya BFS'nin) belirli özelliklerine bağlıdır. Örneğin, 2 bağlantılı bileşenleri bulmak için Hopcroft ve Tarjan algoritması, DFS tarafından karşılaşılan ziyaret edilen her düğümün, kökten o anda araştırılan düğüme giden yolda olması gerçeğinden yararlanır.


5
Bu cevabın neden 27 olumlu olduğunu anlamadım ve bu tam olarak diğer 2 cevabı birleştiriyor; bu arada bu konuda genel düşünceler var ...
nbro

37

Çok çekirdekli dünyamızda önemli olan bir nokta: BFS'nin paralelleşmesi çok daha kolaydır. Bu sezgisel olarak mantıklıdır (her çocuk için iplikler gönderir) ve bunun da kanıtlanmış olduğu kanıtlanabilir. Öyleyse, paralellikten yararlanabileceğiniz bir senaryo varsa, o zaman BFS gitmenin yolu budur.


8
DFS, verilen ayarda aksi takdirde avantajlıysa, yeterince iş parçacığı doğurana ve DFS ile devam edene kadar BFS uygulayabilirsiniz. Daha spesifik olarak, DFS yapabilirsin ve ne zaman inersen ve yeterli konu yoksa, bir sonraki kardeş için bir tane çıkar.
Raphael

Bu cevap 20 yükseltmeyi hak etmiyor. Soru, 2 algoritmanın genel kullanımı ile ilgilidir ve belirli bir kullanım ile ilgili değildir.
nbro

31

(Bunu bir topluluk wiki yaptım. Lütfen düzenleme yapmaktan çekinmeyin.)

Eğer

  • b dallanma faktörüdür
  • d , çözümün bulunduğu derinliktir
  • d hh ağacın yüksekliğidir (yani, )dh

Sonra

  • DFS, zaman ve alan kaplarO ( h )O(bh)O(h)
  • BFS, zaman ve alan kaplarO ( b d )O(bd)O(bd)
  • IDDFS, süre ve alan kaplarO ( d )O(bd)O(d)

Seçmek için nedenler

  • DFS
    • Zaten bütün ağacı görmelisin
    • biliyorsun , cevabın seviyesid
    • Cevabın köke en yakın olup olmadığına aldırmayın
  • BFS
    • cevap kök yakın
    • köke en yakın cevabı istersiniz
    • çoklu çekirdek / işlemci var
  • IDDFS
    • BFS’yi istiyorsanız, yeterli belleği yok, ancak biraz daha yavaş kabul edilebilir

IDDFS = İteratif derinleşme derinliği ilk arama


1
Bu mükemmel bir cevap. Sorunun grafikler hakkında soru sorarken, bu cevabın ağaçlara atıfta bulunduğunu fark ettim. Bir ağaç elbette bir grafiktir ve bu kelimesi değiştirilebilecek olabilir ... ama peki h, "ağacın yüksekliği". Bu doğrudan "grafiğin yüksekliği" anlamına mı geliyor?
user2023370

IDDFS kullanmanın başka bir nedeni, nasıl kullanmak istediğinize bağlı olarak, her yinelemeden sonra olası bir cevabınız olabilir (eğer arıyorsanız, maksimum veya minimum). Bu, eğer cevabınız "yeterince iyi" ise algoritmayı erken bırakabilirsiniz ya da kullanıcı girişini bırakabilirsiniz (örneğin, optimum bir çözüm bulmak için IDDFS kullanan ancak bir parçayı hareket ettiren bir oyuncu tarafından kesilmiş olan bir satranç motoru).
jedd.ahyoung

Eklenecek bir diğer nokta, DFS'nin yığın kullanması, BFS'nin de sıra kullanmasıdır.
Karthik Balaguru 14:17

17

Doğru bir program elde etmek için bir başkasını seçmek zorunda kalabileceğiniz bir senaryo (daha önce belirtilmiş olan en kısa yolu bulmak dışında) sonsuz grafikler olacaktır:

Örneğin, her düğümün sınırlı sayıda çocuğa sahip olduğu, ancak ağacın yüksekliğinin sınırsız olduğu bir ağaç düşünürsek, DFS aradığınız düğümü asla bulamayabilir - yalnızca her düğümün ilk çocuğunu ziyaret etmeye devam edecektir. görürse, aradığınız kişi ebeveyninin ilk çocuğu değilse, oraya asla ulaşamaz. Bununla birlikte, BFS'nin sınırlı bir sürede bulması garanti edilir.

Benzer şekilde, her bir düğümün sonsuz sayıda çocuğunun bulunduğu, ancak ağacın sınırlı bir yüksekliğe sahip olduğu bir ağaç düşünürsek, BFS sonlandırılmayabilir. Yalnızca kök düğümün çocuklarını ziyaret eder ve aradığınız düğüme başka bir düğümün çocuğuysa erişilmez. Bu durumda, DFS'nin sınırlı bir sürede bulması garanti edilir.


7
Her ikisinin de sonsuz grafikler için yalnızca yarı karar algoritmaları vermesi dikkat çekicidir; Sonlu bir zamanda bir elementin ağaçta olmadığına karar veremezsin (tabii ki). Pratik uygulamalar için olduğu gibi, (kavramsal) sonsuz veri yapıları olduğuna dikkat edebilirsiniz tanımlanabilir (paragraf 3.4 bakınız)!
Raphael

15

Genişlik birinci ve derinlik ilk kesinlikle aynı en kötü durum davranışına sahiptir (istenen düğüm en son bulunandır). Grafikleriniz hakkında bilginiz yoksa, bunun ortalama durum için de geçerli olduğundan şüpheleniyorum.

Geniş kapsamlı ilk aramadan bir güzel bonus, ilgi çeken veya göstermeyebilecek en kısa yolları (en az kenar anlamında) bulmasıdır.

Eğer ortalama düğüm sırası (komşu sayısı), düğüm sayısına göre (yani grafik yoğun) yüksekse, genişlik birinci büyük sıralara sahip olacak, derinlik birinci küçük yığınlara sahip olacaktır. Seyrek grafiklerde durum tersine çevrilmiştir. Bu nedenle, hafıza sınırlayıcı bir faktör ise, eldeki grafiğin şekli sizin seçtiğiniz arama stratejisini bilgilendirmek zorunda kalabilir.


Bfs'deki kuyruğun uzunluğu ve dfs'deki yığının yüksekliği uygulamaya bağlıdır. Eğer dfs durumunda, her zaman yığındaki komşunun tamamını genişletirseniz, özellikle grafik yoğun olduğunda, çok büyür. Yalnızca dfs özyinelemeden geri döndüğünde nereye devam edeceğini söyleyen referansı zorlamak çok fazla alan kazandırır.
uli

3

Yukarıdakilerin hepsi doğrudur, ancak BFS ve DFS'nin ağacı geçmek için kullandıkları sıraya göre kendi ağaçlarını oluşturmaları dikkat çekicidir. Bu ağaçların her biri, bir tür sorunlarda faydalı olabilecek kendine has bir özelliğe sahiptir.

Örneğin, orijinal grafikteki BFS ağacında olmayan tüm kenarlar çapraz kenarlardır; BFS ağacının iki dalı arasında kalan kenarlar. Orijinal grafikteki DFS ağacında olmayan tüm kenarlar arka kenarlardır; DFS ağacının bir dalına iki köşeyi bağlayan kenarlar. Bu özellikler, özel renkler, vb. Sorunlar için faydalı olabilir.


1

DFS ve BFS ağacının her ikisi de, grafik hakkında size daha yararlı bilgiler sağlayabilecek kendi benzersiz özelliklerine sahiptir. Örneğin, tek bir DFS ile aşağıdakileri yapabilirsiniz:

  • Köprüler ve eklem noktaları bulun (yönlendirilmemiş grafikler için)
  • Döngü algılama
  • Güçlü bağlanmış bileşenleri bulun (Tarjan algoritması)

BFS ile, kaynak düğüm ile grafikteki diğer düğümler arasındaki en kısa yolları bulabilirsiniz.

CLRS'deki Grafik Algoritmaları bölümü, DFS ve BFS'nin bu özelliklerini çok güzel bir şekilde özetler.


-2

Her ikisini de, yalnızca bazı kod satırlarını değiştirerek size bir algoritma veya diğerini verecek şekilde yazmanın ilginç olacağını düşünüyorum. .

Şahsen BFS'nin bir manzarayı sular altında yorumlamasını seviyorum: önce alçak irtifa alanları sular altında kalacak ve sonra sadece yüksek irtifa alanları takip edecek. Peyzaj irtifalarını coğrafya kitaplarında gördüğümüz gibi izolinler olarak hayal ederseniz, BFS'nin tüm alanı aynı izolin altında aynı anda doldurması, tıpkı bunun fizikle olduğu gibi. Bu nedenle, rakımları mesafe veya ölçeklenmiş maliyet olarak yorumlamak, algoritma hakkında oldukça sezgisel bir fikir verir.

Bunu göz önünde bulundurarak, minimum yayılma ağacını kolayca bulmak için, en kısa yolu ve diğer birçok küçültme algoritmasını bulmak için ilk arama aramasının arkasındaki fikri kolayca uyarlayabilirsiniz.

Henüz DFS'nin sezgisel yorumunu görmedim (labirentle ilgili sadece standart olan, ancak BFS olan ve sel olan kadar güçlü değil), bu yüzden benim için BFS yukarıda açıklandığı gibi fiziksel olaylarla daha iyi korelasyon gösteriyor gibi görünüyor. DFS, rasyonel sistemlerde (örneğin bir satranç oyununda ya da bir labirentin dışına çıkmaya karar veren insanların ya da bilgisayarların) seçtikleri gecikmesiyle daha iyi koreledir.

Bu yüzden, benim için, doğal olgunun gerçek yaşamdaki yayılma modeline (enine) uygun olduğu yalanlar arasındaki fark.


2
Siteye Hoşgeldiniz! Ancak, bunun soruyu nasıl cevapladığını gerçekten anlamıyorum. BFS ve DFS hakkındaki genel hisleriniz ve sezgileriniz gibi görünüyor, ancak soru hisler ve sezgiler hakkında sormuyor: avantajlar ve dezavantajlar hakkında soruyor. Cevabınız buna değinecek gibi görünmüyor.
David Richerby,

En soruya bağlantılı parçası, böylece asgari yayılan ağaçlar, en kısa yolu bulmak için ve bazı doğal fenomenler BFS tarafından reproduceable olduğunu söylemek algoritması adapte hakkında ise DFS tarafından karar ağaçları
user5193682

1
Soru, BFS ve DFS ile neyin ilişkili olduğunu sormuyor. Yayılan ağaçlar veya en kısa yollar bulma ya da "doğal olayların nasıl yeniden üretileceği" hakkında soru sormuyor.
David Richerby

Avantajları istiyor. Eğer bir kişi fiziksel bir fenomeni modelleyebilecekse, bu fenomeni modellemeniz gerekirse, bu bir avantajdır. Sanırım 'avantaj' kelimesini yorumlarken algoritmalar ders kitabı standart kavramlarına sadık
kalıyorsunuz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.