在O(n)时间内估计阵列元素的频率

时间:2010-11-10 16:17:36

标签: arrays

我认为标题可能有点误导,但我想不出更好的标题。 我有一个数组A [],除了其中一个元素之外的所有元素都出现了15次的倍数,例如2次发生30次,3次发生45次。但是一个元素出现x次,其中x不是15的倍数。如何打印数字x。我正在寻找没有哈希表的线性解决方案。

感谢。

1 个答案:

答案 0 :(得分:7)

这里有类似的问题,在StackOverflow上,但我找不到它。

让我们使用3而不是15,因为它会更容易,我认为它完全相同。序列为4, 5, 4, 5, 3, 3, 4, 5,二进制100, 101, 100, 101, 11, 11, 100, 101

您可以执行以下操作:将所有值与最低有效位数相加并取余数超过3(最初为15):

bit1 = (0 + 1 + 0 + 1 + 1 + 1 + 0 + 1) % 3 = 5 % 3 = 2 != 0

如果它是!= 0那么我们试图找到的那个数字等于1。现在让我们转到下一个:

bit2 = (0 + 0 + 0 + 0 + 1 + 1 + 0 + 0) % 3 = 2 % 3 = 2 != 0

bit3 = (1 + 1 + 1 + 1 + 0 + 0 + 1 + 1) % 3 = 6 % 3 = 0 == 0

所以我们bit3 == 0, bit2 != 0, bit1 != 0011。转换为十进制:3

空间复杂度为O(1),时间复杂度为O(n * BIT_LENGTH_OF_VARS),其中BIT_LENGTH_OF_VARS == 8表示字节,BIT_LENGTH_OF_VARS == 32表示int等。因此它可能很大,但常量不是不会影响渐近行为,而O(n * BIT_LENGTH_OF_VARS)确实是O(n)

就是这样!