效率还不错的全组合算法

2009年2月4日星期三

效率还不错的全组合算法

CSDN上问全组合的问题挺多的,自己之前也在那里问过类似的问题,一直没有找到让自己特别满意的高效算法。

这两天又思考了一阵,总算找到了一种不错的方法,代码如下:

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

static void Main(string[] args)
{
GetZhuHe(m_Data);
Console.ReadLine();
GetPaiLie(m_Data);
Console.ReadLine();
}

static void GetZhuHe(string[] data)
{
Dictionary dic = new Dictionary();
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
dic.Add(data[i], i);
}
GetString(dic,data);
}

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


全排列的算法,代码如下:
static void GetPaiLie(string[] data)
{
Dictionary, int> dic = new Dictionary, int>();
for (int i = 0; i < data.Length; i++)
{
Console.WriteLine(data[i]);
List list = new List();
list.Add(i);
dic.Add(list, i);
}
GetPaiLieString(dic, data);
}

static void GetPaiLieString(Dictionary, int> dd, string[] data)
{
Dictionary, int> dic = new Dictionary, int>();
foreach (KeyValuePair, int> kv in dd)
{
for (int i = kv.Value + 1; i < data.Length; i++)
{
List list = kv.Key;
for (int j = 0; j <= list.Count; j++)
{
List temp = new List(list.ToArray());
temp.Insert(j, i);
OutPut(temp, data);
dic.Add(temp, i);
}
}
}
if (dic.Count > 0) GetPaiLieString(dic, data);
}

static void OutPut(List list, string[] data)
{
string temp = string.Empty;
foreach (int n in list)
{
temp += data[n];
}
Console.WriteLine(temp);
}


0 评论:

发表评论