ग्राफ़ खोज: चौड़ाई-पहला बनाम गहराई-पहला


78

ग्राफ़ खोजते समय, दो आसान एल्गोरिदम हैं: चौड़ाई-प्रथम और गहराई-पहले (आमतौर पर सभी आसन्न ग्राफ़ नोड्स को एक कतार (चौड़ाई-पहले) या स्टैक (गहराई-पहले) से जोड़कर)।

अब, क्या एक के बाद एक फायदे हैं?

जिनके बारे में मैं सोच सकता था:

  • यदि आप अपने डेटा को ग्राफ़ के अंदर बहुत दूर तक होने की उम्मीद करते हैं, तो गहराई-पहले इसे पहले पा सकते हैं, क्योंकि आप ग्राफ़ के गहरे हिस्सों में बहुत तेज़ी से नीचे जा रहे हैं।
  • इसके विपरीत, यदि आप उम्मीद करते हैं कि आपका डेटा ग्राफ़ में बहुत दूर होगा, तो पहले ही परिणाम पहले दे सकता है।

क्या ऐसा कुछ है जो मैंने याद किया है या यह ज्यादातर व्यक्तिगत प्राथमिकता पर आता है?

जवाबों:


43

मैं स्टैक ओवरफ्लो से hstoerr द्वारा एक उत्तर को उद्धृत करना चाहूंगा, जो समस्या को अच्छी तरह से कवर करता है:

यह खोज पेड़ की संरचना और समाधानों की संख्या और स्थान पर बहुत अधिक निर्भर करता है
यदि आप जानते हैं कि एक समाधान पेड़ की जड़ से दूर नहीं है, तो एक चौड़ाई पहली खोज (बीएफएस) बेहतर हो सकती है। यदि पेड़ बहुत गहरा है और समाधान दुर्लभ हैं, तो गहराई पहले खोज (डीएफएस) हमेशा के लिए जड़ हो सकती है, लेकिन बीएफएस तेज हो सकता है। यदि पेड़ बहुत चौड़ा है, तो बीएफएस को बहुत अधिक मेमोरी की आवश्यकता हो सकती है, इसलिए यह पूरी तरह से अव्यावहारिक हो सकता है। यदि समाधान अक्सर होते हैं लेकिन पेड़ में गहरे स्थित होते हैं, तो बीएफएस अव्यावहारिक हो सकता है। यदि खोज ट्री बहुत गहरा है, तो आपको गहराई से पहले खोज (डीएफएस) के लिए खोज गहराई को सीमित करने की आवश्यकता होगी, वैसे भी (उदाहरण के लिए गहरा करने के साथ)।

लेकिन ये सिर्फ अंगूठे के नियम हैं; आपको शायद प्रयोग करने की आवश्यकता होगी।

Rafł Dowgird भी टिप्पणी:

कुछ एल्गोरिदम काम करने के लिए DFS (या BFS) के विशेष गुणों पर निर्भर करते हैं। उदाहरण के लिए 2-जुड़े घटकों को खोजने के लिए हॉपक्रॉफ्ट और टार्जन एल्गोरिथ्म इस तथ्य का लाभ उठाते हैं कि डीएफएस द्वारा सामना किए गए प्रत्येक पहले से देखे गए नोड रूट से वर्तमान में खोजे गए नोड के रास्ते पर हैं।


5
मुझे समझ नहीं आ रहा है कि इस उत्तर में 27 अपवोट क्यों हैं और यह वास्तव में 2 अन्य उत्तरों का विलय है, जो कि सामान्य रूप से सामान्य विचार हैं ...
nbro

37

एक बात जो हमारे मल्टीकोर दुनिया में महत्वपूर्ण है: बीएफएस को समानांतर बनाना ज्यादा आसान है। यह सहज रूप से उचित है (प्रत्येक बच्चे के लिए थ्रेड्स भेजें) और ऐसा साबित भी किया जा सकता है। इसलिए यदि आपके पास एक परिदृश्य है जहां आप समानता का उपयोग कर सकते हैं, तो बीएफएस जाने का रास्ता है।


8
यदि दी गई सेटिंग में डीएफएस अन्यथा लाभप्रद है, तो आप बीएफएस लागू कर सकते हैं जब तक कि आपने पर्याप्त थ्रेड्स पैदा न किए हों और डीएफएस जारी रखें। अधिक विशेष रूप से, आप डीएफएस कर सकते हैं और जब भी आप उतरते हैं और पर्याप्त धागे नहीं होते हैं, तो अगले भाई-बहन के लिए एक स्पॉन करें।
राफेल

