बीएफएस आमतौर पर निम्नलिखित ( विकिपीडिया से ) की तरह कुछ वर्णित है ।
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)
मुद्दा कुछ हद तक सूक्ष्म है: यह पंक्ति 3 में छिपा है! सवाल यह है कि हम कौन सी डेटा संरचना का उपयोग करने जा रहे हैं जो कि कोने की खोज की गई है?
सबसे सरल समाधान प्रति शीर्ष एक प्रविष्टि के साथ बूलियन सरणी का उपयोग करना है। इस मामले में, हमें सरणी के प्रत्येक तत्व को आरंभ करना चाहिए false
और इसमें समय लगता हैΘ ( | वी| )। यह हर ग्राफ के लिए लागू होता है, भले ही कोई भी किनारा क्यों न हो, इसलिए हम किसी भी रिश्ते को नहीं मान सकते| वी| तथा | इ| और हमें एक समय मिलता है ओ ( | वी| + | इ| )।
क्या हम डेटा संरचना के साथ होने से बच सकते हैं Θ ( | वी| )आरंभीकरण समय? हमारा पहला प्रयास एक लिंक की गई सूची का उपयोग करना हो सकता है। हालांकि, अब परीक्षण अगर एक शिखर की खोज की गई है (पंक्ति 10) पहले की तरह निरंतर समय के बजाय, देखे गए कोने की संख्या में समय रेखीय लेता है। इसका मतलब है कि रनिंग टाइम बन जाता हैओ ( | वी|| इ| ), जो सबसे खराब स्थिति में बहुत खराब है। (ध्यान दें कि हम इसे फिर से लिखना नहीं चाहते हैंहे ( | ई|2) चूंकि यह और भी बुरा है: यह उतना ही बुरा हो सकता है |V|4, जहाँ तक |V||E|≤|V|3।)
डायनामिकली रिसाइज़्ड ऐरे का उपयोग करने से हम सूची को क्रमबद्ध रख सकते हैं, इसलिए अब लुक-अप में केवल समय लगेगा O(log|V|) लेकिन यह अभी भी केवल समय का चलन देता है O(|E|log|V|), जो अभी भी मानक से भी बदतर है।
अंत में, हम गतिशील रूप से आकार की हैश तालिका का उपयोग कर सकते हैं: निरंतर आकार की तालिका के साथ शुरू करें cऔर हर बार इसे आधा भरा हुआ पाते हैं। इसका मतलब यह है कि एल्गोरिथ्म समाप्त होने से पहले खोजे गए वर्टिकल की तालिका का अंतिम आकार अधिकतम दो बार है, और यह सबसे अधिक है|E|+1क्योंकि हम स्टार्ट वर्टेक्स के घटक के बाहर कभी भी कुछ नहीं खोजते हैं। इसके अलावा, काम की कुल राशि का विस्तार करने के लिए हैश तालिका की नकल की गई हैc+2c+4c+⋯+2|E|≤4|E|। हैश तालिका में लुकअप और प्रविष्टि amortized हैं O(1) इसलिए हम वास्तव में एक चलने का समय प्राप्त करते हैं O(|E|)।
इसलिए O(|E|)संभव है, लेकिन एक वास्तविक कार्यान्वयन में ऐसा करना चाहते हैं? मैं कहूंगा कि शायद नहीं। जब तक आपके पास यह विश्वास करने का कारण नहीं है कि आपके इनपुट ग्राफ़ में कई छोटे घटक होंगे, हैश टेबल को बनाए रखने का ओवरहेड रनिंग टाइम में एक ध्यान देने योग्य स्थिर कारक जोड़ने वाला है। हैश टेबल बढ़ने में समय लग सकता है4|E|और हैश फ़ंक्शन की गणना करने के लिए आपको लुकअप की आवश्यकता होगी और औसतन, तालिका में एक से अधिक स्लॉट देखें। हैश टेबल के खराब कैश प्रदर्शन से आपको वास्तविक कंप्यूटर पर चोट भी लग सकती है। मानक सरणी कार्यान्वयन के साथ अधिकांश मामलों में,O(|E|) भाग का प्रमुख शब्द है O(|V|+|E|) ऐसा करने की व्यावहारिक लागत को देखते हुए, चल रहे समय को वर्चस्व वाले शब्द को हटाने के लिए हैश टेबल का उपयोग करने के लायक नहीं है।