只需一次通过即可查找数组中最频繁的数字

时间:2018-09-29 14:35:41

标签: c# arrays

因此,我试图设计一种算法,通过一次遍历搜索一个数组,以查找其中出现频率最高的数字。我尝试使用两个内部循环来解决它,并且它可以工作,但是这需要多次遍历数组。

现在,我试图通过“一次性”扫描阵列以查找最频繁的数字来找到另一种方式。任何人有什么建议会有所帮助?

3 个答案:

答案 0 :(得分:2)

使用LINQ,您可以简单地使用

var mostfrequent = myList.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
      .Select(grp=>grp.Key).First();

DOTNET FIDDLE

编辑

基于OP使用Hashtable的要求,可以如下实现

            int mostCommom = array[0];
            int occurences = 0;
            foreach (int num in array)
            {
                if (!hs.ContainsKey(num))
                {
                    hs.Add(num, 1);
                }
                else
                {
                    int tempOccurences = (int)hs[num];
                    tempOccurences++;
                    hs.Remove(num);
                    hs.Add(num, tempOccurences);

                    if (occurences < tempOccurences)
                    {
                        occurences = tempOccurences;
                        mostCommom = num;
                    }
                }
            }
            foreach (DictionaryEntry entry in hs)
            {
                Console.WriteLine("{0}, {1}", entry.Key, entry.Value);
            }
            Console.WriteLine("The commmon numer is " + mostCommom + " And it appears " + occurences + " times");

most frequent element in an Array

答案 1 :(得分:0)

您可以使用Dictionnary并将键设置为数字,然后在遇到已经满足的数字时,在当前数字的值(即键)上加1,并在数组完成后用最高价值。

答案 2 :(得分:0)

类似的事情应该起作用(您需要获取ValueTuple NuGet包才能使该元组调用签名起作用)

 public static IEnumerable<int> ListOfInts = new List<int> { 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5 };

 public static (int? mostFrequent, int numOccurances) FindMostFrequent(IEnumerable<int> ints) {
     int maxNumOccurances = int.MinValue;
     int? mostFrequent = null;
     //key is number (that occurs), value is number of occurances
     var counters = new Dictionary<int, int>();
     foreach (var num in ints) {
         if (counters.TryGetValue(num, out var occurances)) {
             counters[num] = ++occurances;
         } else {
             counters[num] = 1;
         }
         if (occurances > maxNumOccurances) {
             mostFrequent = num;
             maxNumOccurances = occurances;
         }
     }
     return (mostFrequent, maxNumOccurances);
 }

它一次通过整数集合。在遍历列表时,它会构建Dictionary<int, int>,进行N次查找和N次写入(插入或替换)。

如果列表为空,则返回的mostFrequent部分将为null。如果最大次数超过一次,您将获得第一个发现的最大次数。如果需要最后一个,请在以下位置将>更改为>=

if (occurances > maxNumOccurances)

,如果希望获得所有可能的结果,请在返回之前执行以下操作:

var maxes = from pair in counters where pair.Value == maxNumOccurances select pair;