我有一个大的、严格递增的数组(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]
都等于一,但 3 不包括在offsets
.
我需要为数百个范围计算这些分箱计数,其中一些跨越整个数组。我考虑遍历数据数组以存储每个 bin 和元素的累积总和,但内存要求会令人望而却步。这是我的实现的简单版本:
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++]]]++;
}
有没有更有效的方法来计算这些计数?