在未排序的数组中查找最大出现的整数(Mode)

时间:2010-03-16 15:36:11

标签: arrays

如何在未排序的整数数组中找到出现最大次数(模式)的整数?

我能想到的一种O(nlogn)方法就是排序。还有其他更好的方法吗?

5 个答案:

答案 0 :(得分:4)

以下是您将要做的事情的基本概要:

  1. 首先对数组进行排序 - 合并排序的O(n logn)
  2. 声明Count = 1,Max_Count = 1,Max_Value = arr [0]
  3. 从索引1开始迭代数组
  4. 将每个元素与Previous元素进行比较。如果它们相等则更新计数Max_Count,否则重置计数回到1
  5. 返回Max_Count,Max_value
  6. Time Complexity  : O(n logn)+ O(n)
    Space Complexity : InPlace , no hash table or hash map is required.
    

    以下是代码:

    public void Max_Occurrence(int[] arr)
    {
        int count=1;
        int max_count =1;
        int max_value = arr[0];
        for(int i=1; i<arr.length ; i++)
        {
            if(arr[i-1] == arr[i])
            {
                count++;
                if(max_count<count)
                {
                    max_count = count;
                    max_value = arr[i];
                }
            }
            else
            {
                count = 1;//changing from count++. As per the steps mentioned above it should be reset to count = 1. Suggested by an anonymous user
            }
        }
    
        System.out.println("Result:"+max_value+" has occured "+max_count+"of times");
    }
    

答案 1 :(得分:3)

我想你想找出阵列中出现次数最多的元素 - 如果您不关心内存,则遍历数组一次,增加哈希表中每个元素的计数。然后找到计数最高的那个。你需要一个遍历数组和一个哈希表。

所以在伪代码中:

hashtable hash;
foreach(element in array){
  if(!hash.contains(element))
    hash[element] = 1;
  else 
    hash[element]++;
}

int max = 0;
max_element;
foreach(element in hash)
   if(hash[element] > max)
   {
     max_element = element;
     max = hash[element];
   }

//max_element contains the maximum occuring one.

答案 2 :(得分:0)

如果你使用的是Linq,你可以这样做

IEnumerable.Max();

答案 3 :(得分:0)

您可以使用哈希表,其中“数组中的数字”作为键,“出现次数”作为值。

示例代码如下:

 hashtable h;
 for every entry in array
      search hashtable
           if present, increment num_occurrences
           else, create new entry

 Iterate over all the entries in hashtable and return one 
 with max num_occurrences

由于哈希搜索被认为是O(1),因此整体复杂度将为O(n)。

此问题的一个特例是当数组中的数字在给定范围内时,在这种情况下,在原始数组中使用另一个最大值大小的整数数组,并使用新数组的索引作为键和存储在此数组中的数字作为出现次数。

返回此数组中最大值的索引。

答案 4 :(得分:0)

试试这个。

class max_frequency
{
private int a[]=new int[20];
public void accept(int a1[])
{
    a=a1;
}
public void sort()
{
    int i,j,t;
    for(i=0;i<20;i++)
    {
        for(j=i+1;j<20;j++)
        {
            if(a[i]>a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
    int count=1;
    int max_count=1;
    int max_value=0;
    for(i=1;i<a.length;i++)
    {
        if(a[i-1]==a[i])
        {
            count++;
            if(max_count<count)
            {
                max_count=count;
                max_value=a[i];
            }
        }
        else
        {
            count=1;
        }
    }
        System.out.println("Result : "+max_value+ " has occured "+max_count+ " times");
}

}