इस उत्तर में 20 उत्थान नहीं हैं। प्रश्न 2 एल्गोरिदम के सामान्य उपयोग के बारे में है और किसी विशेष उपयोग के बारे में नहीं है।
nbro

31

(मैंने इसे एक सामुदायिक विकि बनाया है। कृपया बेझिझक संपादित करें।)

अगर

फिर

  • हे()हे()
  • हे()हे()
  • हे()हे()

चुनने का कारण

  • डीएफएस
    • वैसे भी पूरे पेड़ को देखना चाहिए
    • उत्तर के सबसे करीब होने पर परवाह न करें
  • BFS
    • उत्तर जड़ के करीब है
    • आप ऐसा उत्तर चाहते हैं जो मूल के सबसे करीब हो
    • कई कोर / प्रोसेसर है
  • IDDFS
    • आप बीएफएस चाहते हैं, पर्याप्त मेमोरी नहीं है, लेकिन कुछ धीमा स्वीकार्य है

IDDFS = पुनरावृत्ति गहनता-प्रथम खोज


1
यह एक उत्कृष्ट उत्तर है। मैं हालांकि यह देखता हूं कि प्रश्न ग्राफ के बारे में पूछता है, लेकिन यह उत्तर पेड़ों को संदर्भित करता है। एक पेड़ निश्चित रूप से एक ग्राफ है, और यह शब्द को प्रतिस्थापित किया जा सकता है ... लेकिन कैसे h, "पेड़ की ऊंचाई"। क्या यह सीधे "ग्राफ की ऊंचाई" पर अनुवाद करता है?
user2023370

IDDFS का उपयोग करने का एक अन्य कारण यह है कि आप इसका उपयोग कैसे करना चाहते हैं, इसके आधार पर, प्रत्येक पुनरावृत्ति के बाद आपके पास एक संभावित उत्तर हो सकता है (यदि आप खोज रहे हैं, तो, अधिकतम या न्यूनतम)। इसका मतलब है कि आप एल्गोरिथ्म को जल्दी छोड़ सकते हैं यदि आपका उत्तर "काफी अच्छा" है या आप उपयोगकर्ता इनपुट पर छोड़ सकते हैं (जैसे, एक इष्टतम समाधान खोजने के लिए आईडीडीएफएस का उपयोग करके एक शतरंज इंजन, लेकिन एक खिलाड़ी द्वारा एक टुकड़े को घुमाकर बाधित किया जा रहा है)।
jedd.ahyoung 19

एक अन्य बिंदु जो जोड़ा जाता है वह यह है कि DFS स्टैक का उपयोग करता है जबकि BFS कतार का उपयोग करता है।
कार्तिक बालगुरु

17

एक परिदृश्य (सबसे छोटा रास्ता खोजने के अलावा, जो पहले ही उल्लेख किया जा चुका है) जहां आपको एक सही कार्यक्रम प्राप्त करने के लिए दूसरे पर एक का चयन करना पड़ सकता है, अनंत रेखांकन होंगे:

यदि हम उदाहरण के लिए एक पेड़ पर विचार करें जहाँ प्रत्येक नोड में बच्चों की एक सीमित संख्या है, लेकिन पेड़ की ऊंचाई अनंत है, तो DFS को वह नोड कभी नहीं मिल सकता है जिसकी आप तलाश कर रहे हैं - यह सिर्फ हर नोड के पहले बच्चे का दौरा करता रहेगा। देखता है, इसलिए यदि आप जिसे खोज रहे हैं, वह अपने माता-पिता की पहली संतान नहीं है, तो यह कभी नहीं मिलेगा। बीएफएस को हालांकि यह सीमित समय में खोजने की गारंटी है।

इसी तरह अगर हम एक ऐसे पेड़ पर विचार करते हैं, जहाँ प्रत्येक नोड में बच्चों की संख्या अनंत हो, लेकिन पेड़ की एक सीमित ऊँचाई हो, तो BFS समाप्त नहीं हो सकता है। यह केवल रूट नोड के बच्चों का दौरा करेगा और यदि आप जिस नोड की तलाश कर रहे हैं वह किसी अन्य नोड का बच्चा है, तो यह नहीं पहुंचेगा। इस मामले में डीएफएस की गारंटी दी जाती है कि इसे परिमित समय में खोजा जाए।


