Neden ilk genişlik araması zamanında ?


9

Genellikle bir grafikte genişliği ilk aramanın (BFS) çalışma süresinin olduğu belirtilir (örneğin Wikipedia'da . Ancak, bağlı herhangi bir grafikte ve bağlı olmayan bir grafikte bile, BFS hiçbir zaman başlangıç ​​tepe noktasını içeren bileşenin dışındaki bir tepe noktasına bakmaz. Bu bileşen en fazla en fazla köşesi içerir ve algoritmanın ziyaret edeceği tek nokta budur.G=(V,E)O(|V|+|E|)|V||E|+1|E||E|+1

Yani , neden çalışma süresinin sadece olduğunu söylemiyoruz ?|V|+|E|2|E|+1O(|E|)

Bu Disjkstra algoritmasının çalışma süresi hakkında bir soru üzerine yorumlarda ortaya çıktı .


Neden bir başlangıç ​​tepe noktası olduğunu düşünüyorsunuz? Örneğin maksimum eşleme problemindeki BFS, hopcroft karp algoritmasındaki tüm eşleşmeyen köşelerden başlar. Bu durumda, verilen grafik birçok bağlantılı bileşenin
ormanıysa, edgerlerden

2
@narekBojikian BFS çeşitli şekillerde kullanılabilse de, bağımsız bir algoritma olarak sunulduğunda hemen hemen her zaman bir başlangıç ​​tepe noktasına sahiptir.
David Richerby

Yanıtlar:


9

BFS genellikle ( Wikipedia'dan ) aşağıdaki gibi tanımlanır .

 1  procedure BFS(G,start_v):
 2      let Q be a queue
 3      label start_v as discovered
 4      Q.enqueue(start_v)
 5      while Q is not empty
 6          v = Q.dequeue()
 7          if v is the goal:
 8              return v
 9          for all edges from v to w in G.adjacentEdges(v) do
10             if w is not labeled as discovered:
11                 label w as discovered
12                 w.parent = v
13                 Q.enqueue(w)

Sorun biraz ince bir konu: 3. satırda saklanıyor! Soru, hangi köşelerin keşfedildiğini depolamak için hangi veri yapısını kullanacağımızdır.

En basit çözüm, köşe başına bir giriş içeren bir Boolean dizisi kullanmaktır. Bu durumda, dizinin her öğesini başlatacağız falseve bu zaman alırΘ(|V|). Bu, hiç kenar olmasa bile her grafik için geçerlidir, bu nedenle arasında herhangi bir ilişki olduğunu varsayamayız.|V| ve |E| ve bir çalışma süresi elde ederiz O(|V|+|E|).

Bir veri yapısına sahip olmaktan kaçınabilir miyiz? Θ(|V|)başlatma zamanı? İlk denememiz bağlantılı bir liste kullanmak olabilir. Bununla birlikte, şimdi bir tepe noktasının keşfedilip keşfedilmediğini test etmek (satır 10), eskisi gibi sabit zaman yerine ziyaret edilen köşe sayısı bakımından doğrusal zaman alır. Bu, çalışma süresininO(|V||E|), en kötü durumda çok daha kötüdür. (Bunu yeniden yazmak istemediğimizi unutmayın.O(|E|2) çünkü bu daha da kötü: bu kadar kötü olabilir |V|4, buna karşılık |V||E||V|3.)

Dinamik olarak yeniden boyutlandırılmış bir dizi kullanmak, listeyi sıralamamıza izin verir, bu nedenle artık aramalar yalnızca zaman alır O(log|V|) ama bu hala sadece O(|E|log|V|)hala standarttan daha kötü.

Son olarak, dinamik boyutlu bir karma tablo kullanabiliriz: sabit boyutlu bir tabloyla başlayın cve her yarım dolduğunda ikiye katlayın. Bu, tablonun son boyutunun, algoritma sona ermeden önce bulunan köşe sayısının en fazla iki katı olduğu anlamına gelir ve bu en fazla|E|+1çünkü başlangıç ​​tepe noktasının dışında hiçbir şey keşfetmedik. Ayrıca, karma tablosunu kopyalamak için yapılan toplam çalışma miktarı en fazlac+2c+4c++2|E|4|E|. Karma tabloya aramalar ve eklemeler amortismana tabi tutulur O(1) bu yüzden gerçekten O(|E|).

Yani O(|E|)mümkün, ancak bunu gerçek bir uygulamada yapmak ister misiniz? Muhtemelen hayır diyebilirim. Girdi grafiklerinizin çok sayıda küçük bileşene sahip olacağına inanmak için bir nedeniniz olmadıkça, karma tablonun korunma yükü, çalışma süresine fark edilebilir bir sabit faktör ekleyecektir. Karma tabloyu büyütmek zaman alabilir4|E|ve aramalar karma işlevini hesaplamanızı ve ortalama olarak tablodaki birden fazla yuvaya bakmanızı gerektirir. Karma tabloların önbellek performansının düşük olması, gerçek bir bilgisayarda da size zarar verebilir. Çoğu durumda standart dizi uygulaması ile,O(|E|) bölüm baskın terimdir O(|V|+|E|) Bu nedenle, bunu yapmanın pratik maliyeti göz önüne alındığında, hakim terimi kaldırmak için bir karma tablo kullanmaya değmez.


1
Uygulamada karma tabloların önbellek performansının düşük olduğunu iddia etmek çok güçlü olabileceğini düşünüyorum. Zincirleme ile (yani bağlantılı listeler) uygulanırsa, katılıyorum. Ancak sürekli bir bellek ve açık adresleme ile uygulanırsa, çok fazla değil.
Juho

Gerçekten harika bir cevap! Ancak bir marjinal not, dinamik olarak boyutlandırılmış hash tabloları gerçekten sadece çok sayıda küçük bileşen olduğunda değil, aynı zamanda herhangi bir tepe için hash değeri makul bir sabitle sınırlanmışsa ve bu sıklıkla gerçekleşirse iyi bir seçimdir. Güzel cevap!
Carlos Linares López

1
David, yıllar önce benzer düşüncelerim vardı. Cevabın tarihsel perspektiflerde olduğunu düşünüyorum.
kelalaka
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.