【问题标题】:Computing the most frequent element计算最频繁的元素
【发布时间】:2015-03-12 00:41:59
【问题描述】:

我最近遇到了这行代码,它的作用是遍历一个数组并返回最常看到的值。例如 1,1,2,1,3 所以它会返回 1 因为它看起来比 2 和 3 以上一步,但它没有响起任何铃声。

谁能帮我理解这里发生了什么?如果有人能告诉我 c 做了什么以及 if 语句中的参数背后的逻辑是什么,那将是一个整体。

    int[] arr = a;
    int c = 1, maxcount = 1, maxvalue = 0;
    int result = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        maxvalue = arr[i];
        for (int j = 0; j <arr.Length; j++)
        {
            if (maxvalue == arr[j] && j != i)
            {
                c++;
                if (c > maxcount)
                {
                    maxcount = c;
                    result = arr[i];
                }
            }
            else
            {
                c=1;
            }
        }
    }
    return result;

【问题讨论】:

    标签: c# algorithm


    【解决方案1】:

    编辑:仔细检查后,代码 sn-p 有一个嵌套循环,并且通常通过简单地跟踪最大看到时间和看到的元素并使它们保持同步来计算最大看到的元素。

    这看起来像是 Boyer-Moore 多数票计数算法的实现。他们有一个很好的插图here。

    逻辑很简单,一次性计算出多数,花费 O(n) 时间。请注意,这里的多数意味着 超过 50% 的数组必须被该元素填充。如果没有多数元素,则会得到“不正确”的结果。

    验证元素是否真正形成多数通常在单独的通道中完成。

    【讨论】:

      【解决方案2】:

      它不是计算最频繁的元素 - 它计算的是最长的元素。

      另外,它的效率不是很高,内部循环只需要计算到 i-1,而不是到 arr.Length。

      c 正在跟踪当前的运行长度。第一个“如果”是检查这是否是“连续运行”。第二个“if”(在到达 run 中的最后一个元素之后)将检查此 run 是否比您迄今为止看到的任何 run 更长。

      在上面的输入示例中,您得到 1 作为答案,因为它是最长的运行。尝试使用运行时间最长的元素与最频繁的元素不同的输入。 (例如,2,1,1,1,3,2,3,2,3,2,3,2 - 这里 2 是最频繁的元素,但 1,1,1 是最长的运行)。

      【讨论】:

        猜你喜欢
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 2011-10-06
        • 1970-01-01
        相关资源
        最近更新 更多