def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
इसे ऑनलाइन आज़माएं!
शून्य-अनुक्रमण का उपयोग करता है।
एक सरल विचार के साथ एक तेज एल्गोरिथ्म। के करीब के रूप में यह सुनिश्चित करने के लिए हम बजाय इनपुट सूची दूसरे स्थान पर रखना करने की आवश्यकता है (1,2,...,n) संभव के रूप में, हम, के रूप में नीचे साबित बस इसे तरह करना चाहिए। जब से हम बजाय permuting रहे हैं (1,2,...,n) , हम क्रमचय चुनें कि मेरा चैलेंज में की तरह, इनपुट सूची के रूप में उसी तरह का आदेश दिया एक आदेश की नकल (इनपुट को छोड़कर दोहराता हो सकता है)। (संपादित करें: मील ने इसे और अधिक समान चुनौती दी , जहां डेनिस का भी यही जवाब है ।)
दावा: सूची का एक क्रमचय l कि करने के लिए इसकी दूरी को कम करता है (1,2,...,n) है l अनुसार क्रमबद्ध।
सबूत: कुछ अन्य परिवर्तन पर विचार करें l′ के l । हम यह साबित करेंगे कि l छँटाई से बेहतर नहीं हो सकता ।
दो सूचकांक उठाओ i,j कि l′ आउट-ऑफ-आदेश है, यह है कि जहां i<j लेकिन l′i>l′j । हम बताते हैं कि उन्हें गमागमन के लिए दूरी में वृद्धि नहीं कर सकते हैं (1,2,...,n) । हम ध्यान दें कि स्वैप इन दोनों तत्वों के योगदान को निम्नानुसार बदलता है:
|l′i−i|+|l′j−j|→|l′i−j|+|l′j−i|.
यहाँ यह दिखाने का एक साफ तरीका है कि यह वृद्धि नहीं हो सकती है। दो लोगों के एक नंबर लाइन पर चलने, एक से जा रहा पर विचार करें l′i करने के लिए i और से अन्य l′j के लिए j । उनके द्वारा चलने वाली कुल दूरी बाईं तरफ की अभिव्यक्ति है। के बाद से i<j लेकिन l′i>l′j , वे स्विच जो नंबर लाइन है, जो साधन वे अपने सैर के दौरान कुछ बिंदु पर पार करना होगा इसे कहते पर अधिक है p । लेकिन जब वे p, फिर वे अपने गंतव्यों की अदला-बदली कर सकते थे और समान दूरी पर चल सकते थे। और फिर, यह उनके लिए एक स्वैप के रूप में अपने स्वैप किए गए गंतव्यों तक चलने के बजाय बदतर नहीं हो सकता है , जो कि p के लिए एक वेपाइंट के रूप में उपयोग करने के बजाय , जो दाईं ओर की कुल दूरी देता है।
तो, में दो बाहर के आदेश तत्वों छँटाई l′ इसकी दूरी के लिए बनाता है (1,2,...,n) छोटे या एक ही। इस प्रक्रिया को दोहराते हुए अंततः l को सॉर्ट किया जाएगा । तो, l अनुसार क्रमबद्ध है कम से कम के रूप में अच्छा के रूप में l′ के किसी भी चुनाव के लिए l′ है, जो इष्टतम के रूप में या इष्टतम के लिए बंधे साधन यह।
ध्यान दें कि का केवल संपत्ति (1,2,...,n) है कि हम इस्तेमाल किया है कि यह, हल कर रहा है तो एक ही एल्गोरिथ्म किसी भी तय हो गई सूची में इसकी दूरी कम करने के लिए किसी भी सूची दूसरे स्थान पर रखना करने के लिए काम करेंगे है।
कोड में, इसका एकमात्र उद्देश्य z=zip(l,range(len(l)))
इनपुट तत्वों को विशिष्ट बनाना है, जो कि असमान तत्वों के बीच समान तुलना रखते हुए संबंधों से बचना है। यदि हम जिस इनपुट की गारंटी देते हैं, वह कोई दोहराता नहीं है, तो हम इसे हटा सकते हैं और बस lambda l:map(sorted(l).index,l)
।
v
, से अधिक होंगे0
? या, कम से कम, नहीं0
?