日期:2014-05-20  浏览次数:20954 次

[分享+散分]:高效率的全组合算法
最近发现论坛上问全组合的问题挺多的,自己之前也在这里问过类似的问题,一直没有找到特别高效的算法。
这两天看到了下面这个帖子,
http://topic.csdn.net/u/20090216/18/9104bda7-6ea3-4899-973c-cb7aae6612d8.html
特意又考虑了一下。终于写出了自己认为效率比较高的算法,拿出来给大家评评看,欢迎大家批评指正:

C# code
        static string[] m_Data = { "A", "B", "C", "D", "E" }; 

        static void Main(string[] args)
        {
            Dictionary<string, int> dic = new Dictionary<string, int>();
            for (int i = 0; i < m_Data.Length; i++)
            {
                Console.WriteLine(m_Data[i]);//如果不需要打印单元素的组合,将此句注释掉
                dic.Add(m_Data[i], i);
            }
            GetString(dic);
            Console.ReadLine();
        }

        static void GetString(Dictionary<string,int> dd)
        {
            Dictionary<string, int> dic = new Dictionary<string, int>();
            foreach (KeyValuePair<string, int> kv in dd)
            {
                for (int i = kv.Value + 1; i < m_Data.Length; i++)
                {
                    Console.WriteLine(kv.Key + m_Data[i]);
                    dic.Add(kv.Key + m_Data[i], i);
                }
            }
            if(dic.Count>0) GetString(dic);
        }


运行结果:
A
B
C
D
E
AB
AC
AD
AE
BC
BD
BE
CD
CE
DE
ABC
ABD
ABE
ACD
ACE
ADE
BCD
BCE
BDE
CDE
ABCD
ABCE
ABDE
ACDE
BCDE
ABCDE

------解决方案--------------------
up
------解决方案--------------------
蛮好的
像这种String为Key的可以使用System.Collections.Specialized.StringDictionary
------解决方案--------------------
向楼主学习啊。。高手!!!!!!!!!!!!
------解决方案--------------------
学习~
------解决方案--------------------
我也来一个,不过输出顺序比较乱:
C# code

        static void Main(string[] args)
        {
            string[] arr = new[] { "A", "B", "C", "D", "E" };
            GetCombination(arr);
        }

        static void GetCombination(string[] nums)
        {
            double count = Math.Pow(2, nums.Length);
            for (int i = 1; i <= count - 1; i++)
            {
                string str = Convert.ToString(i, 2).PadLeft(nums.Length, '0');
                for (int j = 0; j < str.Length; j++)
                {
                    if (str[j] == '1')
                    {
                        Console.Write(nums[j]);
                    }
                }
                Console.WriteLine();
            }
        }
/*
输出:
E
D
DE
C
CE
CD
CDE
B
BE
BD
BDE
BC
BCE
BCD
BCDE
A
AE
AD
ADE
AC
ACE
ACD
ACDE
AB
ABE
ABD
ABDE
ABC
ABCE
ABCD
ABCDE
*/

------解决方案--------------------
学习!!!
------解决方案--------------------
楼主写的不错,就是没有诚心与网友们分享。
试问没有注释的代码怎么分享?
------解决方案--------------------

------解决方案--------------------
学习!
------解决方案--------------------
厉害
------解决方案--------------------
刚好对我有用,谢了
------解决方案--------------------
up