110,534
社区成员
发帖
与我相关
我的任务
分享
List<List<string>> list1 = new List<List<string>>() { new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>()};
int[] opt = new int[] { 8, 9, 10, 11, 12, 13, 14 };
int n = list1.Count;
Dictionary<int, List<List<List<string>>>> result = new Dictionary<int, List<List<List<string>>>>();//这里存放的结果,Key为opt的每个元素,Value对应了所有组合
List<List<List<string>>> tmp;//第一个List里面存放了各种List<List<string>>的可能组合,第二个List里面存放了每种组合下的List<string>元素,之后的交集自己求。
Stopwatch watch = new Stopwatch();
watch.Start();//开始计时
foreach (int p in opt)
{
if (p > n)
throw new Exception("所求交集数大于实际元素个数");
result[p] = new List<List<List<string>>>();
}
int m = opt.Max();
int min = (0x01 << opt.Min()) - 1;
int max = ((0x01 << m) - 1) << (n - m);
int j;
int k;
for (int i = min; i <= max; i++)
{
j = 0;
k = i;
while (k > 0)
{
j += (int)(k & 0x01);
k >>= 1;
if (j > m)
{
break;
}
}
if (result.TryGetValue(j, out tmp))
{
List<List<string>> t = new List<List<string>>();
k = 0x01;
for (int l = n - 1; l >= 0; l--)
{
if ((k & i) == k)
{
t.Add(list1[l]);
}
k <<= 1;
}
tmp.Add(t);
}
}
watch.Stop();
Console.WriteLine("花费了:"+watch.ElapsedMilliseconds+"毫秒");
Console.Read();
List<List<string>> list1 = new List<List<string>>() { new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>() };
int[] opt = new int[] { 8, 9, 10, 11, 12, 13, 14 };
int n = list1.Count;
Dictionary<int, List<List<List<string>>>> result = new Dictionary<int, List<List<List<string>>>>();//这里存放的结果,Key为opt的每个元素,Value对应了所有组合
List<List<List<string>>> tmp;//第一个List里面存放了各种List<List<string>>的可能组合,第二个List里面存放了每种组合下的List<string>元素,之后的交集自己求。
Stopwatch watch = new Stopwatch();
watch.Start();//开始计时
foreach (int p in opt)
{
if (p > n)
throw new Exception("所求交集数大于实际元素个数");
result[p] = new List<List<List<string>>>();
}
int m = opt.Max();
int min = (0x01 << opt.Min()) - 1;
int max = ((0x01 << m) - 1) << (n - m);
int j;
int k;
for (int i = min; i <= max; i++)
{
j = 0;
k = i;
while (k > 0)
{
j += (k % 2);
k >>= 1;
if (j > m)
{
break;
}
}
if (result.TryGetValue(j, out tmp))
{
List<List<string>> t = new List<List<string>>();
k = 0x01;
for (int l = n - 1; l >= 0; l--)
{
if ((i % 2) == 1)
{
t.Add(list1[l]);
}
k <<= 1;
}
tmp.Add(t);
}
}
watch.Stop();
Console.WriteLine("花费了:" + watch.ElapsedMilliseconds + "毫秒");
Console.Read();