为了账号安全,请及时绑定邮箱和手机立即绑定

时间序列数据 - 计算两组的出现次数

时间序列数据 - 计算两组的出现次数

qq_遁去的一_1 2022-05-21 20:49:02
我有时间序列数据。里面的数据要么是 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个赞

鉴于您试图产生大量结果,我建议您寻找微优化和划分工作的方法。没有什么奇特的方法可以减少操作,只要让它们变得高效。

因此,我建议您将字节数组转换为BitSets. 你的 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 个阵列。足够大的工作块是真正的工作。足够小的一个来描述源并产生相当小的消息。每件工作都应该由一个工人单线程处理。仔细考虑如何存储最终数据——你的很多工作都将构建该数据结构。不惜一切代价避免的事情是基于散列的数据结构,它会导致您在内存中到处寻找随机位置。更好地对数据进行排序。

如果可以,请关注缓存一致性。


查看完整回答
反对 回复 2022-05-21
  • 1 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号