c#中的大型列表中的按位运算尽可能快

时间:2012-05-26 15:49:38

标签: c# performance

我有10,000个长值的列表 我希望将这些数据与100,000个其他长值进行比较 比较是按位操作 - >

if (a&b==a) count++;

我可以用哪种算法来获得最佳表现?

2 个答案:

答案 0 :(得分:5)

如果我正确理解了您的问题,您希望针对每个a检查b是否某些谓词为真。所以对你的问题的一个天真的解决方案如下:

var result = aList.Sum(a => bList.Count(b => (a & b) == a));

我不确定这是否可以加速任意谓词,因为你无法对每个a检查每个b。您可以尝试的是并行运行查询:

var result = aList.AsParallel().Sum(a => bList.Count(b => (a & b) == a));

示例:

aList:10,000个随机long值; bList:100,000个随机long值。

  • 没有AsParallel:00:00:13.3945187

  • AsParallel:00:00:03.8190386

答案 1 :(得分:2)

将所有a放入trie数据结构中,其中树的第一级对应于数字的第一位,第二级对应于第二位,依此类推。然后,对于每个b,沿着特里走;如果b中的该位为1,则对两个分支进行计数,或者如果b中的该位为0,则仅计算trie的0分支。我认为这应该是O(n + m),但我没有想到它。

您可以通过对a列表进行排序并使用排序列表与trie完全相同的方式获得相同的语义,但具有更好的缓存特性。就操作次数而言,这会稍微差一些 - 因为你必须在很多时候搜索东西 - 但尊重CPU缓存可能会弥补它。

N.B。我没有想到正确性比我想到的大O符号更难,也就是说可能还不够。