2013-02-26 117 views
6

मुझे एक सरणी को घुमाने की आवश्यकता है ताकि सभी सरणी तत्वों को अपना स्थान बदलना चाहिए। एक सरणी [0,1,2,3] को देखते हुए [1,0,3,2] या [3,2,0,1] प्राप्त करना ठीक नहीं होगा लेकिन [3,1,2,0] नहीं (क्योंकि 2 अपरिवर्तित छोड़ा गया है)। मुझे लगता है कि एल्गोरिदम भाषा-विशिष्ट नहीं होगा, लेकिन बस मामले में, मुझे इसे C++ प्रोग्राम में चाहिए (और अतिरिक्त आवश्यकता के कारण मैं std::random_shuffle का उपयोग नहीं कर सकता)।एक सरणी को कैसे घुमाएं ताकि सभी तत्व अपनी जगह बदल सकें

+0

क्या आपके पास कोई मेमोरी आवश्यकता है? आप पहले के रूप में एक ही आकार का एक नया सरणी बना सकते हैं, और फिर प्रत्येक तत्व को सरणी 1 में सरणी 2 में एक नई, यादृच्छिक स्थिति में ले जाएं। यदि मान पहले ही सेट हो चुका है, तो पुनः प्रयास करें। बहुत क्रूर बल। – Liron

+0

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

+2

सरल दृष्टिकोण, हालांकि पूरी तरह यादृच्छिक नहीं है - सभी सरणी तत्वों को एक्स पदों से बदलें। किसी भी भाषा में करना आसान होना चाहिए, बस एक नई सरणी बनाएं, ऑफसेट पर पहले गुच्छा को कॉपी करें, फिर बाकी को शुरुआत में कॉपी करें। –

उत्तर

7
For each element e 
    If there is an element to the left of e 
     Select a random element r to the left of e 
      swap r and e 

यह गारंटी देता है कि प्रत्येक मान है कि यह शुरू कर दिया स्थिति में नहीं है, लेकिन वहाँ है कि प्रत्येक मूल्य परिवर्तन करता है, तो डुप्लिकेट गारंटी नहीं है।

+0

आप ठीक से कर रहे हैं मैं सही हूँ? –

+0

किसी भी तरह से ठीक काम करता है –

+0

मेरा मानना ​​है कि यह फिशर-येट्स शफल का एक रूप है, जिसे [सट्टोलो एल्गोरिदम] (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) के नाम से जाना जाता है। – jrok

3

यह बहुत यादृच्छिक होने के लिए नहीं जा रहा है, लेकिन आप सभी तत्वों को कम से कम एक स्थिति बारी बारी से कर सकते हैं: उदाहरण के लिए,

std::rotate(v.begin(), v.begin() + (rand() % v.size() - 1) + 1, v.end()); 

v तो शुरुआत में {1,2,3,4,5,6,7,8,9} था, तो रोटेशन के बाद यह हो जाएगा: {2,3,4,5,6,7,8,9,1} , या {3,4,5,6,7,8,9,1,2}, आदि

सरणी के सभी तत्व स्थिति बदल देंगे।

+1

क्या इस समाधान के साथ कोई समस्या है? – piokuc

+1

यह सरणी को शफल नहीं करता है। यह एक अनुमानित परिणाम देता है। – 0x499602D2

+0

+1। सरल और सही समाधान।मुझे समाधान में यादृच्छिकता शामिल करने का कोई कारण नहीं दिखता है, इसमें कहा गया समस्या से कोई लेना देना नहीं है। – SomeWittyUsername

4

इसके बारे में क्या?

  1. एक सरणी जो 0 से arrayLength -1
  2. सरणी
  3. शफ़ल यदि सरणी जिसका सूचकांक अपने मूल्य के बराबर होती है, चरण 4 पर जारी रखने में कोई तत्व है संख्या शामिल आवंटित; अन्यथा चरण 2 से दोहराएं।
  4. अपने सरणी के लिए इंडेक्स के रूप में शफ़ल किए गए सरणी मानों का उपयोग करें।
+0

यह अच्छा लगता है क्योंकि आप shdling को 'std :: random_shuffle' पर आउटसोर्स कर सकते हैं और शफल सबसे कठिन भाग की तरह दिखता है। – CallMeNorm

1

मुझे अपने दिमाग में एक विचार है कि यह आपके आवेदन के अनुकूल है। एक और कंटेनर रखें और यह कंटेनर "नक्शा (int, वेक्टर (int)) होगा"। मुख्य तत्व इंडेक्स दिखाएगा और दूसरा तत्व वेक्टर पहले से ही इस्तेमाल किए गए मान रखेगा।

उदाहरण के लिए पहले तत्व के लिए आप रैंड फ़ंक्शन का उपयोग करेंगे, यह जानने के लिए कि आपको किस सरणी का उपयोग करना चाहिए। यदि आप इस अनुक्रमणिका के लिए सरणी का यह तत्व उपयोग किया गया है तो आप मानचित्र संरचना की जांच करेंगे।

+0

"नक्शा (int, वेक्टर (int)) के बारे में क्षमा करें" मैं इसका उपयोग कैसे नहीं कर सकता "<" इसके बजाय "(" –

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

  • कोई संबंधित समस्या नहीं^_^