2009-11-07 14 views
8

सबसे जटिलता वाले लगभग 20 तत्वों के क्रम को यादृच्छिक कैसे करें? (यादृच्छिक क्रमपरिवर्तन उत्पन्न करना)तत्वों के यादृच्छिक क्रम उत्पन्न करने के लिए एल्गोरिदम

+0

सीसीए का क्या मतलब है? –

+0

कैननिकल सहसंबंध विश्लेषण? –

+0

सीए द्वारा आपका क्या मतलब है? : पी –

उत्तर

21

Knuth's shuffle algorithm एक अच्छा विकल्प है।

+1

निराशाजनक है कि किसी ने कुछ और कहा है, स्पष्ट रूप से। –

+0

वैसे मैं निराश हूं कि यह जवाब है। चूंकि आपको इसे भरने के लिए सूची के माध्यम से पहले पुनरावृत्ति करना है और फिर इसे घुमाएं (एक स्वीकार्य रूप से अच्छा एल्गोरिदम के साथ), मैंने सोचा होगा कि एक बेहतर समाधान था। – SourceOverflow

2

कुछ महीने पहले मैंने पूर्णांक की सूची के यादृच्छिक क्रमपरिवर्तन प्राप्त करने के बारे में ब्लॉग किया था। आप इसे अपने तत्वों वाले सेट के इंडेक्स के क्रमपरिवर्तन के रूप में उपयोग कर सकते हैं, और फिर आपके पास जो भी चाहिए वो है।

पहले पोस्ट में मैं कुछ संभावनाओं का पता लगाने, और अंत में मैं प्राप्त "एक समारोह बेतरतीब ढंग से साथ हे (एन) जटिलता एक सामान्य सूची permutate करने के लिए" , अपरिवर्तनीय डेटा पर काम करने के लिए ठीक से encapsulated (यानी, यह दुष्प्रभाव मुक्त है)।

दूसरी पोस्ट में, मैं इसे समान रूप से वितरित करता हूं।

कोड एफ # में है, मुझे उम्मीद है कि आपको कोई फर्क नहीं पड़ता!

शुभकामनाएं।

संपादित करें: मैं एक औपचारिक प्रमाण की जरूरत नहीं है, लेकिन अंतर्ज्ञान मुझसे कहता है कि इस तरह के एक एल्गोरिथ्म की जटिलता नहीं किया जा सकता की तुलना में कम हे (एन)। मैं वास्तव में यह तेजी से करने की सराहना करता हूं!

+0

दूसरे आलेख में रिकर्सन सरल है .. मुझे लगता है कि मैं कर सकता था इसका उपयोग करें .. – Ante

+1

सभी क्रमिकताएं संभव होनी चाहिए, और एक सरणी को एक अपमान में पुन: व्यवस्थित करना (यानी, एक क्रमपरिवर्तन 'पी' जिसके लिए 'p (k)! = k' सभी 'k' के लिए) आवश्यक है कि प्रत्येक तत्व दौरा किया जाना इसलिए ओ (एन) सबसे खराब मामला। या यह अभी भी पर्याप्त औपचारिक नहीं है? –

+0

इसके अलावा, एक ही सबूत द्वारा ओ (एन) औसत मामला, इसके बारे में सोचने के लिए आओ, क्योंकि आईआईआरसी (1 ... एन) के क्रमपरिवर्तन के अनुपात है जो व्यंग्य 1/ई दृष्टिकोण के रूप में निकटता तक पहुंचता है। –

1

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

मुझे लगता है कि इस स्यूडोकोड सही है:

list newList 
foreach (element in firstList) 
    int position = Random.Int(0, firstList.Length - 1) 
    while (newList[position] != null) 
     position = (position + 1) % firstList.Length 
    newList[position] = element 

संपादित करें: तो यह पता चला है कि इस सवाल का जवाब वास्तव में यह अच्छी बात नहीं है। यह न तो विशेष रूप से तेज़ है, न ही विशेष रूप से यादृच्छिक। आपकी टिप्पणीयों के लिए धन्यवाद। एक अच्छे उत्तर के लिए, कृपया पृष्ठ के शीर्ष पर वापस स्क्रॉल करें :-)

+0

सबसे खराब स्थिति में यह एल्गोरिदम ओ (एन^2) है (यानी, यदि आपका यादृच्छिक संख्या जनरेटर "1, 1, 1, 1, 1, 1, 1, ..." कहता है, "मैंने आपको बाकी की गणना करने दी है) , बहुत अनुकूलित नहीं है। –

+2

अगले खाली स्थिति में आइटम डालना इसे कम यादृच्छिक बनाता है। आइटम वास्तव में यादृच्छिक शफल के मुकाबले अपने मूल आदेश को अधिक रखेंगे। इसे ठीक करने के लिए आपको स्थिति लेने पर एक नई यादृच्छिक स्थिति चुननी होगी, जो निश्चित रूप से इसे बहुत धीमी बनाती है। – Guffa

+0

यह एक अच्छा बिंदु गुफा है। मुझे कभी एहसास नहीं हुआ। धन्यवाद। कम से कम मैंने यहां कुछ सीखा है :-) –

1

शायद किसी ने आपके लिए पहले से ही शफलिंग लागू की है। उदाहरण के लिए, पायथन में आप random.shuffle का उपयोग कर सकते हैं, सी ++ random_shuffle में, और PHP shuffle में।

+0

हम्म .. php शायद? – Ante

+0

आश्चर्य की बात है, PHP में इसे 'shuffle' कहा जाता है :) मैं अपना जवाब अपडेट करूंगा। –

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