एक निर्देशित चक्रीय ग्राफ के सकर्मक बंद को पुनः प्राप्त करने के लिए कुशल एल्गोरिथ्म


14

मैं एक ग्राफ समस्या को हल करने की कोशिश कर रहा हूं (यह होमवर्क के लिए नहीं है, बस मेरे कौशल का अभ्यास करने के लिए)। एक डीएजी दिया जाता है, जहां वी कोने और किनारों का सेट है । ग्राफ को आसन्न सूची के रूप में दर्शाया गया है, इसलिए A v एक सेट है जिसमें v के सभी कनेक्शन हैं । मेरे काम को खोजने के लिए जो कोने प्रत्येक शिखर से पहुंचा जा सकता है है वी वी । मेरे द्वारा उपयोग किए जाने वाले समाधान में O ( V 3 ) की जटिलता है G(V,E)VEAvvvVO(V3), सकर्मक बंद होने के साथ, लेकिन मैंने पढ़ा कि एक ब्लॉग में यह तेज हो सकता है, हालांकि यह नहीं बताया कि कैसे। किसी ने मुझे एक बेहतर तरीका (बेहतर जटिलता के साथ) एक DAG में सकर्मक बंद करने की समस्या को हल करने के लिए कहा?


एक नज़र डालें: stackoverflow.com/questions/3517524/…
16

16

हालाँकि, मेरा सुझाव रखना है । लेकिन बस औसतन तुलना की संख्या को कम करने की कोशिश करें। यही है, अनुमान लगाएं और अपने एल्गोरिथ्म में सरल नियम जोड़ें। आप मैट्रिक्स गुणा का उपयोग कर सकते हैं - लेकिन यदि आप इसे छोटे रेखांकन के लिए उपयोग कर रहे हैं - तो यह सिर्फ एक गड़बड़ है और वास्तव में व्यवहार में आपका तरीका बेहतर है। O(|V|3)
17

@AJed इस विशेष समस्या में, समय सीमा को पार कर जाएगा। O(V3)
रॉन्टोगियनिस अरिस्टोफैनिस

2
@RondogiannisAristophanes जब आप समय सीमा कहते हैं, तो क्या आपका मतलब है कि यह कुछ प्रोग्रामिंग / एल्गोरिथम चुनौतियों जैसे टॉपकोडर आदि में कोई समस्या है? यदि हां, और यदि आप सुनिश्चित हैं कि आपने समाधान को सही ढंग से लागू किया है , तो आप समस्या को फिर से देखना चाहेंगे। कुछ अन्य छिपी हुई संपत्ति हो सकती है जो चीजों को सरल बना सकती है, या समस्या को व्यक्त करने का एक बेहतर तरीका हो सकता है ताकि एक सकर्मक बंद होने की आवश्यकता न हो। क्योंकि ट्रांज़िटिव क्लोजर मैट्रिक्स गुणन जितना कठिन है। छात्र पढ़ें ।cs.uwaterloo.caO(V3)
परेश

जवाबों:


8

यह तथ्य कि हमारा ग्राफ एसाइक्लिक है, इस समस्या को बहुत सरल बनाता है।

टोपोलॉजिकल सॉर्ट हमें वर्टिकल का ऑर्डर दे सकता है, जैसे कि अगर i < j , तो v j बैक से v i तक कोई बढ़त नहीं है । हमने अपनी सूची में "आगे" जाने वाले सभी किनारों को ऐसे सूचीबद्ध किया है।v1,v2,,vni<jvjvi

(विश्लेषण को ठीक करने और थोड़ा तेज एल्गोरिदम देने के लिए संपादित)

अब हम सिर्फ इस सूची के माध्यम से पीछे की ओर जाना है, अंतिम शीर्ष बिंदु पर शुरू v n का सकर्मक समापन केवल स्वयं है। इसके अलावा एक छोर के साथ v n के लिए प्रत्येक शीर्ष के सकर्मक बंद करने के लिए v n जोड़ेंvnvnvnvn

एक दूसरे के शीर्ष के लिए , अंत पीछे की ओर से जा रहा है, पहले ऐड वी मैं अपनी ही सकर्मक बंद करने के लिए है, तो सब कुछ की सकर्मक बंद में जोड़ने के वी मैं सब कोने की सकर्मक बंद करने के लिए एक बढ़त के साथ करने के लिए वी मैंvivivivi

चलने का समय है सबसे खराब स्थिति में, साथ n कोने और की संख्या मीटर हे ( एन 2 ) किनारों की संख्या। टोपोलॉजिकल सॉर्ट में समय लगता है O ( n + m ) । फिर हम बैकवर्ड पास में एक और O ( m n ) कार्य करते हैं: जैसा कि हम सूची के माध्यम से पीछे जाते हैं, प्रत्येक किनारे के लिए, हमें n तक जोड़ना होगाO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n किसी के सकर्मक बंद होने की स्थिति।

ध्यान दें कि आप बिट-एरे द्वारा सभी के सकर्मक बंद का प्रतिनिधित्व करके एक अच्छा निरंतर-कारक गति प्राप्त कर सकते हैं। कहते हैं कि आप केवल ; तो आप एक एकल 64-बिट int का उपयोग करेंगे जहां बिट मैं 1 है अगर मैं अपने सकर्मक बंद में हूं और 0 अन्यथा। तब हिस्सा हम में सब कुछ जोड़ने जहां मैं 'के लिए रों सकर्मक बंद j ' s वास्तव में तेजी से होता है: हम सिर्फ लेने सी जे | = मैं । (बाइनरी या ऑपरेशन।)n=64iiijcjci

के लिए , आप उन्हें सरणियों में रखने के लिए और कुछ गणित कर दिया था, लेकिन यह बहुत तेजी से एक वस्तु सेट की तुलना में किया जाएगा।n>64

इसके अलावा, मैं जानता हूँ कि big- बहुत खराब स्थिति में अब भी है हे ( एन 3 ) , लेकिन व्यवहार में यह हरा करने के लिए आप और अधिक जटिल कुछ है करना होगा। यह एल्गोरिथ्म भी विरल रेखांकन पर बहुत अच्छा करता है।OO(n3)


1
आप संभवतः सेट के लिए लिंक की गई सूची प्रतिनिधित्व का उपयोग कर सकते हैं और वे सामान्य पूंछ साझा करना समाप्त करेंगे।
काइल बट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.