एक डीएफटी में क्रॉस किनारों और आगे के किनारों के बीच अंतर


11

पहले गहराई में, पेड़ के किनारों को परिभाषित किया जाता है (यानी कि किनारों का उपयोग किया गया था)।

कुछ बचे हुए किनारे हैं जो कुछ अन्य नोड्स को जोड़ते हैं। क्रॉस एज और फॉरवर्ड एज में क्या अंतर है?

विकिपीडिया से:

इस फैले हुए पेड़ के आधार पर, मूल ग्राफ के किनारों को तीन वर्गों में विभाजित किया जा सकता है: आगे के किनारे, जो पेड़ के एक नोड से उसके वंशज, पीछे के किनारों को इंगित करते हैं, जो नोड से उसके पूर्वजों में से एक तक इंगित करते हैं, और पार किनारों, जो न तो। कभी-कभी पेड़ के किनारों, किनारों जो कि स्वयं फैले हुए पेड़ के होते हैं, को आगे के किनारों से अलग से वर्गीकृत किया जाता है। यदि मूल ग्राफ अप्रत्यक्ष है तो इसके सभी किनारे पेड़ के किनारे या पीछे के किनारे हैं।

क्या एक किनारे का उपयोग नहीं किया जाता है जो एक नोड से दूसरे में अभिभावक-बच्चे के संबंध को स्थापित करने वाले बिंदुओं में उपयोग नहीं किया जाता है?


संबंधित: cs.stackexchange.com/questions/99988/… एक एल्गोरिथ्म स्थापित करना चाहता है, जो कि निर्देशित ग्राफ के लिए, गहराई से पहली खोज के दौरान, क्रॉस किनारों के बजाय आगे किनारों को बनाना पसंद करेगा।
pfalcon

जवाबों:


23

विकिपीडिया का जवाब है:

यहाँ छवि विवरण दर्ज करें

इस चित्र में सभी प्रकार के किनारे दिखाई देते हैं। इस ग्राफ पर डीएफएस ट्रेस करें (संख्यात्मक क्रम में नोड्स का पता लगाया गया है), और देखें कि आपका अंतर्ज्ञान विफल नहीं होता है।


यह आरेख की व्याख्या करेगा: -

फॉरवर्ड एज: (यू, वी), जहां वी यू का वंशज है, लेकिन ट्री एज नहीं है। यह एक गैर-ट्री एज है जो डीएफएस-ट्री में एक शीर्ष को एक वंश से जोड़ता है।

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


पहले (दाएं पक्ष पहले) का पता लगाया जाना 6 के लिए असंभव क्यों नहीं है? अगर ऐसा हुआ था, तो 2-> 3 बढ़त को क्या कहा जाएगा?
कालंडो

@soandos, मेरा सुझाव है कि आप एल्गोरिथ्म का पता लगाने के लिए खुद समय निकालें। यह मानते हुए कि विकिपीडिया के लोगों ने गलती नहीं की, छवि इस ग्राफ पर डीएफएस की एक सकारात्मक भूमिका का वर्णन करती है, और इसलिए एल्गोरिथ्म को इस ट्रेस में फिट करने का एक तरीका है। विकिपीडिया में किनारों के प्रकार स्पष्ट रूप से पर्याप्त हैं, और आप इस उदाहरण से भी परामर्श कर सकते हैं।
युवल फिल्मस Yu

मैं समझता हूं कि यह डीएफएस करने का एक वैध तरीका है। मैं बस यह पूछ रहा हूं कि क्या यह दूसरे तरीके से किया गया था।
soandos

फिर परिणाम भिन्न होंगे। मुझे क्षमा करें, आपको इसे स्वयं पूरा करना होगा।
युवल फिल्मस

2
@soandos सामान्य तौर पर, कई डीएफएस ट्रैवर्सल्स बहुत अच्छी तरह से हो सकते हैं। यहां इस्तेमाल की गई धारणाएं किसी दिए गए ट्रैवर्सल के सापेक्ष हैं और कई ट्रैवर्सल्स के लिए अलग-अलग होंगी।
राफेल

9

एक अप्रत्यक्ष ग्राफ में एक डीएफएस ट्रैवर्सल एक क्रॉस एज नहीं छोड़ेगा क्योंकि सभी किनारों जो एक शीर्ष पर घटना होती हैं, का पता लगाया जाता है।

हालाँकि, एक निर्देशित ग्राफ़ में, आप एक किनारे पर आ सकते हैं जो एक शीर्ष पर ले जाता है जिसे इस तरह से पहले खोजा गया है कि वर्टेक्स वर्तमान वर्टेक्स का पूर्वज या वंशज नहीं है। इस तरह की बढ़त को क्रॉस एज कहा जाता है।


एपरोव, प्रतिक्रिया के लिए धन्यवाद। यह अभी भी मुझे लगता है कि जब आप विकिपीडिया में चित्र के रूप में डीएफएस में 6 शीर्ष पर पहुंचते हैं, तो आपके पास 6. पार करने के लिए तीन किनारे होते हैं। उस बिंदु पर, शीर्ष 6 "वर्तमान" है। आखिरकार आप किनारे को कगार पर ले जाने जा रहे हैं। 3. जबकि पहले से ही 3 का दौरा किया जा चुका है, फिर भी 6 से 3 तक की बढ़त है, तो 3 "वर्तमान" शीर्ष 6 का वंशज है। यदि ऐसा है तो यह उल्लंघन करता है। एक क्रॉस एज की परिभाषा। बहुत स्पष्ट नहीं होने वाली परिभाषा के लिए कुछ अधिक होना चाहिए।

वास्तव में, DFS में बैक के किनारों के लिए या तो ट्री एज होते हैं (Intro to Algorithms Thm। 22.10)।
14:17 बजे jrhee17

2

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

D [नोड] नोड का खोज समय हो सकता है, इसी तरह f [नोड] का समापन समय होगा।

पेरेंटेसिस प्रमेय सभी यू, वी के लिए, निम्नलिखित में से एक को धारण करता है:
1. डी [यू] <एफ [यू] <डी [वी] <एफ [वी] या डी [वी] <एफ [वी] <डी [यू ] <f [यू] और न ही यू और वी दूसरे का वंशज है।

  1. d [u] <d [v] <f [v] <f [u] और v, u का वंशज है।

  2. d [v] <d [u] <f [u] <f [v] और u v का वंशज है।

तो, d [u] <d [v] <f [u] <f [v] नहीं हो सकता।
कोष्ठक की तरह: () [], ([]), और [()] ठीक हैं लेकिन ([)] और [(]) ठीक नहीं हैं।

उदाहरण के लिए, किनारों के साथ ग्राफ पर विचार करें:
ए -> बी
ए -> सी
बी -> सी

जाने के क्रम को नोड लेबल के एक स्ट्रिंग द्वारा दर्शाया जाता है, जहां "ABCCBA" का अर्थ ए -> बी -> सी (समाप्त) बी (समाप्त) ए (समाप्त), (()) के समान है।

तो "ACCBBA" (() ()) "के लिए एक मॉडल हो सकता है।

उदाहरण:
"CCABBA": तब A -> C एक क्रॉस एज है, क्योंकि CC A.
"ABCCBA" के अंदर नहीं है : फिर A -> C एक फॉरवर्ड एज (इनडायरेक्ट डिसाइडेंट) है।
"एसीसीबीबीए": फिर ए -> सी एक पेड़ का किनारा (प्रत्यक्ष वंशज) है।

स्रोत:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms
Lecure नोट्स http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.