7
यह उल्लेखनीय है कि दोनों अनंत रेखांकन के लिए केवल अर्ध-निर्णय एल्गोरिदम का उत्पादन करते हैं; आप तय समय में तय नहीं कर सकते हैं कि कोई तत्व पेड़ में नहीं है (स्पष्ट रूप से)। व्यावहारिक अनुप्रयोगों के लिए, ध्यान दें कि (वैचारिक रूप से) अनंत डेटा संरचनाओं को परिभाषित किया जा सकता है (पैरा 3.4 देखें)!
राफेल

15

चौड़ाई-प्रथम और गहराई-पहले निश्चित रूप से एक ही सबसे खराब मामला है (वांछित नोड पिछले एक पाया गया है)। मुझे संदेह है कि एवरेज-केस के लिए भी यह सच है अगर आपको अपने ग्राफ़ के बारे में जानकारी नहीं है।

चौड़ाई-पहली खोज का एक अच्छा बोनस यह है कि यह सबसे छोटे रास्तों (कुछ किनारों के अर्थ में) को खोजती है जो ब्याज की हो सकती है या नहीं भी।

यदि आपकी औसत नोड रैंक (पड़ोसियों की संख्या) नोड्स की संख्या (यानी ग्राफ घनी है) की तुलना में अधिक है, तो चौड़ाई-पहले में बड़ी कतारें होंगी जबकि गहराई-पहले छोटे स्टैक होंगे। विरल रेखांकन में स्थिति उलट होती है। इसलिए, यदि स्मृति एक सीमित कारक है तो हाथ पर ग्राफ का आकार आपकी पसंद की खोज रणनीति को सूचित कर सकता है।


बीएफएस में कतार की लंबाई और डीएफएस में स्टैक की ऊंचाई कार्यान्वयन पर बहुत निर्भर करती है। यदि dfs के मामले में आप स्टैक पर हमेशा पूरे पड़ोसी का विस्तार करते हैं तो यह बहुत बढ़ता है, खासकर जब ग्राफ घना होता है। केवल संदर्भ को धकेलना जो बताता है कि कहां से जारी रखना है जब पुनरावृत्ति से dfs वापस आता है तो बहुत सी जगह बचाता है।
औली

3

उपरोक्त सभी सही हैं, लेकिन यह उल्लेखनीय है कि बीएफएस और डीएफएस अपने स्वयं के पेड़ बनाते हैं, इस क्रम के आधार पर वे पेड़ को पार करने के लिए उपयोग करते हैं। उन पेड़ों में से प्रत्येक की अपनी संपत्ति है जो किसी प्रकार की समस्याओं में उपयोगी हो सकती है।

उदाहरण के लिए, मूल ग्राफ़ के सभी किनारे जो बीएफएस के पेड़ में नहीं हैं, वे क्रॉस किनारों हैं; किनारों जो बीएफएस पेड़ की दो शाखाओं के बीच हैं। मूल ग्राफ़ के सभी किनारे जो डीएफएस पेड़ में नहीं हैं, वे वापस किनारे हैं; किनारों जो DFS पेड़ की एक शाखा में दो कोने जोड़ते हैं। इस तरह के गुण विशेष रंगाई आदि जैसी समस्याओं के लिए उपयोगी हो सकते हैं।


1

DFS और BFS ट्री दोनों के अपने विशिष्ट गुण हैं जो आपको ग्राफ़ के बारे में अधिक उपयोगी जानकारी दे सकते हैं। एक एकल DFS के साथ उदाहरण के लिए आप निम्न कार्य कर सकते हैं:

  • पुलों और आर्टिक्यूलेशन बिंदुओं को खोजें (अप्रत्यक्ष रेखांकन के लिए)
  • चक्र का पता लगाना
  • दृढ़ता से जुड़े घटकों का पता लगाएं (टारजन का एल्गोरिथ्म)

बीएफएस के साथ, आप स्रोत नोड और ग्राफ़ में किसी भी अन्य नोड्स के बीच सबसे छोटा रास्ता पा सकते हैं।

सीएलआरएस में ग्राफ एल्गोरिथ्म अध्याय डीएफएस और बीएफएस के इन गुणों को बहुत अच्छी तरह से प्रस्तुत करता है।


