模数在数组中找到最重复的数字

时间:2016-05-28 18:04:07

标签: arrays data-structures max repeat

有人可以向我解释一下这是怎么做的吗?这是我想要了解的代码片段:

// Iterate though input array, for every element
    // arr[i], increment arr[arr[i]%k] by k where k is less than of equal to number of elements
    // ie. k <= n
    for (int i = 0; i< n; i++)
        arr[(arr[i]%k)] += k;

    // Find index of the maximum repeating element
    int max = arr[0], result = 0;
    for (int i = 1; i < n; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
            result = i;
        }
    }

我意识到当我们第一次遍历数组时

  1. 取我们迭代模k的每个元素的值。
  2. 将此作为索引使用;
  3. 在索引处获取一个元素 用k增加它。
  4. 在我们完成之后,最高数字元素的索引是我们正在寻找的最频繁的数字。

    我理解这些步骤,但我不理解逻辑,特别是围绕模数和索引与值。任何解释将不胜感激!

1 个答案:

答案 0 :(得分:1)

该解决方案仅在保证0 <= arr[i] < karr[i]的范围位于k值的区间内时才有效。

该算法使用相同的数组(arr)作为频率散列映射来存储特定值的出现次数,尽管使用模运算。任何以除数递增的数字每次都会给出相同的余数。每次发现出现时,arr[i] % k处的元素增加k。这类似于通过1递增频率散列映射。在迭代结束时,所有元素将增加(number of times value occurs) * k。找到最大元素,将为您提供最多的元素。

这个算法中有一些假设你还没有提到:

  1. 0 < arr[i] <= k
  2. k <= n
  3. 如果大多数重复元素之间存在联系,则会拾取具有最大值的元素。
  4. 如果(count of occurences) * k + arr[i]大于INT_MAX,则结果可能会溢出。