我有一个2xn(2列和n行)维数组,其中值的范围是1到60(只有整数)。为清晰起见,我需要找到下面提到的行频率。
0→ 9,11
1→ 9,10
2→ 2,10
3→ 9,11
4-> 9,11
(9,11) - > 3次
(9,10) - > 1次
(2,10) - > 1次
答案 0 :(得分:1)
将每行上的两个值合并为一个标识符,并计算每个标识符的出现次数(即直方图)。例如,如果c1
和c2
是两列中的值,1 <= c1
,c1 <= 60
,1 <= c2
,c2 <= 60
,那么您可以使用
k = (c1 - 1) * 60 + (c2 - 1)
获取0 <= k
,k < 3600
。这意味着每行只有3600个不同的唯一组合值。因此,创建一个该大小的数组,并为每一行增加k
条目。
要输出计数,只需遍历所有可能的k
,注意
c1 = (k / 60) + 1
c2 = (k % 60) + 1
一般情况下,如果您有imin
到imax
之间的整数,则可以使用
base = imax - imin + 1
packed = (i1 - imin) + base * ((i2 - imin) + base * ((i3 - imin) + ... ))
并使用
解压缩i1 = imin + (packed % base)
i2 = imin + ((packed / base) % base)
i3 = imin + ((packed / (base * base)) % base)
等等。 0 <= packed
,因此您可以对packed
使用无符号整数类型。
当然,类型必须足够大以容纳打包值。如果有三个值,则为packed < base * base * base
。