2010-07-23 9 views
17

मैं एक कारगर तरीका इस लक्ष्य को हासिल करने के लिए तलाश कर रहा हूँ की एक सूची से सभी संभव संयोजनों हो रही है:संख्या

  • आप संख्या 1 की एक सूची है ..... n (आमतौर पर: 1 .. 5 या 1..7 या तो - यथोचित छोटा है, लेकिन मामला दर मामला)

  • भिन्न हो सकते हैं आप उन संख्याओं, जैसे के लिए सभी लंबाई के सभी संयोजनों की जरूरत है केवल एक नंबर ({1}, {2}, .... {n}) के सभी संयोजन, फिर दो अलग-अलग संख्याओं ({1,2}, {1,3}, {1,4} के सभी संयोजन। .... {n-1, n}), तो उन संख्याओं के तीन ({1,2,3} के लिए सभी संयोजनों, {1,2,4}) और इसके आगे

मूल रूप से, समूह के भीतर, आदेश अप्रासंगिक है, इसलिए {1,2,3} {1,3,2} के बराबर है - यह केवल उस सूची से x संख्याओं के सभी समूहों को प्राप्त करने का मामला है

ऐसा लगता है कि वहां होना चाहिए इसके लिए एक सरल एल्गोरिदम होना - लेकिन मैंने अब तक व्यर्थ में खोज की है। अधिकांश संयोजक और क्रमपरिवर्तन एल्गोरिदम एक ऐसा लगता है) खाते में ऑर्डर लें (उदाहरण के लिए 123 132 के बराबर नहीं है), और वे हमेशा वर्णों या संख्याओं की एक स्ट्रिंग पर काम करते हैं ....

कोई भी महान है, अच्छा आस्तीन एल्गोरिदम अपनी आस्तीन ऊपर ??

धन्यवाद!

+2

आप मूल रूप से [पावर सेट] के लिए देख रहे हैं (http://en.wikipedia.org/wiki/Power_set) की गूगल मुझे इस समाधान है, जो काम नहीं लगता दिया आपकी सूची (जो गणितीय रूप से वास्तव में एक सेट है, यदि उसके सभी आइटम अद्वितीय हैं)। –

+0

यहां भी देखें: https://stackoverflow.com/questions/7802822/all-possible-combinations-of-a-list-of-values/41642733#41642733 – RenniePet

उत्तर

38

बस एक बाइनरी संख्या को बढ़ा देते और बिट्स सेट कर रहे हैं कि करने के लिए इसी तत्वों ले लो।

उदाहरण के लिए, 00101101 अनुक्रमणिका 0, 2, 3 में तत्व लेने का मतलब होगा, और 5 के बाद से अपनी सूची बस 1..n है, तत्व बस सूचकांक + 1

यह उत्पन्न होगा है क्रम में क्रमपरिवर्तन। दूसरे शब्दों में, केवल {1, 2, 3} उत्पन्न होगा। {1, 3, 2} या {2, 1, 3} या {2, 3, 1}, आदि

+0

@ हेनरी का समाधान इस विचार का बहुत अधिक कार्यान्वयन है LINQ। –

+0

@ नेट कोहल हाँ मैंने अभी उस पर टिप्पणी की। बहुत चालाक! इसे एक +1 दिया। – jdmichal

+0

+1: एक अच्छा सबूत आकार एन के एक सेट के सबसेट की संख्या 2^N –

9

ऐसा कुछ है जो मैंने अतीत में ऐसा कार्य पूरा करने के लिए लिखा है।

List<T[]> CreateSubsets<T>(T[] originalArray) 
{ 
    List<T[]> subsets = new List<T[]>(); 

    for (int i = 0; i < originalArray.Length; i++) 
    { 
     int subsetCount = subsets.Count; 
     subsets.Add(new T[] { originalArray[i] }); 

     for (int j = 0; j < subsetCount; j++) 
     { 
      T[] newSubset = new T[subsets[j].Length + 1]; 
      subsets[j].CopyTo(newSubset, 0); 
      newSubset[newSubset.Length - 1] = originalArray[i]; 
      subsets.Add(newSubset); 
     } 
    } 

    return subsets; 
} 

यह सामान्य है, इसलिए इसमें ints, देशांतर, तार, Foos के लिए काम करेंगे, आदि

+3

हम इसका उपयोग कैसे करते हैं? – MonsterMMORPG

31
नहीं

मेरी कोड है, लेकिन आप Powerset के लिए देख रहे हैं।

public IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> list) 
{ 
    return from m in Enumerable.Range(0, 1 << list.Count) 
       select 
        from i in Enumerable.Range(0, list.Count) 
        where (m & (1 << i)) != 0 
        select list[i]; 
} 

स्रोत:: http://rosettacode.org/wiki/Power_set#C.23

+3

सिर्फ स्पष्टीकरण के लिए, यह मेरा जवाब है, जो LINQ के माध्यम से लागू किया गया है। जो, मुझे स्वीकार करना है, काफी चालाक है। – jdmichal

+0

हाँ यह है :) मुझे पसंद आया कि आप समाधान हैं, इसलिए कोड! – Henri

+2

लिंक की शक्ति, इसके लिए एक पल सम्मान। – Rev