C# 计算最频繁元素
我最近遇到了这行代码,它的作用是遍历数组并返回最常看到的值。例如,1,1,2,1,3,它将返回1,因为它显示的值大于2和3。我想做的是理解它是如何工作的,所以我所做的是用VisualStudio一步一步地完成它,但它并没有敲响任何警钟 有人能帮我理解这里发生了什么吗?如果有人能告诉我c做什么,以及if语句中的参数背后的逻辑是什么,那将是一个加号C# 计算最频繁元素,c#,algorithm,C#,Algorithm,我最近遇到了这行代码,它的作用是遍历数组并返回最常看到的值。例如,1,1,2,1,3,它将返回1,因为它显示的值大于2和3。我想做的是理解它是如何工作的,所以我所做的是用VisualStudio一步一步地完成它,但它并没有敲响任何警钟 有人能帮我理解这里发生了什么吗?如果有人能告诉我c做什么,以及if语句中的参数背后的逻辑是什么,那将是一个加号 int[] arr = a; int c = 1, maxcount = 1, maxvalue = 0; int result
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;
int[]arr=a;
int c=1,maxcount=1,maxvalue=0;
int结果=0;
对于(int i=0;i
编辑:仔细检查,代码段有一个嵌套循环,通常通过跟踪最大可见时间和所见元素并保持同步来计算最大可见元素
这看起来像是Boyer-Moore多数票计数算法的实现。他们有一个很好的例子
逻辑很简单,只需一次计算多数,需要O(n)个时间。请注意,这里的多数表示数组的50%以上必须用该元素填充。如果没有多数元素,则会得到“不正确”的结果
验证元素是否实际形成多数通常在单独的过程中完成
它不是计算最频繁的元素-它所计算的是元素的最长运行时间 而且,它的计算效率不高,内环只需要计算i-1,而不需要计算arr.Length c正在跟踪当前的运行长度。第一个“如果”是检查这是否是“连续运行”。第二个“if”(到达运行中的最后一个元素后)将检查此运行是否比您迄今为止看到的任何运行都长 在上面的输入示例中,您得到的答案是1,因为这是最长的运行时间。尝试使用一个输入,其中运行时间最长的元素与运行频率最高的元素不同。(例如,2,1,1,1,3,2,3,3,2,3,2-这里2是最频繁的元素,但1,1,1是最长的)