मैं डीएफएस और बीएफएस के बीच के अंतर को समझता हूं, लेकिन मुझे यह जानने में दिलचस्पी है कि एक से अधिक का उपयोग करने के लिए अधिक व्यावहारिक कब है?
क्या कोई भी उदाहरण दे सकता है कि डीएफएस बीएफएस को कैसे ट्रम्प करेगा और इसके विपरीत?
मैं डीएफएस और बीएफएस के बीच के अंतर को समझता हूं, लेकिन मुझे यह जानने में दिलचस्पी है कि एक से अधिक का उपयोग करने के लिए अधिक व्यावहारिक कब है?
क्या कोई भी उदाहरण दे सकता है कि डीएफएस बीएफएस को कैसे ट्रम्प करेगा और इसके विपरीत?
जवाबों:
यह खोज पेड़ की संरचना और समाधानों की संख्या और स्थान (उर्फ खोज-आइटम के लिए) पर बहुत निर्भर करता है।
यदि पेड़ बहुत गहरा है और समाधान दुर्लभ हैं, तो गहराई से पहली खोज (डीएफएस) में बहुत लंबा समय लग सकता है, लेकिन बीएफएस तेज हो सकता है।
यदि पेड़ बहुत चौड़ा है, तो बीएफएस को बहुत अधिक मेमोरी की आवश्यकता हो सकती है, इसलिए यह पूरी तरह से अव्यावहारिक हो सकता है।
यदि समाधान अक्सर होते हैं लेकिन पेड़ में गहरे स्थित होते हैं, तो बीएफएस अव्यावहारिक हो सकता है।
लेकिन ये सिर्फ अंगूठे के नियम हैं; आपको शायद प्रयोग करने की आवश्यकता होगी।
गहराई-पहली खोजों का उपयोग अक्सर खेलों के सिमुलेशन (और वास्तविक दुनिया में गेम जैसी स्थितियों) में किया जाता है। एक विशिष्ट खेल में आप कई संभावित कार्यों में से एक चुन सकते हैं। प्रत्येक विकल्प आगे की पसंद को आगे बढ़ाता है, जिनमें से प्रत्येक आगे की पसंद की ओर जाता है, और इसी तरह संभावनाओं के एक कभी-विस्तार वाले पेड़ के आकार के ग्राफ में।
उदाहरण के लिए शतरंज, टिक-टैक-टो जैसे खेलों में जब आप निर्णय लेते हैं कि क्या कदम उठाना है, तो आप मानसिक रूप से एक कदम की कल्पना कर सकते हैं, फिर आपके प्रतिद्वंद्वी की संभावित प्रतिक्रियाएं, फिर आपकी प्रतिक्रियाएं, और इसी तरह। आप यह तय कर सकते हैं कि किस चाल को देखने से सबसे अच्छा परिणाम होता है।
गेम ट्री में केवल कुछ रास्ते आपकी जीत की ओर ले जाते हैं। कुछ अपने प्रतिद्वंद्वी द्वारा एक जीत के लिए नेतृत्व करते हैं, जब आप इस तरह के अंत तक पहुंचते हैं, तो आपको एक पिछले नोड तक वापस, या बैकट्रैक करना होगा और एक अलग रास्ता आज़माना चाहिए। इस तरह आप एक सफल निष्कर्ष के साथ एक रास्ता खोजने तक पेड़ का पता लगाते हैं। फिर आप इस रास्ते पर पहला कदम बढ़ाते हैं।
चौड़ाई-पहली खोज में एक दिलचस्प संपत्ति है: यह पहले सभी छोरों को खोजता है जो शुरुआती बिंदु से एक किनारे दूर हैं, फिर सभी कोने जो दो किनारों से दूर हैं, और इसी तरह। यह उपयोगी है अगर आप किसी दिए गए शीर्ष पर शुरू करने के शीर्ष से सबसे छोटा रास्ता खोजने की कोशिश कर रहे हैं। आप एक बीएफएस शुरू करते हैं, और जब आप निर्दिष्ट कगार पाते हैं, तो आपको पता है कि आपने अब तक पता लगाया है कि नोड का सबसे छोटा रास्ता क्या है। यदि कोई छोटा रास्ता होता, तो बीएफएस उसे पहले ही मिल जाता।
चौड़ाई-प्रथम खोज का उपयोग सहकर्मी से सहकर्मी नेटवर्क में पड़ोसी नोड्स को खोजने के लिए किया जा सकता है जैसे कि बिटटोरेंट, जीपीएस सिस्टम पास के स्थानों को खोजने के लिए, सोशल नेटवर्किंग साइटों को निर्दिष्ट दूरी और उस तरह की चीजों में लोगों को खोजने के लिए।
Http://www.programmerinterview.com/index.php/data-structures/dfs-vs-bb/ से अच्छा स्पष्टीकरण
बीएफएस का एक उदाहरण
यहां एक उदाहरण है कि बीएफएस कैसा दिखेगा। यह कुछ स्तर के ऑर्डर ट्री ट्रैवर्सल की तरह है, जहां हम IREATIVE दृष्टिकोण के साथ QUEUE का उपयोग करेंगे (अधिकतर रिकॉर्ड DFS के साथ समाप्त हो जाएगा)। संख्या उस क्रम को दर्शाती है जिसमें नोड्स को BFS में एक्सेस किया जाता है:
गहराई से पहले खोज में, आप रूट पर शुरू करते हैं, और जहां तक संभव हो, तब तक पेड़ की एक शाखा का पालन करें जब तक कि आप जिस नोड की तलाश कर रहे हैं वह मिल जाए या आप एक लीफ नोड (बिना बच्चों वाला एक नोड) को मार दें। यदि आप एक पत्ती नोड को मारते हैं, तो आप अस्पष्टीकृत बच्चों के साथ निकटतम पूर्वज पर खोज जारी रखते हैं।
DFS का एक उदाहरण
यहाँ एक उदाहरण है कि DFS कैसा दिखेगा। मुझे लगता है कि बाइनरी ट्री में पोस्ट ऑर्डर ट्रैवर्सल पहले लीफ लेवल से काम शुरू करेगा। संख्या उस क्रम को दर्शाती है जिसमें नोड्स को डीएफएस में एक्सेस किया जाता है:
डीएफएस और बीएफएस के बीच अंतर
बीएफएस और डीएफएस की तुलना करना, डीएफएस का बड़ा फायदा यह है कि इसमें बीएफएस की तुलना में मेमोरी की आवश्यकताएं बहुत कम हैं, क्योंकि प्रत्येक स्तर पर सभी चाइल्ड पॉइंटर्स को स्टोर करना आवश्यक नहीं है। डेटा पर निर्भर करता है और आप क्या देख रहे हैं, या तो डीएफएस या बीएफएस फायदेमंद हो सकता है।
उदाहरण के लिए, एक परिवार का पेड़ दिया जाता है यदि कोई उस पेड़ पर किसी को ढूंढ रहा है जो अभी भी जीवित है, तो यह मान लेना सुरक्षित होगा कि वह व्यक्ति पेड़ के नीचे होगा। इसका मतलब यह है कि एक BFS को उस अंतिम स्तर तक पहुंचने में बहुत लंबा समय लगेगा। हालांकि, डीएफएस लक्ष्य को तेजी से प्राप्त करेगा। लेकिन, यदि कोई परिवार के सदस्य की तलाश में था, जो बहुत पहले मर गया, तो वह व्यक्ति पेड़ की चोटी के करीब होगा। फिर, एक बीएफएस आमतौर पर डीएफएस से तेज होगा। तो, डेटा के आधार पर या तो आप के फायदे अलग-अलग हैं।
एक और उदाहरण फेसबुक है; दोस्तों के दोस्तों पर सुझाव। हमें सुझाव के लिए तत्काल मित्रों की आवश्यकता है जहां हम BFS का उपयोग कर सकते हैं। सबसे छोटा रास्ता ढूंढना या चक्र का पता लगाना (पुनरावृत्ति का उपयोग करना) हम DFS का उपयोग कर सकते हैं।
चौड़ाई फर्स्ट सर्च आम तौर पर सबसे अच्छा तरीका है जब पेड़ की गहराई अलग-अलग हो सकती है, और आपको केवल समाधान के लिए पेड़ के हिस्से को खोजना होगा। उदाहरण के लिए, प्रारंभिक मूल्य से अंतिम मूल्य तक का सबसे छोटा रास्ता बीएफएस का उपयोग करने के लिए एक अच्छी जगह है।
जब आप पूरे पेड़ की खोज करने की आवश्यकता होती है तब गहराई पहले खोज का उपयोग आमतौर पर किया जाता है। बीएफएस की तुलना में इसे लागू करना (पुनरावृत्ति का उपयोग करना) आसान है, और इसके लिए कम राज्य की आवश्यकता होती है: जबकि बीएफएस के लिए आपको संपूर्ण 'फ्रंटियर' स्टोर करने की आवश्यकता होती है, डीएफएस को केवल आपको वर्तमान तत्व के मूल नोड्स की सूची को स्टोर करने की आवश्यकता होती है।
DFS BFS से अधिक स्थान-कुशल है, लेकिन अनावश्यक गहराई तक जा सकता है।
उनके नाम का खुलासा कर रहे हैं: अगर वहाँ एक बड़ी चौड़ाई (यानी बड़ी शाखा कारक) है, लेकिन बहुत सीमित गहराई (उदाहरण के लिए "चाल" की सीमित संख्या), तो DFS BFS के लिए अधिक बेहतर हो सकता है।
यह उल्लेख किया जाना चाहिए कि एक कम-ज्ञात संस्करण है जो डीएफएस की अंतरिक्ष दक्षता को जोड़ती है, लेकिन (संचयी रूप से) बीएफएस के स्तर-क्रम की यात्रा, पुनरावृत्ति गहन गहराई-पहली खोज है । यह एल्गोरिथ्म कुछ नोड्स का पुनरीक्षण करता है, लेकिन यह केवल अस्वाभाविक अंतर के एक निरंतर कारक का योगदान देता है।
जब आप एक प्रोग्रामर के रूप में इस प्रश्न से संपर्क करते हैं, तो एक कारक सामने आता है: यदि आप पुनरावृत्ति का उपयोग कर रहे हैं, तो गहराई-पहली खोज को लागू करना सरल है, क्योंकि आपको अतिरिक्त डेटा संरचना को बनाए रखने की आवश्यकता नहीं है, जिसमें नोड्स का पता लगाना अभी बाकी है।
यदि आप नोड्स में "पहले से ही देखे गए" जानकारी संग्रहीत कर रहे हैं, तो एक गैर-उन्मुख ग्राफ़ के लिए गहराई-पहली खोज यहाँ है:
def dfs(origin): # DFS from origin:
origin.visited = True # Mark the origin as visited
for neighbor in origin.neighbors: # Loop over the neighbors
if not neighbor.visited: dfs(next) # Visit each neighbor if not already visited
यदि एक अलग डेटा संरचना में "पहले से ही देखी गई" जानकारी संग्रहीत करना:
def dfs(node, visited): # DFS from origin, with already-visited set:
visited.add(node) # Mark the origin as visited
for neighbor in node.neighbors: # Loop over the neighbors
if not neighbor in visited: # If the neighbor hasn't been visited yet,
dfs(node, visited) # then visit the neighbor
dfs(origin, set())
चौड़ाई-प्रथम खोज के साथ इसका विरोध करें, जहां आपको अभी तक यात्रा करने के लिए नोड्स की सूची के लिए एक अलग डेटा संरचना बनाए रखने की आवश्यकता है, चाहे जो भी हो।
बीएफएस का एक महत्वपूर्ण लाभ यह होगा कि इसका उपयोग किसी भी दो नोड्स के बीच सबसे छोटे पथ को खोजने के लिए किया जा सकता है। जबकि, हम उसी के लिए DFS का उपयोग नहीं कर सकते ।
बीएफएस के लिए, हम फेसबुक उदाहरण पर विचार कर सकते हैं। हमें अन्य मित्रों के प्रोफ़ाइल से FB प्रोफ़ाइल से मित्रों को जोड़ने का सुझाव मिलता है। मान लीजिए कि A-> B, जबकि B-> E और B-> F है, तो A को E और F का सुझाव मिलेगा। उन्हें दूसरे स्तर तक पढ़ने के लिए BFS का उपयोग करना होगा। DFS उन परिदृश्यों पर आधारित है जहां हम स्रोत से गंतव्य तक डेटा के आधार पर कुछ पूर्वानुमान लगाना चाहते हैं। जैसा कि पहले ही शतरंज या सुडोकू के बारे में बताया गया है। एक बार जब मैं यहां अलग हो जाता हूं, तो मेरा मानना है कि डीएफएस का इस्तेमाल सबसे छोटे रास्ते के लिए किया जाना चाहिए क्योंकि डीएफएस पहले पूरे रास्ते को कवर करेगा, फिर हम सबसे अच्छा फैसला कर सकते हैं। लेकिन जैसा कि बीएफएस लालची दृष्टिकोण का उपयोग करेगा, ऐसा हो सकता है कि यह अपने सबसे छोटे रास्ते की तरह दिखे, लेकिन अंतिम परिणाम भिन्न हो सकता है। मुझे बताएं कि क्या मेरी समझ गलत है।
कुछ एल्गोरिदम काम करने के लिए DFS (या BFS) के विशेष गुणों पर निर्भर करते हैं। उदाहरण के लिए 2-जुड़े घटकों को खोजने के लिए हॉपक्रॉफ्ट और टार्जन एल्गोरिथ्म इस तथ्य का लाभ उठाते हैं कि डीएफएस द्वारा सामना किए गए प्रत्येक पहले से देखे गए नोड रूट से वर्तमान में खोजे गए नोड के रास्ते पर हैं।
समान्य शब्दों में:
चौड़ाई प्रथम खोज (BFS) एल्गोरिथ्म, इसके नाम "चौड़ाई" से, नोड के सभी पड़ोसियों को नोड के बाहरी किनारों के माध्यम से पता चलता है, फिर यह पहले से उल्लेख किए गए पड़ोसियों के बाहर के पड़ोसियों को उनके किनारों के माध्यम से और बाद में, सभी तक पता चलता है मूल स्रोत से पहुंच योग्य नोड्स का दौरा किया जाता है (यदि कोई शेष नोड्स और इसके आगे शेष हैं तो हम जारी रख सकते हैं और एक और मूल स्रोत ले सकते हैं)। इसीलिए इसका उपयोग एक नोड (मूल स्रोत) से दूसरे नोड के लिए सबसे कम पथ (यदि कोई है) को खोजने के लिए किया जा सकता है यदि किनारों का वजन एक समान है।
डेप्थ फर्स्ट सर्च (डीएफएस) एल्गोरिथ्म, इसके नाम "डेप्थ" से, इसके हाल के किनारों के माध्यम से सबसे हाल ही में खोजे गए नोड x के परिकल्पित पड़ोसियों को पता चलता है। यदि नोड x से कोई भी अपरिचित पड़ोसी नहीं है, तो एल्गोरिथ्म नोड के अपरिचित पड़ोसियों (इसके किनारों के माध्यम से) की खोज करने के लिए पीछे हटता है, जिसमें से नोड x की खोज की गई थी, और इसके बाद तक, मूल स्रोत से पहुंच योग्य सभी नोड्स का दौरा किया गया था (हम जारी रख सकते हैं और एक और मूल स्रोत ले सकते हैं यदि शेष अप्रकाशित नोड और आगे हैं)।
BFS और DFS दोनों अधूरे हो सकते हैं। उदाहरण के लिए यदि किसी नोड का ब्रांचिंग कारक अनंत है, या संसाधनों (मेमोरी) के लिए समर्थन के लिए बहुत बड़ा है (उदाहरण के लिए जब नोड्स को अगले खोजा जा रहा है), तो बीएफएस पूर्ण नहीं है, भले ही खोज की गई दूरी पर हो मूल स्रोत से कुछ किनारों की। यह अनंत ब्रांचिंग कारक खोज के लिए दिए गए नोड से अनंत विकल्पों (पड़ोसी नोड्स) के कारण हो सकता है। यदि गहराई अनंत है, या संसाधनों (मेमोरी) के लिए बहुत बड़ा है (जैसे जब नोड्स को अगले खोजा जा सकता है), तो डीएफएस पूरा नहीं होता है, भले ही खोज की गई कुंजी मूल स्रोत का तीसरा पड़ोसी हो। यह अनंत गहराई एक ऐसी स्थिति के कारण हो सकती है जहां हर नोड के लिए एल्गोरिथ्म पता चलता है, कम से कम एक नया विकल्प (पड़ोसी नोड) जो पहले से अनविजिट है।
इसलिए, हम BFS और DFS का उपयोग करते समय निष्कर्ष निकाल सकते हैं। मान लीजिए कि हम एक प्रबंधनीय सीमित शाखाओं के कारक और एक प्रबंधनीय सीमित गहराई के साथ काम कर रहे हैं। यदि खोजा गया नोड उथला है यानी मूल स्रोत से कुछ किनारों के बाद पहुंच योग्य है, तो बीएफएस का उपयोग करना बेहतर है। दूसरी ओर, अगर खोजा गया नोड गहरा है यानी मूल स्रोत से बहुत किनारों के बाद पहुंच योग्य है, तो एफएफ का उपयोग करना बेहतर है।
उदाहरण के लिए, एक सामाजिक नेटवर्क में यदि हम ऐसे लोगों की खोज करना चाहते हैं, जिनके पास किसी विशिष्ट व्यक्ति के समान हित हों, तो हम इस व्यक्ति से एक मूल स्रोत के रूप में BFS आवेदन कर सकते हैं, क्योंकि ज्यादातर ये लोग उसके सीधे दोस्त या दोस्तों के दोस्त होंगे अर्थात एक या दो किनारों दूर। दूसरी ओर, यदि हम ऐसे लोगों की खोज करना चाहते हैं, जिनके पास किसी विशिष्ट व्यक्ति के पूरी तरह से अलग-अलग रुचियां हैं, तो हम इस व्यक्ति से एक मूल स्रोत के रूप में डीएफएस लागू कर सकते हैं, क्योंकि ज्यादातर ये लोग उससे बहुत दूर होंगे यानी दोस्त के दोस्त के दोस्त .... यानी बहुत किनारे।
बीएफएस और डीएफएस के अनुप्रयोग हर एक में खोज के तंत्र के कारण भी भिन्न हो सकते हैं। उदाहरण के लिए, हम या तो बीएफएस का उपयोग कर सकते हैं (यह मानते हुए कि शाखा कारक प्रबंधनीय है) या डीएफएस (गहराई प्रबंधनीय है) जब हम सिर्फ एक नोड से दूसरे तक पहुंच की जांच करना चाहते हैं तो कोई जानकारी नहीं है कि नोड कहां हो सकता है। इसके अलावा, दोनों ही एक ग्राफ के टोपोलॉजिकल सॉर्टिंग (यदि ऐसा है) जैसे कार्यों को हल कर सकते हैं। बीएफएस का उपयोग सबसे छोटा रास्ता खोजने के लिए किया जा सकता है, इकाई भार किनारों के साथ, एक नोड (मूल स्रोत) से दूसरे में। जबकि, डीएफएस का उपयोग गहराई में जाने की अपनी प्रकृति के कारण सभी विकल्पों को समाप्त करने के लिए किया जा सकता है, जैसे कि एक चक्रीय ग्राफ में दो नोड्स के बीच सबसे लंबे रास्ते की खोज करना। इसके अलावा डीएफएस, एक ग्राफ में चक्र का पता लगाने के लिए इस्तेमाल किया जा सकता है।
अंत में अगर हमारे पास अनंत गहराई और अनंत शाखा कारक है, तो हम Iterative Deepening Search (IDS) का उपयोग कर सकते हैं।
डीएफएस और बीएफएस के गुणों के अनुसार। उदाहरण के लिए, जब हम सबसे छोटा रास्ता खोजना चाहते हैं। हम आमतौर पर bfs का उपयोग करते हैं, यह 'सबसे छोटा' की गारंटी दे सकता है। लेकिन dfs केवल गारंटी दे सकते हैं कि हम इस बिंदु से आ सकते हैं, उस बिंदु को प्राप्त कर सकते हैं, 'सबसे कम' की गारंटी नहीं दे सकते।
मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप किन समस्याओं का सामना कर रहे हैं।
क्योंकि डेप्थ-फर्स्ट सर्च एक स्टैक का उपयोग करते हैं क्योंकि नोड्स संसाधित होते हैं, डीएफएस के साथ बैकट्रैकिंग प्रदान की जाती है। क्योंकि चौड़ाई-प्रथम खोजें एक कतार का उपयोग करती हैं, एक स्टैक का नहीं, नोड्स को संसाधित करने का ट्रैक रखने के लिए, BFS के साथ बैकट्रैकिंग प्रदान नहीं की जाती है।
यह प्रदर्शित करने के लिए एक अच्छा उदाहरण है कि बीएफएस कुछ मामलों में डीएफएस से बेहतर है। https://leetcode.com/problems/01-matrix/
जब सही ढंग से लागू किया जाता है, तो दोनों समाधानों को उन कोशिकाओं का दौरा करना चाहिए जिनकी वर्तमान सेल +1 की तुलना में अधिक दूरी है। लेकिन DFS अक्षम है और बार-बार O (n * n) जटिलता के परिणामस्वरूप एक ही सेल का दौरा किया।
उदाहरण के लिए,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
यह उस स्थिति पर निर्भर करता है जिसमें इसका उपयोग किया जाता है। जब भी हमें किसी ग्राफ को ट्रेस करने की समस्या होती है, तो हम इसे किसी उद्देश्य के लिए करते हैं। जब एक अनवॉन्टेड ग्राफ में सबसे छोटा रास्ता खोजने की समस्या होती है, या यह पता लगाना कि क्या ग्राफ द्विभाजित है, हम FFS का उपयोग कर सकते हैं। साइकिल का पता लगाने या बैकट्रैकिंग की आवश्यकता वाले किसी भी तर्क की समस्याओं के लिए, हम DFS का उपयोग कर सकते हैं।