我有时间序列数据。里面的数据要么是 1 要么是 0(可以是真或假,或任何其他二进制表示)。例如,我有两个时间序列数据变量:byte[] a1 = new byte[]{1,0,0,1,0};byte[] a2 = new byte[]{1,1,1,0,1};我现在比较这两个数组来计算组合发生的次数:Map<String,Integer> count = new HashMap<String,Integer>();//all the time series arrays have the same length. In real life each would timeseries array would have a length of about 100for(int i=0; i<ai.length(); i++){ //a1[i] and a[2] occured. If this keys exists incremnt the count by one, otherwise insert the new key count.merge(a1[i]+":"+a2[i], 1, Integer::sum)}基本上我正在寻找的输出是a1 = 1多少次a2 = 1和多少次a2 = 0?同样,什么时候a1 = 0有多少次a2 = 1,有多少次a2 = 0?我面临的问题是我在我的程序中运行了数十亿次这些比较。完成的时间比我想要的要长得多。我知道这需要很长时间才能完成,但想知道是否有任何其他方法可以实现它以更快地计算它(我已经在使用多线程,我正在更多地研究可能的算法、数据结构的变化更改,开源库等)?
1 回答

梵蒂冈之花
TA贡献1900条经验 获得超5个赞
鉴于您试图产生大量结果,我建议您寻找微优化和划分工作的方法。没有什么奇特的方法可以减少操作,只要让它们变得高效。
因此,我建议您将字节数组转换为BitSet
s. 你的 4 个计数应该通过cardinality()
在a.and(b)
(1,1)、a.andNot(b)
(1,0)、a.or(b).flip()
(0,0) 和a.flip().and(b)
(0,1)。在同步工作方面,您应该分发工作,因为(用该图进行实验)块的所有成对组合例如 20 个阵列和 20 个阵列。足够大的工作块是真正的工作。足够小的一个来描述源并产生相当小的消息。每件工作都应该由一个工人单线程处理。仔细考虑如何存储最终数据——你的很多工作都将构建该数据结构。不惜一切代价避免的事情是基于散列的数据结构,它会导致您在内存中到处寻找随机位置。更好地对数据进行排序。
如果可以,请关注缓存一致性。
添加回答
举报
0/150
提交
取消