यह तथ्य कि हमारा ग्राफ एसाइक्लिक है, इस समस्या को बहुत सरल बनाता है।
टोपोलॉजिकल सॉर्ट हमें वर्टिकल का ऑर्डर दे सकता है, जैसे कि अगर 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)nm∈O(n2)O(n+m)O(mn)n किसी के सकर्मक बंद होने की स्थिति।
ध्यान दें कि आप बिट-एरे द्वारा सभी के सकर्मक बंद का प्रतिनिधित्व करके एक अच्छा निरंतर-कारक गति प्राप्त कर सकते हैं। कहते हैं कि आप केवल ; तो आप एक एकल 64-बिट int का उपयोग करेंगे जहां बिट मैं 1 है अगर मैं अपने सकर्मक बंद में हूं और 0 अन्यथा। तब हिस्सा हम में सब कुछ जोड़ने जहां मैं 'के लिए रों सकर्मक बंद j ' s वास्तव में तेजी से होता है: हम सिर्फ लेने सी जे | = ग मैं । (बाइनरी या ऑपरेशन।)n=64iiijcjci
के लिए , आप उन्हें सरणियों में रखने के लिए और कुछ गणित कर दिया था, लेकिन यह बहुत तेजी से एक वस्तु सेट की तुलना में किया जाएगा।n>64
इसके अलावा, मैं जानता हूँ कि big- बहुत खराब स्थिति में अब भी है हे ( एन 3 ) , लेकिन व्यवहार में यह हरा करने के लिए आप और अधिक जटिल कुछ है करना होगा। यह एल्गोरिथ्म भी विरल रेखांकन पर बहुत अच्छा करता है।OO(n3)