繁体   English   中英

计算最频繁的元素

[英]Computing the most frequent element

我最近遇到了这行代码,它的作用是通过一个数组并返回最常看到的值。 例如1,1,2,1,3,因此它会返回1,因为它看起来大于2和3。我试图做的是了解它是如何工作的,所以我做的就是逐步通过Visual Studio进行了学习。一步,但没有敲响任何钟声。

谁能帮我了解这里的事吗? 如果有人可以告诉我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;

编辑:仔细检查后,代码片段具有嵌套循环,并且通常通过简单地跟踪最大可见时间和所看到的元素并使它们保持同步来对最大可见元素进行计数。

看起来像是Boyer-Moore多数票计数算法的实现。 他们在这里有一个很好的例证。

逻辑很简单, 只需花费O(n)时间即可一次计算出多数。 请注意,此处多数表示必须用该元素填充数组的50%以上 如果没有多数元素,则会得到“不正确”的结果。

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

它不是计算最频繁的元素-它正在计算的元素是运行时间最长的元素。

而且,它的执行效率不是很高,内部循环只需要计算最多i-1,而不需要计算arr.Length。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM