我有10,000个长值的列表 我希望将这些数据与100,000个其他长值进行比较 比较是按位操作 - >
if (a&b==a) count++;
我可以用哪种算法来获得最佳表现?
答案 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符号更难,也就是说可能还不够。