计算最常见的元素

时间:2015-03-11 00:52:31

标签: c# algorithm

我最近遇到过这行代码,它的作用是通过一个数组并返回最常见的值。例如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;

2 个答案:

答案 0 :(得分:1)

编辑:经过仔细检查,代码片段有一个嵌套循环,通常只需跟踪最大可见时间和看到的元素并保持同步,就可以计算出看到的最大元素。

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

逻辑很简单,就是在一次通过中计算多数,花费O(n)时间。请注意,此处的多数意味着必须使用该元素填充超过50%的数组。如果没有多数元素,则会得到“不正确”的结果。

通常会在单独的通道中验证元素是否实际形成多数。

答案 1 :(得分:1)

它不是计算最常见的元素 - 计算的是最长的元素。

此外,它没有非常有效地执行,内部循环只需要计算到i-1,而不是arto.Length。

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

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