我有時間序列數據。里面的數據要么是 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
提交
取消