2010-01-26 15 views
5

मेरे पास एन आइटम की एक सूची है और मैं सोच रहा हूं कि मैं प्रत्येक संयोजन प्राप्त करने के लिए सूची के माध्यम से कैसे लूप कर सकता हूं। कोई युगल नहीं है, इसलिए मुझे सभी एन प्राप्त करने की ज़रूरत है! orderings। अतिरिक्त स्मृति कोई समस्या नहीं है, मैं सबसे सरल एल्गोरिदम के बारे में सोचने की कोशिश कर रहा हूं लेकिन मुझे परेशानी हो रही है।सी ++ एल्गोरिदम! आदेश

+0

क्या यह संयोजन या क्रमपरिवर्तन है? – sud03r

+0

http://stackoverflow.com/questions/352203/generating-permutations-lazily/ – ShreevatsaR

उत्तर

15

देखें std::next_permutation    

+1

अच्छी कॉल (इसलिए बोलने के लिए) पर दो अलग-अलग एल्गोरिदम का स्पष्टीकरण भी देखें। हालांकि निष्पक्ष होने के बावजूद, ओपी ने सबसे सरल * एल्गोरिदम * के लिए कहा था। उदाहरण प्रदान करने के लिए –

8

दूसरों के उत्तरों पर विस्तार, यहाँ एसटीडी का एक उदाहरण है :: next_permutation का उपयोग कर Recursion cplusplus.com

#include <iostream> 
#include <algorithm> 
using namespace std; 

void outputArray(int* array, int size) 
{ 
    for (int i = 0; i < size; ++i) { cout << array[i] << " "; } 
} 

int main() 
{ 
    int myints[] = { 1, 2, 3, 4, 5 }; 
    const int size = sizeof(myints); 

    cout << "The 5! possible permutations with 5 elements:\n"; 

    sort (myints, myints + size); 

    bool hasMorePermutations = true; 
    do 
    { 
    outputArray(myints, size); 
    hasMorePermutations = next_permutation(myints, myints + size); 
    } 
    while (hasMorePermutations); 

    return 0; 
} 
+0

+1। –

+0

'bool' चर में कोई भी बिंदु प्रतीत नहीं होता है। आप बस {do {...} कर सकते हैं (std :: next_permutation (...)); ' –

+1

@ चार्ल्स: यह सच है, मैं ऐसा कर सकता हूं। शिक्षण उद्देश्यों के लिए मैंने अगली_प्रमुखता को खींच लिया क्योंकि यह कोड का केंद्र था। – Bill

0

सरल कलन विधि से अनुकूलित:

स्यूडोकोड

getPermutations(CurItemList , CurPermList) 

if CurItemList.isempty() 
    return CurPermList 
else 
    Permutations = {} 

    for i = 1 to CurItemList.size() 
     CurPermList.addLast(CurItemList.get(i)) 

     NextItemList = CurItemList.copy() 
     NextItemList.remove(i) 

     Permutations.add(getPermutations(NextItemList, CurPermList)) 

     CurPermList.removeLast() 


return Permutations 

// To make it look better 
Permutations(ItemList) 
    return getPermutations(ItemList, {}) 

मैं इसका परीक्षण नहीं किया, लेकिन काम करना चाहिए। शायद यह करने का सबसे अच्छा तरीका नहीं है, लेकिन यह एक आसान तरीका है। अगर कुछ गलत है तो कृपया मुझे बताएं!

0

संभव तत्वों की निश्चित गणना के साथ संयोजनों के सेट को फिर से बनाने का प्रयास करें। सभी संभावित संयोजनों का सेट 1 तत्वों, 2 तत्वों, ... एन तत्वों के संयोजन के सेटों का संघ होगा।

फिर आप प्रत्येक निश्चित आकार के संयोजन पर व्यक्तिगत रूप से हमला कर सकते हैं।

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