怎么办,计算速度很慢啊...

sd2v234 2012-07-07 10:57:39
List<List<string>> list1 = new List<List<string>>();

list1里面有20个元素,每一个元素类型是List<string>,至于每一个List<string>又有多少个元素,也就最多20个吧


然后,有一组数字,8、9、10、11、12、13、14,这些数字是什么意思呢?其听我慢慢叙来,比如8,即是在list1 中任意取8个元素进行交集,很显然,这种提取方法是很多的,然后数字9、10.....14都这样处理

任意取N个,有多少种提取法,我是按照下面这个链接的第6楼的方法处理的
http://topic.csdn.net/u/20090220/23/e2d130d9-d7d4-4520-bec7-e78ae6ca9aff.html


这些都是前言,总之,目前的情况是,程序计算速度很慢啊,要等10秒钟左右,才能得出结果,这显然不符合行规。


请教一下,朋友们,有什么好的办法没,多线程、异步编程,好像也是不能提高运算速度的,有没有其他的办法?....
...全文
276 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2012-07-08
  • 打赏
  • 举报
回复
代码重贴,上面那个有个地方写错了:

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();
qldsrx 2012-07-08
  • 打赏
  • 举报
回复

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();

用他的方法改了下,我电脑才1.6G的主频,内存也低,测试下来使用的时间是2.5秒左右。
qldsrx 2012-07-08
  • 打赏
  • 举报
回复
那你就应该用那个帖子的楼主的方法处理,那个才是最快的,是你自己判断错误,没有比位运算的效率更高的了。
你这里不超过20,而int类型是32位的,因此位运算足够处理你的情况。
sd2v234 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你要的是输出一种结果,还是所有组合都需要?
[/Quote]
所以组合交集后的结果,交集情况很多种
qldsrx 2012-07-08
  • 打赏
  • 举报
回复
你要的是输出一种结果,还是所有组合都需要?
sd2v234 2012-07-08
  • 打赏
  • 举报
回复
有个朋友说:定义一类,一个接口。用反射通过类名调用

这是什么意思啊,能提高运算速度吗?
qldsrx 2012-07-08
  • 打赏
  • 举报
回复
如果超过,得到的结果将是错误的,执行还是可以执行。
举例说明吧,如果int[] opt = new int[] { 8, 9, 10, 11, 12, 13, 14 };里面有一个数超过了32,那么后面的移位代码将得到溢出的值。而list1超过32个,则32个以后的元素将选择不到。
如果是64个以内的数,可以使用Int64来替代执行,如果更多数,即使要支持(自己分段进行),其速度将会很慢,所以这类情况最好排除。
sd2v234 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

代码重贴,上面那个有个地方写错了:
C# code

List<List<string>> list1 = new List<List<string>>() { new List<string>(), new List<string>(), new List<string>(), new List<string>(), new List<string>(), new ……
[/Quote]
你这代码,是不是只针对List<string>元素不能超过32个?如果超过了呢?会发生什么情况,是不能计算,还是速度慢,还是怎么的?
「已注销」 2012-07-08
  • 打赏
  • 举报
回复
你最好说你要干什么,或者看到你的代码,现在看来慢的可能性就是太多无用的遍历
sd2v234 2012-07-07
  • 打赏
  • 举报
回复
我的电脑是双核
3.0G

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