पायथन में यादृच्छिक कार्यों से फेरबदल कैसे किया जाता है?
मैं पूछता हूं क्योंकि यह बहुत तेजी से काम करता है। जब मैं फेरबदल लिखने की कोशिश करता हूं तो यह 10 ^ 6 तत्व के लिए 1 मिनट काम करता है, लेकिन पायथन फेरबदल 8 सेकंड में करता है?
पायथन में यादृच्छिक कार्यों से फेरबदल कैसे किया जाता है?
मैं पूछता हूं क्योंकि यह बहुत तेजी से काम करता है। जब मैं फेरबदल लिखने की कोशिश करता हूं तो यह 10 ^ 6 तत्व के लिए 1 मिनट काम करता है, लेकिन पायथन फेरबदल 8 सेकंड में करता है?
जवाबों:
पायथन फिशर-येट्स फेरबदल का random.shuffle
उपयोग करता है , जो ओ (एन) समय में चलता है और एक सही फेरबदल (एक अच्छा यादृच्छिक संख्या जनरेटर मानते हुए) साबित होता है।
यह पिछली से पहली प्रविष्टि तक की सरणी को पुनरावृत्त करता है, प्रत्येक प्रविष्टि को उसके नीचे एक यादृच्छिक सूचकांक में प्रविष्टि के साथ स्विच करता है।
फिशर-येट्स फेरबदल की मूल प्रक्रिया बेतरतीब ढंग से गिने हुए टिकटों को टोपी से बाहर निकालने या डेक से एक कार्ड के समान है, एक के बाद एक जब तक कि कोई और शेष न हो। विशिष्ट एल्गोरिथ्म क्या प्रदान करता है यह एक कुशल और कठोर तरीके से संख्यात्मक रूप से करने का एक तरीका है जो ठीक से किया जाता है, एक निष्पक्ष परिणाम की गारंटी देता है ...
आधुनिक ... समाधान है कि "तिरछे" नंबरों को सूची में अंतिम छोर तक ले जाया जाए, ताकि प्रत्येक पुनरावृत्ति पर उन्हें अंतिम अस्थिर संख्या के साथ स्वैप किया जा सके। यह भोली कार्यान्वयन के लिए O (n 2 ) की तुलना में O (n ) के लिए एल्गोरिथ्म की समय जटिलता को कम करता है । यह परिवर्तन निम्न एल्गोरिथ्म (शून्य-आधारित सरणी के लिए) देता है।
To shuffle an array a of n elements (indices 0..n-1): for i from n − 1 downto 1 do j ← random integer with 0 ≤ j ≤ i exchange a[j] and a[i]