关于众数的求解

来源:互联网 发布:mac 查看音轨 编辑:程序博客网 时间:2024/06/02 10:17

 转自:http://blog.chinaunix.net/uid-627012-id-2706170.html
 众数算法   

a) 问题

在一个由元素组成的表中,出现次数最多的元素称为众数。试写一个寻找众数的算法,并分析其计算复杂性。

 众数算法   

a) 问题

在一个由元素组成的表中,出现次数最多的元素称为众数。试写一个寻找众数的算法,并分析其计算复杂性。

b) 分析

对于这个问题,比较容易的是使用排序的算法,对元素表进行排序,然后统计元素出现的个数,得出众数。则这个问题的平均时间复杂度取决于排序算法。
对于n个分布在m1~m2的整数元素,我们可以用一个数组来索引这些元素出现的个数。这样的话,对n个原始数据遍历,然后再遍历计数数组,复杂度为O( n + m ) = O ( n )。
显然,如果 |太大的话,对空间的要求会非常大。所以综合两种算法。
当 的时候,我们采用索引数组的办法。
其他情况采用排序的算法。

c) 编程实现

 众数算法:/** 在一个元素组成的表中,出现次数最多的元素称为众数
* 试写一个寻找众数的算法,并分析其计算复杂性。
*/

public class MostNumber
{
  final static int maxNumber = 100;
  
  /** 程序入口
   */
   public static void main(String args[])
   {
     int a[] = new int[100];
     int m1=0, m2=0;
          
     //初始化数组
     for(int i=0; i<100; i++)
     {
       a[i] = Math.round((long)(Math.random()*100));
       
       System.out.print(" "+a[i]);
       
       if(i%5==4)
       {
         System.out.print(" ");
       }
     }
     
     System.out.println("");
     
     //取最小值
     for(int i=0; i<100; i++)
     {
       if(a[i]<m1)
       {
         m1=a[i];
       }
     }
     

     //取最大值
     for(int i=0; i<100; i++)
     {
       if(a[i]>m2)
       {
         m2=a[i];
       }
     }
     //编码核心部分;
     if( (m2-m1) <maxnumber &&="" ((m2-m1)="" 100)<1000)
     {
       int m[] = new int[maxNumber];
       //索引数组
       for(int i=0; i<100; i++)
       {
         m[a[i]-m1]++;         
       }

       
       //求众数
       int maxCount=0, index = 0;
       for(int i=0; i<maxnumber; i++)
       {
         if(m[i]>maxCount)
         {
           maxCount=m[i];
           index = i;
         }
       }
       
       System.out.println("方法1:结果");
       for(int i=0;i<100;i++)
       {
         System.out.println("Num:"+(i+m1)+" "+m[i]);
       }
       
       System.out.println("方法1:众数为 "+(index+m1));
     }

0 0