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 false
ve 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.