如何在C中找到2xn维数组中元素的频率

时间:2017-05-06 07:59:48

标签: c algorithm

我有一个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次

1 个答案:

答案 0 :(得分:1)

将每行上的两个值合并为一个标识符,并计算每个标识符的出现次数(即直方图)。例如,如果c1c2是两列中的值,1 <= c1c1 <= 601 <= c2c2 <= 60,那么您可以使用

k = (c1 - 1) * 60 + (c2 - 1)

获取0 <= kk < 3600。这意味着每行只有3600个不同的唯一组合值。因此,创建一个该大小的数组,并为每一行增加k条目。

要输出计数,只需遍历所有可能的k,注意

c1 = (k / 60) + 1
c2 = (k % 60) + 1

一般情况下,如果您有iminimax之间的整数,则可以使用

将它们打包成更大的整数
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