【发布时间】:2014-09-13 22:48:56
【问题描述】:
编辑:所以看起来这是正常行为,所以任何人都可以推荐一种更快的方法来完成这些众多的交叉路口吗?
所以我的问题是这样的。我有 8000 个列表(每个列表中的字符串)。对于每个列表(大小从 50 到 400),我将其与其他所有列表进行比较,并根据交叉点数执行计算。所以我会做的
list1(intersect)list1= number
list1(intersect)list2= number
list1(intersect)list888= number
我对每个列表都这样做。以前,我有 HashList,我的代码基本上是这样的:(好吧,我实际上是在搜索对象的属性,所以我 不得不稍微修改一下代码,但基本上是这样的:
下面有我的两个版本,但如果有人知道更快,请告诉我!
遍历AllLists,获取每个列表,从list1开始,然后这样做:
foreach (List list in AllLists)
{
if (list1_length < list_length) //just a check to so I'm looping through the
//smaller list
{
foreach (string word in list1)
{
if (block.generator_list.Contains(word))
{
//simple integer count
}
}
}
// a little more code, but the same, but looping through the other list if it's smaller/bigger
然后我将列表变成常规列表,并应用 Sort(),这将我的代码更改为
foreach (List list in AllLists)
{
if (list1_length < list_length) //just a check to so I'm looping through the
//smaller list
{
for (int i = 0; i < list1_length; i++)
{
var test = list.BinarySearch(list1[i]);
if (test > -1)
{
//simple integer count
}
}
}
第一个版本大约需要 6 秒,另一个需要 20 多秒(我只是停在那里,否则需要一分钟以上!!!)(这是数据的一小部分)
我确定某处存在严重错误,但我找不到。
【问题讨论】:
-
您在该代码中的哪个位置对列表进行排序?还是您在此之前做过。
-
HashList 是 O(1) 摊销,BinarySearch() 是 O(logN)。所以这是完全正常的。
-
嗨,是的,我在此之前做过
-
真的,所以没有其他方法可以让它更快?
-
HashList 是要走的路。鉴于您正在进行大约 8000 x 4000 的列表比较(如果我理解正确的话),所以预计需要一段时间!如果你有一个固定的字符串列表,那么迭代所有这些可能会更快,但是考虑一下,我认为你上面的方法实际上会更快。不幸的是,我想不出其他加快速度的方法。
标签: c# performance list intersection