2010-01-14 10 views
5

इस आधार से इनहेरिट कक्षाओं की एक सूची को देखते हुए:परिभाषित निर्भरताओं के अनुसार वस्तुओं को सॉर्ट करने के लिए एक क्लीन एल्गोरिदम?

class Plugin(object): 
    run_after_plugins =() 
    run_before_plugins =() 

... और निम्नलिखित नियम:

  • प्लगइन्स प्लगइन्स है कि वे के बाद चलाना चाहिए की एक सूची प्रदान कर सकते हैं।
  • प्लगइन्स प्लगइन्स की एक सूची प्रदान कर सकते हैं जिन्हें उन्हें पहले चलाना चाहिए।
  • प्लगइन की सूची बाधाओं को क्रम में निर्दिष्ट सभी प्लगइन हो सकती है या नहीं हो सकती है।

क्या कोई भी प्लगइन की सूची ऑर्डर करने के लिए एक अच्छा साफ एल्गोरिदम प्रदान कर सकता है? यह रूप में अच्छी तरह परिपत्र निर्भरता पता लगाने के लिए की आवश्यकता होगी ....

def order_plugins(plugins): 
     pass 

मैं कुछ संस्करणों लेकिन ले कर आए हैं कुछ भी नहीं particuarlly साफ: मुझे यकीन है कि आप Art of Computer Programming प्रकार के कुछ चुनौती :)

पसंद करेंगे हूँ

[ध्यान दें: प्रश्न पायथन में दी गई है, लेकिन यह स्पष्ट रूप से न केवल एक अजगर सवाल है: किसी भी भाषा में स्यूडोकोड करना होगा]

उत्तर

8

यह topological sorting कहा जाता है।

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

+0

@Eli: मुझे यह प्रश्न मिला (http://stackoverflow.com/questions/952302/how-to-sort-based-on- निर्भरता) जिसने अभी इस तरह के प्रकार का उल्लेख किया लेकिन दिया गया उदाहरण नहीं था क्रमबद्ध करने के लिए दो अलग-अलग प्रकार की निर्भरताएं हैं: क्या इस मामले के साथ भी वह समझौता कर सकता है? – jkp

+2

@jkp: इसे उस प्रस्तुति में परिवर्तित किया जा सकता है। यानी ए कहता है कि बी को इससे पहले भागना चाहिए, लेकिन उसके बाद सी। तो, केवल "बाद" बाधाओं के साथ, हम कहते हैं कि ए बी के बाद है, और सी ए –

+0

@Eli के बाद है: हाहा! हां, मुझे लगता है कि जब आप इसे अपने सिर पर बदलते हैं तो यह साफ-सफाई पर लागू होता है। एक प्लगइन पर पहले बाधा एक दूसरे के लिए बाधा के बाद है :) – jkp

1

यह topological sorting कहा जाता है।

ऐसा करने से कई चरण होते हैं:

पहले कोने और किनारों के रूप में उनकी निर्भरता के रूप में सभी चुना प्लगइन्स का ग्राफ का निर्माण। डीप के पहले/बाद में उसी प्रकार के किनारों तक उबाल लें।

अगला ट्रांजिटिव हल करें: सभी प्लगइन्स देखें और सभी लापता निर्भरताओं को जोड़ें। इसे तब तक दोहराएं जब तक कि सेट और नहीं बदलेगा।

अंतिम चरण: आने वाले किनारों के बिना एक ऊर्ध्वाधर चुनें और DFS (या BFS) खोज करें। यह एल्गोरिदम चक्र पहचान के साथ समृद्ध किया जा सकता है।

0

यदि आप __lt__ को परिभाषित करते हैं और प्लगइन पर संबंधित विधियों के आधार पर पहले या बाद में चलाना चाहिए या नहीं, तो sorted() के साथ एक सॉन ऑर्डरिंग करना संभव हो सकता है। हालांकि चक्र अभी भी एक समस्या होगी।

0

यदि आप चक्र के मामले में अच्छे डायग्नोस्टिक्स देना चाहते हैं, तो http://en.wikipedia.org/wiki/Strongly_connected_component पर एक नज़र डालें। मुझे लगता है कि यदि आप http://www.cs.sunysb.edu/~skiena/373/notes/lecture16/lecture16.html में उल्लिखित एक मजबूत कनेक्टेड घटक के संस्करण का उपयोग करते हैं तो आप इसे स्थलीय क्रम क्रम में दृढ़ता से जुड़े घटकों को मुद्रित करने के लिए प्राप्त कर सकते हैं।

2

Here पाइथन कोड है जो स्थलीय सॉर्टिंग करता है।

+0

@ ΤΖΩΤΖΙΟΥ: हाँ, मैंने उसे भी पाया। मैं जो चाहता था उसके लिए यह थोड़ा लंबा था: मेरे संस्करण ने एली की टिप्पणियों में लिखे गए पोस्ट में दिए गए उदाहरण से बारीकी से मिलान किया। मैंने वैसे भी एक नई चाल सीखी जो मुख्य बात है :) – jkp

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

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