关于众数的求解

    xiaoxiao2021-03-25  138

     转自: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));      }
    转载请注明原文地址: https://ju.6miu.com/read-9983.html

    最新回复(0)