2009-04-06 4 views
11

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

क्या मुझे प्रत्येक डालने और कनेक्टिंग ऑपरेशन के लिए cycle detection जोड़ना है, या ऐसे नियम हैं जिन्हें मैं सम्मिलन पर अनुसरण कर सकता हूं जो गारंटी देगा कि मैं चक्र नहीं बना रहा हूं?

एक दृष्टिकोण जिसे मैं सोच सकता हूं, प्रत्येक नोड के topological level को स्टोर करना है और केवल नए किनारों को अनुमति देना है जो उच्च स्तर (स्रोत नोड्स से दूर) को इंगित करते हैं। हालांकि, ऐसा लगता है कि यह वास्तव में मुझे बहुत सारी लचीलापन लूट लेगा जो मैं साधारण पेड़ों के सेट के बजाय डीएजी का उपयोग करके प्राप्त करने की उम्मीद कर रहा था।

उत्तर

6

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

@Markus कहते हैं, हालांकि, अगर आप लिंक करने के लिए दोनों और मौजूदा नोड्स के लिए नए नोड से नहीं बना रहे हैं, तो आप के लिए एक नया नोड शुरू करने से एक चक्र बनाने के लिए सक्षम नहीं होना चाहिए ग्राफ।

+0

यह सबसे व्यावहारिक विकल्प की तरह लगता है, लेकिन मुझे यह जांचना होगा कि यह मेरी अंतरिक्ष आवश्यकताओं के लिए क्या करने जा रहा है और क्या इससे कोई फर्क नहीं पड़ता है। –

+0

मुझे सामान्य मामलों में इसकी दक्षता पर संदेह है (एक पांच स्तर का ग्राफ कल्पना करें जहां प्रत्येक स्तर के अधिकांश नोड्स अगले में अधिकांश नोड्स को इंगित करते हैं)। रिवर्स पॉइंटर विचार कुछ मामलों में काम कर सकता है, लेकिन आंशिक क्रम सामान्य रूप से बहुत तेज होना चाहिए। – MarkusQ

+0

@ मार्कस्क्यू - मुझे समझ में आया कि यदि संभव हो तो वह आंशिक क्रम से बचना चाहता था। – tvanfosson

2

आप क्या कर सकते हैं नोड्स को टोपोलॉजिकल ऑर्डरिंग ("टोपोलॉजिकल सॉर्ट" के लिए खोजें) में रखने के लिए क्या करना है। जब आप निचले क्रम से उच्च-आदेश नोड तक एक चाप जोड़ते हैं तो आप जानते हैं कि कोई चक्र नहीं बनाया गया था। रिवर्स मामले में, आपको अपने टोपोलॉजिकल ऑर्डरिंग को क्रमशः अपडेट करने की आवश्यकता है और साथ ही साथ साइकिल का पता लगाने की आवश्यकता है।

+1

यदि मैं ग्राफिक रूप से ग्राफ को सॉर्ट करता हूं, और सॉर्ट काम करता है, तो इसका मतलब है कि कोई चक्र नहीं है, है ना? –

+0

सच; यदि आप एक पेड़ के रूप में ऑर्डरिंग बनाए रखते हैं, तो आपको ओ (लॉग एन) प्रति जटिल डालने की समय जटिलता मिलती है। – jpalecek

4

इस संरचना एक नया शिखर और वहाँ से अन्य कोने

यदि नए किनारों के सभी कर रहे हैं नई शिखर से आप कभी नहीं होगा करने के लिए फिर एक नई धार जोड़कर अद्यतन किया जाता है जब चक्र बनाओ

आप भी बड़े नोड से नई शिखर के किनारों को जोड़ने के लिए जा रहे हैं, तो अपने विकल्पों ग्राफ की उम्मीद आकार पर निर्भर करते हैं। वे सभी आंशिक क्रम पर भिन्नता के लिए उबालते हैं, लेकिन ऐसे हैक हैं जो पेड़ों, जंगलों, हीरे-मेष आदि के लिए बेहतर प्रदर्शन देते हैं। अपेक्षित समग्र ग्राफ आकार के बारे में आप क्या जानते हैं?

+0

इसे इंगित करने के लिए धन्यवाद, मैंने तदनुसार मेरे प्रश्न को स्पष्ट किया। आकार के लिए, मैं अभी तक नहीं जानता। बहुत सारे आकार इस बात पर निर्भर हैं कि लोग आवेदन का उपयोग कैसे करेंगे। मैं पैटर्न की उम्मीद कर रहा हूं, लेकिन मैं यह नहीं कह सकता कि ये कौन से होने जा रहे हैं। –

+0

मैं अभी आंशिक ऑर्डरिंग देख रहा हूं, लेकिन मुझे लगता है कि यह मेरी मदद करता है कि मैं कैसे मदद करता हूं। निश्चित रूप से, मेरे ग्राफ में ऑर्डर है, और मैं इसे सॉर्ट कर सकता हूं, लेकिन यह चक्र को कैसे रोक रहा है? क्या यह वही सड़क है जो टोपोलॉजिकल सॉर्टिंग antti.huima सुझाव देता है? –

+0

इसके अलावा, जैसा कि आकार की अपेक्षा की जा रही है, यह संभवतः यह कहना सुरक्षित है कि यह पेड़ होने जा रहा है, लेकिन वे कई शाखाएं साझा करते हैं (मैं यह पता लगाने की कोशिश कर रहा था कि जब मैं एक का उपयोग करने के विचार पर आया तो कई पेड़ सिंक्रनाइज़ किए जाएंगे इसके बजाय एकल डीएजी) –

3

this article में, स्थलीय आदेश (पृष्ठ 4) को बनाए रखने के लिए एक ऑनलाइन एल्गोरिदम है।

संबंधित मुद्दे