2010-02-27 15 views
11

मुझे एन संख्याएं दी गई हैं और उनके लिए उनके आदेश के बारे में एम नियम लागू हैं। नियमों को इंडेक्स के एक जोड़े में दर्शाया गया है और प्रत्येक जोड़ी (ए, बी) बता रही है कि इंडेक्स ए (ए-वें नंबर) वाला नंबर बी-वें नंबर के बाद होना चाहिए - उसे उसके आगे नहीं होना चाहिए ।नियमों के एक सेट से मेल खाने वाले सभी क्रमपरिवर्तनों को ढूंढना

Ex: N = 4 
    1 2 3 4 
    M = 2 
    3 2 
    3 1 

Output: 1234, 4213, 4123, 2134, 2143, 2413, 1423 ...Maybe there are even more:) 

एल्गोरिथ्म मुझे सभी क्रमपरिवर्तन उपलब्ध है कि नियमों को तोड़ने नहीं है, उदाहरण की तरह देना चाहिए - 3 हमेशा होना चाहिए 2 के बाद और बाद 1.

मैं bruteforcing की कोशिश की लेकिन यह नहीं था ' टी काम (हालांकि ब्रूटफोर्स को यहां काम करना चाहिए, एन श्रेणी में है (1,8)।)

कोई विचार?

+0

आप समझा सकते हैं कि कैसे एन संख्या इस में आते हैं? जवाब क्या होगा यदि एन के पास {1, 2, 3, 4} है? –

+0

मैं क्या देख सकते हैं से, एन नंबर आप दिया जाता है सवाल आप पूछ से अप्रासंगिक हैं। क्या ये सही है? – sykora

+0

एन कितने संख्या इस मामले एन = 4 में, कर रहे हैं चार नंबर, 1..4 देखते हैं क्योंकि है। – VaioIsBorn

उत्तर

9

बस एक संकेत के रूप में।

आप अपने नियमों के सेट को ग्राफ के रूप में देख सकते हैं। प्रत्येक सूचकांक एक कशेरुका है, प्रत्येक नियम एक निर्देशित किनारा है।

किसी भी संख्या का सही क्रम (अर्थात एक क्रमचय है कि नियमों को संतुष्ट करता है) तो topological ordering ऊपर ग्राफ के कहा जाता है से मेल खाती है। उत्पन्न करने के लिए सभी अपनी संख्याओं के वैध क्रम आपको उस ग्राफ के सभी संभावित स्थलीय आदेश उत्पन्न करने की आवश्यकता है।

पीएस लिंक किए गए विकिपीडिया पेज पर दिए गए स्थलीय आदेश के लिए पहला एल्गोरिदम पहले से ही एक सरल सीधा समाधान की अनुमति देता है जो सभी वैध क्रमिकताओं को गिनती करेगा। यह कुछ प्रयास करेगा और कुछ देखभाल करने की देखभाल करेगा, लेकिन यह रॉकेट विज्ञान नहीं है।

+0

एक पूर्ण टोपोलॉजिकल प्रकार पर जाने से पहले एक कदम के रूप में, आप कम से कम ब्रूट-फोर्सिंग को सरल बनाने के लिए आदेशित टुकड़े बना सकते हैं। उदाहरण के लिए, यदि पूर्वता नियम हैं: 3,4 4,5 5,8 तुम्हें पता है आप पहले जोड़ता है, आवेषण के साथ दूसरे स्थान पर रखना कर सकते हैं [3458] और (इस पाठ्यक्रम सामान्यीकरण करता की अपनी पूर्णांकों पूर्वता नियमों द्वारा स्वेच्छापूर्ण के संलग्न कर देता है उपर्युक्त में) –

4

ब्रूट going through every permutation होगा, जो हे है (एन!), और प्रत्येक क्रमचय के लिए बस पुष्टि करते हैं कि वे aplpy, जो हे (एम) है हर नियम के माध्यम से पाशन मजबूर। यह ओ (एन! एम) समाप्त होता है जो कि हास्यास्पद है, लेकिन इसे ऐसे छोटे सेट के लिए "काम नहीं करना चाहिए"।

+0

वास्तव में वह क्रमपरिवर्तन बनाते समय नियमों की जांच कर सकता था। इससे समय काफी कम हो जाएगा, और परिणामस्वरूप वह खत्म हो जाएगा। – Kugel

+0

मैं सहमत हूं। यदि एन = 8 उच्चतम है जिसे आपको संभालने में सक्षम होना आवश्यक है, तो शायद इस तरह के कुछ के लिए ब्रूट फोर्स से बेहतर कुछ करने के लिए आपके समय के लायक नहीं है। –

+0

हाँ, निश्चित रूप से एक ब्रूट फोर्स समाधान के लिए बहुत आसान अनुकूलन किए जाने हैं, लेकिन उन्होंने उल्लेख किया कि उन्हें भी समस्याएं हैं। – Tanzelax

1

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

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

इस मामले में उन्होंने सरल ब्रूट-बल दृष्टिकोण (जो सभी को सहमत हैं, छोटे N मूल्यों के लिए काम करना चाहिए) और इसे संभवतः कुछ और कठिन प्रयास करने के लिए समय पर छोड़ दिया गया है। कोई अनुभवी डेवलपर आपको बताएगा कि यह एक बुरा विचार है। छात्र को यह कहने की जरूरत है और हकदार है, और यदि वह समझदार है तो वह ध्यान देगा। लेकिन जाहिर है, यह अपनी पसंद ...

+0

@serial_downvoter: आपको रद्द कर दिया गया। हा हा! –

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

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