別のより大きなデータ配列用に、オフセットの大きくて厳密に増加する配列(1000万の整数)があります。の要素data
は50を超えていません。たとえば、
unsigned char data[70*1000*1000] = {0,2,1,1,0,2,1,4,2, ...};
unsigned int offsets[10*1000*1000] = {0,1,2,4,6,7,8, ...};
次に、オフセットが配列に含まれている要素のみを含む、実行時までわからない一連の範囲内の各要素の数を見つけたいと思いますoffsets
。各範囲の端点は、オフセットではなく、データ配列のインデックスを参照します。たとえば、範囲[1,4]のデータは次のようになります。
1 zero
1 one
1 two
data[3]
とdata[2]
は1に等しいが、3はに含まれないため、結果には「1」が1つだけ含まれoffsets
ます。
数百の範囲についてこれらのビニングされたカウントを計算する必要があり、そのうちのいくつかは配列全体にまたがっています。各ビンと要素の累積合計を格納するためにデータ配列を反復処理することを検討しましたが、メモリ要件は法外なものでした。これが私の実装の簡単なバージョンです:
for(int i=0; i<range_count; i++){
unsigned int j=0;
while(j<range_starts[i]) pi++;
while(j < 10000000 and data[j]<=range_ends[i]) bins[i][data[offsets[j++]]]++;
}
これらのカウントを計算するためのより効率的な方法はありますか?