-2

मुझे लगता है कि दोनों को इस तरह से लिखना दिलचस्प होगा कि केवल कोड की कुछ पंक्तियों को स्विच करने से आपको एक एल्गोरिथ्म या दूसरा मिलेगा, जिससे आप देखेंगे कि आपका डिल्मा इतना मजबूत नहीं है जितना कि यह पहले लगता है ।

मुझे व्यक्तिगत रूप से बीएफएस की व्याख्या एक परिदृश्य में बाढ़ के रूप में पसंद है: कम ऊंचाई वाले क्षेत्रों में पहले बाढ़ आएगी, और उसके बाद ही ऊंचाई वाले क्षेत्रों का अनुसरण किया जाएगा। यदि आप भूगोल की किताबों में देखे जाने वाले परिदृश्यों को अलग-थलग करने की कल्पना करते हैं, तो यह देखना आसान है कि बीएफएस एक ही समय में एक ही आइसोलिन के तहत सभी क्षेत्र को भर देता है, जैसा कि यह भौतिकी के साथ होगा। इस प्रकार, दूरी या स्केल की गई लागत के रूप में ऊंचाई की व्याख्या करना एल्गोरिथ्म का एक बहुत सहज ज्ञान युक्त विचार देता है।

इसे ध्यान में रखते हुए, आप आसानी से न्यूनतम फैले हुए पेड़ को आसानी से खोजने के लिए चौड़ाई खोज के पीछे के विचार को अनुकूलित कर सकते हैं, सबसे छोटा रास्ता, और कई अन्य न्यूनतम एल्गोरिदम भी।

मैंने अभी तक डीएफएस की किसी भी सहज व्याख्या को नहीं देखा है (केवल भूलभुलैया के बारे में मानक एक है, लेकिन यह बीएफएस एक और बाढ़ के रूप में शक्तिशाली नहीं है), इसलिए मेरे लिए ऐसा लगता है कि बीएफएस उपरोक्त भौतिक घटनाओं के साथ बेहतर संबंध रखता है, जबकि डीएफएस तर्कसंगत सिस्टम (यानी लोग या कंप्यूटर जो एक शतरंज के खेल पर बनाने के लिए आगे बढ़ते हैं या भूलभुलैया से बाहर निकलते हैं) पर विकल्पों के साथ बेहतर संबंध बनाते हैं।

इसलिए, मेरे लिए झूठ के बीच का अंतर प्राकृतिक घटना वास्तविक जीवन में उनके प्रचार मॉडल (ट्रांसवर्सिंग) से सबसे अच्छा मेल खाता है।


2
साइट पर आपका स्वागत है! हालाँकि, मैं वास्तव में यह नहीं देखता कि यह प्रश्न का उत्तर कैसे देता है। यह बीएफएस और डीएफएस के बारे में आपकी सामान्य भावनाओं और अंतर्ज्ञान प्रतीत होता है, लेकिन सवाल भावनाओं और अंतर्ज्ञान के बारे में नहीं पूछ रहा है: यह फायदे और नुकसान के बारे में पूछ रहा है। आपका जवाब पता नहीं लगता है कि बिल्कुल।
डेविड रिचेर्बी

प्रश्न से जुड़ा सबसे हिस्सा न्यूनतम फैले पेड़ों, सबसे छोटे रास्ते और इतने पर खोजने के लिए एल्गोरिथ्म को अपनाने के बारे में है, और यह कहना है कि
बीएफएस

1
सवाल यह नहीं पूछ रहा है कि बीएफएस और डीएफएस से संबंधित क्या है। यह फैले हुए पेड़ों या सबसे छोटे रास्तों को खोजने या "प्राकृतिक घटनाओं को पुन: उत्पन्न करने" के बारे में नहीं पूछ रहा है।
डेविड रिचरबी

इसके फायदे पूछ रहे हैं। यदि कोई भौतिक घटना को मॉडल कर सकता है, जबकि यह घटना नहीं है, तो इसका एक फायदा यह है कि आपको इस घटना को मॉडल करने की आवश्यकता है। मुझे लगता है कि आप 'लाभ' शब्द की व्याख्या करते समय एल्गोरिदम पाठ्यपुस्तक की मानक अवधारणाओं से चिपके हुए हैं, जबकि मैं नहीं हूँ
user5193682
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.