算法_众数问题

合集下载

众数的计算

众数的计算

众数的计算众数是指一组数据中出现次数最多的那个数据,一组数据可以有多个众数,也可以没有众数。

众数是由英国统计学家皮尔生首先提出来的。

所谓众数是指社会经济现象中最普遍出现的标志值。

从分布角度看,众数是具有明显集中趋势的数值。

由品质数列和单项式变量数列确定众数比较容易,哪个变量值出现的次数最多,它就是众数,如上面的两个例子。

若所掌握的资料是组距式数列,则只能按一定的方法来推算众数的近似值。

一「\厶倉0小師U△十△异"计算公式为:式中:L ――众数所在组下限;U ――众数所在组上限;.――众数所在组次数与其下限的邻组次数之差;壬――众数所在组次数与其上限的邻组次数之差;d――众数所在组组距例:援零件数分组组中值X频数F105—110107.53322 5110—115112.5復562.5115—120117.5940,0120—125122,5141715.0125—130127.5101275 0130—135132.56795.013>-140137.5 J4550.0合计—5015160 0解:从表中的数据可以看出,最大的频数值是14,即众数组为120~125这一组,根据公式得50名工人日加工零件的众数为:14 - 105 = 123Mc> = 135■(14-8) + (14-10)IJ'' (件)(件)■■!,■ I - IN ' "众数是一种位置平均数,是总体中出现次数最多的变量值,因而在实际工作中有时有它特殊的用途。

诸如,要说明一个企业中工人最普遍的技术等级,说明消费者需要的内衣、鞋袜、帽子等最普遍的号码,说明农贸市场上某种农副产品最普遍的成交价格等,都需要利用众数。

但是必须注意,从分布的角度看,众数是具有明显集中趋势点的数值,一组数据分布的最高峰点所对应的数值即为众数。

当然,如果数据的分布没有明显的集中趋势或最高峰点,众数也可能不存在;如果有两个最高峰点,也可以有两个众数。

求众数的算法研究

求众数的算法研究

求众数的算法研究求众数是⼀个古⽼的问题。

众数:是⼀组数据中出现次数最多的数值。

求众数的主要算法有:1,hash表时间复杂度为O(n),但空间极⼤,通常让⼈难以承受2,排序对元素表进⾏排序,然后统计元素出现的个数,得出众数。

时间复杂度为O(nlgn),空间复杂度为O(n)3,⼆叉搜索树⽤rbtree之类的树来实现。

如果实现的好,复杂度和排序接近。

这三种⽅法各有所长,但是都有⼀些问题。

所以最近我脑洞⼤开,想扩张⼆叉搜索树以实现更简单、更⾼效的众数算法。

这个算法的复杂度约为O(nlgn),但是实际来看,效率⽐普通的⼆叉树实现效率⾼得多。

看⼀下简单的性能测试(随机数据):Core(TM) i3-3240T 2.90GHz4.00GBWindows 7 32位数据量/n MyTreeTimes/ms std::mapTimes/ms pbds::rbtreeTimes/ms std::sortTimes/ms100000157893321000000143811936343100000001435825393974040可见,这种⽅法⽐现有的树算法优势明显,对于排序⽅法也有⼀定优势(当然这也有⼿写快于封装的因素)。

但这还只是随机数据的测试,如果数据是特殊的(众数出现次数很多),效率会更⾼。

好了关⼦卖完了,这种算法的思路很简(ju)单(ruo):对于⼀个bst,每⼀个node记录两个值:key和times(数字和出现的次数)。

bst基于key 构建,⽽每次插⼊时,⼀旦当前节点⼦树的times⼤于当前节点的times,就把⼦树上旋。

经过多次插⼊后,根的key即是⼀个众数,times即是它出现的次数。

对于这种树(下⾯称ModeTree)的定义是:1. 空树是ModeTree2. ⼀个对{key, times, leftchild, rightchild}称为⼀个节点3. 如果对于任意⼀个节点N,N的左孩⼦是空树或者左孩⼦的key⼩于N的key,N的右节点是空树或者右孩⼦的key⼤于N的key,且N的times⼤于或等于它的孩⼦的times,则N是ModeTree如果还是不太懂,我们就把需要的知识复习⼀下。

众数怎么求

众数怎么求

众数怎么求
用观察法求得众数。

若数据已归类,则出现频数最多的数据即为众数;若数据已分组,则频数最多的那一组的组中值即为众数。

计算众数可以用金氏插入法:根据计算公式:MO=L+fb/fa+fb乘以i
或MO=U-fb/fa+fb乘以i式中L表示众数所在组的精确下限,U表示众数
所在组的精确上限,fa为与众数组下限相邻的频数,fb为与众数组上限
相邻的频数,i为组距。

还可以用皮尔逊经验法:根据计算公式:MO=ξ-3(ξ-Md)可求众数。

式中ξ为样本均值,Md为中数,用皮尔逊公司计算所得众数近似于理论
众数,常称为皮尔逊近似众数。

众数是皮尔逊(Pearson,K.)最先提出并
在生物中使用的,以上是数据出自于离散型随机变量时求众数的方法,对
于连续型随机变量ξ,若概率密度函数为f,且f恰有一个最大值,则此
最大值称为ξ的众数,有时也把f的极大值称为众数;f有两个以上极
大值时,亦称复众数。

众数的概念与计算方法

众数的概念与计算方法

众数的概念与计算方法众数是统计学中的一个重要概念,它指的是一组数据中出现次数最多的数值。

在实际应用中,众数可以帮助我们了解数据的集中趋势,从而做出更准确的判断和决策。

本文将介绍众数的定义、计算方法以及实际案例分析,帮助读者更好地理解和运用众数。

一、众数的定义众数是指在一个数据集合中出现次数最多的数值。

它可以是离散变量,也可以是连续变量。

对于离散变量来说,众数是指出现次数最多的数值;而对于连续变量来说,众数是指数据分布中出现概率最高的数值点。

众数的定义相对简单,但是在实际应用中需要注意几点。

首先,一个数据集合可能存在多个众数,这种情况下被称为多峰分布;其次,如果数据集合中没有数值出现次数最多的情况,那么这个数据集合就没有众数。

二、众数的计算方法计算众数的方法根据数据类型的不同而有所区别,下面将分别介绍离散变量和连续变量的计算方法。

1. 离散变量的众数计算对于离散变量来说,计算众数可以通过统计每个数值出现的次数,然后选取出现次数最多的数值即可。

举个例子,假设某个班级的学生身高数据如下:150cm, 155cm, 160cm, 160cm, 165cm, 170cm, 170cm。

我们可以将每个身高的出现次数记录下来:150cm(1次),155cm(1次),160cm(2次),165cm (1次),170cm(2次)。

从中我们可以看出,出现次数最多的身高是160cm和170cm,因此这两个数值都是众数。

2. 连续变量的众数计算对于连续变量来说,计算众数需要通过概率密度函数来确定数据分布中出现概率最高的数值点。

举个例子,假设某个城市每天的最高气温数据如下:23℃, 25℃, 28℃, 29℃, 30℃, 30℃, 32℃, 35℃。

我们可以绘制出每个气温对应的概率密度函数曲线,然后选取曲线上出现概率最高的点作为众数。

三、实际案例分析为了更好地理解和运用众数,下面将介绍一个实际案例。

假设某公司对其员工的年龄进行统计,得到了如下数据:25岁、28岁、30岁、30岁、32岁、35岁、35岁、35岁。

众数问题的不同算法及其比较

众数问题的不同算法及其比较

众数问题的不同算法及其比较中位数、众数、平均数都可以作为一组数据的代表来反映问题的各种情况.平均数、众数、中位数这三个统计量的区别是:平均数的大小与一组数据里的每个数据均有关系,其中任何数据的变动都会相应引起平均数的变动;我们知道计算平均数时用到了每个数据,所以它对数据的变化比较敏感,与中位数和众数相比,平均数有时能够获得更多的信息,它可以说是一组数据的的重心众数----一组数据中出现次数最多的那个数据,叫做这组数据的众数(mode).众数着眼于对各数据出现的次数的考察, 是一组数据中的原数据,其大小只与这组数据中的部分数据有关,当一组数据中有不少数据多次重复出现时,其众数往往是我们关心的一种统计量;注意:一组数据中的众数有时不只一个,如数据2、3、-1、2、l、3中,2和3都出现了2次,它们都是这组数据的众数.中位数----把n个数据按大小顺序排列,处于最中间位置的一个数据(或)叫做这组数据的中位数(median).中位数则仅与数据排列位置有关,当一组数据从小到大排列后,最中间的数据为中位数(偶数个数据的最中间两个的平均数)。

因此某些数据的变动对它的中位数影响不大。

当一组数据中的个别数据变动较大时,可用它来描述其集中趋势注意:(1)求中位数要将一组数据按大小顺序,而不必计算,顾名思义,中位数就是位置处于最中间的一个数(或最中间的两个数的平均数),排序时,从小到大或从大到小都可以.(2)在数据个数为奇数的情况下,中位数是这组数据中的一个数据;但在数据个数为偶数的情况下,其中位数是最中间两个数据的平均数,它不一定与这组数据中的某个数据相等.在同一组数据中,众数、中位数和平均数也各有其特性:(1)中位数与平均数是唯一存在的,而众数是不唯一的;(2)众数、中位数和平均数在一般情况下是各不相等,但在特殊情况下也可能相等。

众数问题--C++实现

众数问题--C++实现
map<int,int>::iterator map_it=number_count.begin();
map_it++; //从第二个元素开始计算
int key=map_it->first;
int maxcount=map_it->second;
while(map_it!=number_count.end())
if(!inputFile)
{
cerr<&ened."<<endl;
exit(1);
}
map<int,int> number_count;
int number;
while(inputFile>>number)
++number_count[number];
{
if(maxcount<map_it->second)
{
maxcount=map_it->second;
key=map_it->first;
}
++map_it;
}
outputFile<<key<<endl<<maxcount;
return 0;
}
问题:若有多个众数,则只能显示最后一个。另输入文本中第一个元素为总的元素个数的问题已解决(自加而非+1)。
2-2众数问题
算法设计:对于给定的由n个自然数组成的多重集S,计算S的众数(出现次数最多的数字)极其重数(出现次数)。
数据输入:数据由input.txt文件提供,文件第一行是S中的元素个数,接下来的n行中,每行一个自然数。
数据输出:输出到output.txt,第一行是众数,第二行是重数。

众数,中位数,平均数题目

众数,中位数,平均数题目

众数,中位数,平均数题目1.一组数据﹣3,2,2,0,2,1的众数是()A.﹣3 B.2 C.0 D.1【分析】众数又是指一组数据中出现次数最多的数据,本题根据众数的定义就可以求解.解:这组数据中2出现次数最多,有3次,所以众数为2,【答案】B.【点评】本题主要考查众数,解题的关键是掌握众数是指一组数据中出现次数最多的数据.2.某班5位学生参加中考体育测试的成绩(单位:分)分别是:50、45、36、48、50.则这组数据的众数是()A.36?? B.45?? C.48?? D.50【分析】根据众数的定义,找出这组数据中出现次数最多的数,即可求出答案.解:在这组数据50、45、36、48、50中,50出现了2次,出现的次数最多,则这组数据的众数是50,【答案】D【点评】此题考查了众数,掌握众数的定义是本题的关键,众数是一组数据中出现次数最多的数.3.某车间20名工人每天加工零件数如表所示:每天加工零件数 4 5 6 7 8人数 3 6 5 4 2这些工人每天加工零件数的众数、中位数分别是()A.5,5 B.5,6 C.6,6 D.6,5【分析】根据众数、中位数的定义分别进行解答即可.解:由表知数据5出现次数最多,所以众数为5;因为共有20个数据,所以中位数为第10、11个数据的平均数,即中位数为=6,【答案】B【点评】本题考查了众数和中位数的定义.用到的知识点:一组数据中出现次数最多的数据叫做这组数据的众数.将一组数据按照从小到大(或从大到小)的顺序排列,如果数据的个数是奇数,则处于中间位置的数就是这组数据的中位数;如果这组数据的个数是偶数,则中间两个数据的平均数就是这组数据的中位数.4.在音乐比赛中,常采用一“打分类制”,经常采用这样的办法来得到一名选手的最后成绩:将所有评委的打分组成一组数据,去掉一个最高分和一个最低分,得到一组新的数据,再计算平均分.假设评委不少于10人,则比较两组数据,一定不会发生变化的是()A.平均数B.中位数C.众数D.方差【分析】去掉一个最高分和最低分后不会对数据的中间的数产生影响,即中位数.解:统计每位选手得分时,会去掉一个最高分和一个最低分,这样做不会对数据的中间的数产生影响,即中位数.【答案】B【点评】本题考查了统计量的选择,属于基础题,相对比较简单,解题的关键在于理解这些统计量的意义.5.在只有15人参加的演讲比赛中,参赛选手的成绩各不相同,若选手要想知道自己是否进入前8名,只需要了解自己的成绩以及全部成绩的()A.平均数B.中位数C.众数D.以上都不对【分析】此题是中位数在生活中的运用,知道自己的成绩以及全部成绩的中位数就可知道自己是否进入前8名.解:15名参赛选手的成绩各不相同,第8名的成绩就是这组数据的中位数,所以选手知道自己的成绩和中位数就可知道自己是否进入前8名.【答案】B【点评】此题考查了中位数的意义.中位数是将一组数据从小到大(或从大到小)重新排列后,最中间的那个数(或最中间两个数的平均数),叫做这组数据的中位数.6.为了解某班学生每周做家务劳动的时间,某综合实践活动小组对该班9名学生进行了调查,有关数据如下表.则这9名学生每周做家务劳动的时间的众数及中位数分别是()每周做家务的时间(小时)0 1 2 3 4人数(人) 2 2 3 1 1 A.3,2.5 B.1,2 C.3,3 D.2,2【答案】D7.某企业为了解员工给灾区“爱心捐款”的情况,随机抽取部分员工的捐款金额整理绘制成如图所示的直方图,根据图中信息,下列结论错误的是()A.样本容量是20 B.该企业员工捐款金额的平均数是180元C.样本中位数是200元D.该企业员工最大捐款金额是500元【答案】C8.如图,这是根据某班40名同学一周的体育锻炼情况绘制的条形统计图,根据统计图提供的信息,可得到该班40名同学一周参加体育锻炼时间的众数、中位数分别是()A.8,9 B.8,8.5 C.16,8.5 D.16,10.5【答案】A【分析】根据中位数、众数的概念分别求得这组数据的中位数、众数.解:众数是一组数据中出现次数最多的数,即8;而将这组数据从小到大的顺序排列后,处于20,21两个数的平均数,由中位数的定义可知,这组数据的中位数是9;9.下列数据:75,80,85,85,85,则这组数据的众数和极差是()A.85,10 B.85,5 C.80,85 D.80,10【分析】根据一组数据中出现次数最多的数据叫做众数,极差是指一组数据中最大数据与最小数据的差进行计算即可.解:众数为85,极差:85﹣75=10,【答案】A【点评】此题主要考查了众数和极差,关键是掌握众数定义,掌握极差的算法.10.为考察两名实习工人的工作情况,质检部将他们工作第一周每天生产合格产品的个数整理成甲,乙两组数据,如下表:甲 2 6 7 7 8乙 2 3 4 8 8类于以上数据,说法正确的是()A. 甲、乙的众数相同B. 甲、乙的中位数相同C. 甲的平均数小于乙的平均数D. 甲的方差小于乙的方差【答案】D【分析】分别根据众数、中位数、平均数、方差的定义进行求解后进行判断即可得.解:甲:数据7出现了2次,次数最多,所以众数为7,排序后最中间的数是7,所以中位数是7,,=4,乙:数据8出现了2次,次数最多,所以众数为8,排序后最中间的数是4,所以中位数是4,,=6.4,【点评】本题考查了众数、中位数、平均数、方差,熟练掌握相关定义及求解方法是解题的关键.11.在“经典诵读”比赛活动中,某校10名学生参赛成绩如图所示,对于这10名学生的参赛成绩,下列说法正确的是()A.众数是90分B.中位数是95分C.平均数是95分D.方差是15【分析】根据众数、中位数、平均数、方差的定义和统计图中提供的数据分别列出算式,求出答案.解:A、众数是90分,人数最多,正确;B、中位数是90分,错误;C、平均数是分,错误;D、方差是=19,错误;【答案】A【点评】此题考查了折线统计图,用到的知识点是众数、中位数、平均数、方差,关键是能从统计图中获得有关数据,求出众数、中位数、平均数、方差.12.为了响应学校“书香校园”建设,阳光班的同学们积极捐书,其中宏志学习小组的同学捐书册数分别是:5,7,x,3,4,6.已知他们平均每人捐5本,则这组数据的众数、中位数和方差分别是()A.5,5,B.5,5,10 C.6,5.5,D.5,5,【分析】根据平均数,可得x的值,根据众数的定义、中位数的定义、方差的定义,可得答案.解:由5,7,x,3,4,6.已知他们平均每人捐5本,得x=5.众数是5,中位数是5,方差=,【答案】D13.某中学在备考2018 河南中考体育的过程中抽取该校九年级20 名男生进行立定跳远测试,以便知道下一阶段的体育训练,成绩如下所示:成绩(单位:米) 2.10 2.20 2.25 2.30 2.35 2.40 2.45 2.50 人数 2 3 2 4 5 2 1 1 则下列叙述正确的是()A.这些运动员成绩的众数是5 B.这些运动员成绩的中位数是2.30 C.这些运动员的平均成绩是2.25 D.这些运动员成绩的方差是0.072 5 【分析】根据方差、平均数、中位数和众数的计算公式和定义分别对每一项进行分析,即可得出答案.解:A、这些运动员成绩的众数是2.35,错误;B、这些运动员成绩的中位数是2.30,正确;C、这些运动员的平均成绩是2.30,错误;D、这些运动员成绩的方差不是0.0725,错误;【答案】B【点评】此题考查方差、平均数、中位数和众数,熟练掌握定义和计算公式是本题的关键,平均数平均数表示一组数据的平均程度.中位数是将一组数据从小到大(或从大到小)重新排列后,最中间的那个数(或最中间两个数的平均数);方差是用来衡量一组数据波动大小的量.14.某射击队要从甲、乙、丙、丁四人中选拔一名选手参赛,在选拔赛中,每人射击10次,然后从他们的成绩平均数(环)及方差两个因素进行分析,甲、乙、丙的成绩分析如表所示,丁的成绩如图所示.甲乙丙平均数7.9 7.9 8.0方差 3.29 0.49 1.8根据以上图表信息,参赛选手应选()A.甲B.乙C.丙D.丁【分析】根据方差的计算公式求出丁的成绩的方差,根据方差的性质解答即可.解:由图可知丁射击10次的成绩为:8、8、9、7、8、8、9、7、8、8,则丁的成绩的平均数为:×(8+8+9+7+8+8+9+7+8+8)=8,丁的成绩的方差为:×[(8﹣8)2+(8﹣8)2+(8﹣9)2+(8﹣7)2+(8﹣8)2+(8﹣8)2+(8﹣9)2+(8﹣7)2+(8﹣8)2+(8﹣8)2]=0.4,∵丁的成绩的方差最小,∴丁的成绩最稳定,∴参赛选手应选丁,【答案】D15.若数据x1,x2,…,x n的众数为a,方差为b,则数据x1+2,x2+2,…,x n+2的众数,方差分别是()A.a,b B.a,b+2 C.a+2,b D.a+2,b+2【分析】根据数据x1,x2,…,x n的众数为a,方差为b,可知数据x1+2,x2+2,…,x n+2与原来数据相比都增加2,则众数相应的加2,平均数都加2,则方差不变.解:∵数据x1,x2,…,x n的众数为a,方差为b,∴数据x1+2,x2+2,…,x n+2的众数为a+2,这组数据的方差是b,【答案】C【点评】本题考查方差和众数,解答本题的关键是明确题意,利用众数和方差的定义解答.16.在一次训练中,甲、乙、丙三人各射击10次的成绩(单位:环)如图,在这三人中,此次射击成绩最稳定的是()A.甲B.乙C.丙D.无法判断【分析】根据方差的定义,方差越小数据越稳定,即可得出答案.解:根据统计图波动情况来看,此次射击成绩最稳定的是乙,波动比较小,比较稳定.【答案】B.【点评】本题考查了方差的意义.方差是用来衡量一组数据波动大小的量,方差越大,表明这组数据偏离平均数越大,即波动越大,数据越不稳定;反之,方差越小,表明这组数据分布比较集中,各数据偏离平均数越小,即波动越小,数据越稳定.17.如图是我国2013~2017年国内生产总值增长速度统计图,则这5年增长速度的众数是.【答案】6.9%18.春节期间,某著名旅游景点成为热门景点,大量游客慕名前往,市旅游局统计了春节期间5天的游客数量,绘制了如图所示的折线统计图,则这五天游客数量的中位数为.【答案】23.4万【解析】从图中看出,五天的游客数量从小到大依次为21.9, 22.4, 23.4, 24.9, 25.4,则中位数应为23.4万。

算法实验报告--众数问题

算法实验报告--众数问题

一、实验目的给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。

多重数集S中的重数最大的元素称为众数。

例如,S={1,2,2,2,3,5}。

多重集S得众数是2,其重数为3。

对于给定的由n个自然数组成多重数集S,计算S的众数及其重数。

二、实验环境Windows7 + Visual Studio 2010三、实验内容1.设计思路利用快速排序将数据集S排序,再遍历整个数组,利用Number类记录每个数出现的频率,从而找出集合的众数和重数。

2.相关模块#include<iostream>#include<fstream>using namespace std;//存储数y与出现频率class Number{public:Number(){count = 0;}int value;int count;};void write(char* filename,int size,Number *num);void mode(int *a,int size,Number *num);void quickSort(int*,int,int);int Partition(int*,int,int);int main(){int size=0;int frequency=0;char* inFileName = "H:\\C++\\Algorithms\\in2.txt";char* outFileName = "H:\\C++\\Algorithms\\out2.txt";ifstream input(inFileName,ios::in);//从文件读取数据input >> size;int *a = new int[size];for(int i=0; i<size; ++i)input>>a[i];input.close();//对数组用快排排序quickSort(a,0,size-1);Number *num = new Number[size];mode(a,size,num);write(outFileName,size,num);system("pause");return 0;}//将众数与重数写入文件,如果有多个,则将所有结果依次写入文件void write(char* filename,int size,Number *num){int max = 0;for(int i=1; i<size; ++i)if(num[i].count>num[max].count)max = i -1;ofstream output;output.open(filename,ios::out);output << num[max].value << "\n" << num[max].count << endl;for(int i=0; i<size; ++i)if(num[max].count==num[i].count&&max!=i)output << num[i].value << "\n" << num[i].count << endl;output.close();}//划分int Partition(int *arr,int p,int r){int i=p, j=r+1;int x = arr[p];//sort < x to left, > x to rightwhile(true){while(arr[++i]<x&&i<r);while(arr[--j]>x);if(i>=j)break;swap(arr[i],arr[j]);}arr[p]=arr[j];arr[j]=x;return j;}//快排void quickSort(int *arr,int p,int r){if(p<r){int q = Partition(arr,p,r);quickSort(arr,p,q-1);//sort the left partquickSort(arr,q+1,r);//sort the right part }}//找出众数与重数void mode(int*a,int size, Number *num){int count = 1; //某个数出现的次数//遍历排好序的数组,计算出每个数出现的次数for(int i=0; i<size-1; ++i){if(a[i]==a[i+1])count++;else{num[i].value = a[i];num[i].count = count;count = 1;}}num[size-1].value = a[size-1];num[size-1].count = count;}四、实验结果分析及结论利用快速排序可以在O(n)平均时间内将数据集排好序,再花费O(n)遍历数据集找到众数与重数,总的时间复杂度为O(n)。

众数计算方法

众数计算方法

众数计算方法嘿,朋友们!今天咱来聊聊众数计算方法。

啥是众数呢?众数就像是一群数字里最受欢迎的那个家伙!比如说,在一堆数字里,某个数字出现的次数最多,那它就是众数啦。

想象一下,数字们在开派对,众数就是那个最受瞩目的明星,大家都围着它转呢!计算众数其实不难,就是把一堆数字整理整理,看看哪个数字出现的次数最多。

咱举个例子哈,比如有这么一组数字:1,2,2,3,3,3,4。

那这里面 3 出现的次数最多,3 就是这组数字的众数啦!是不是挺简单的?那要是遇到复杂点的情况咋办呢?比如说有两个数字出现的次数一样多,那它们可都是众数哦!就好像派对上有两个大明星一样,都很耀眼呢!还有啊,有时候数字太多,靠眼睛看可不行,得动动手,把每个数字出现的次数都记录下来,这样就能准确找到众数啦。

这就像是在茫茫人海中找到最闪亮的那颗星,得有点耐心和方法才行呢。

再比如说,你去统计同学们喜欢的颜色,红色有 5 个人喜欢,蓝色有 8 个人喜欢,绿色有 5 个人喜欢,那蓝色就是众数呀!这不就很容易理解了嘛。

众数在生活中也有很多用处呢!比如统计大家最喜欢的水果、最喜欢的电影啥的。

它能让我们快速了解到最普遍、最受欢迎的那个选项。

咱可别小瞧了这众数,它虽然简单,但是用处大着呢!它就像一个小侦探,能帮我们发现数据里的秘密。

哎呀,说了这么多,大家应该对众数计算方法有点感觉了吧?其实就是多观察、多动手,找到那个最突出的数字。

下次再遇到要找众数的情况,可别犯迷糊啦!相信大家都能轻松搞定众数的计算,让这些数字乖乖地把它们的“明星”众数给我们找出来!怎么样,是不是觉得挺有意思的呀?。

带有众数的问题

带有众数的问题

带有众数的问题统计学中,众数是指在一组数据中出现次数最多的数值。

对于带有众数的问题,我们可以通过统计分析来解决。

本文将以实例为基础,从定义众数开始,逐步介绍如何计算众数以及如何应用众数解决问题。

1. 众数的定义众数是指在一组数据中出现次数最多的数值。

通常来说,一个数据集可以有一个或多个众数。

如果所有数值都只出现一次,那么该数据集没有众数。

2. 如何计算众数要计算众数,首先需要将数据集进行排序,然后找到出现次数最多的数值。

以下是一个计算众数的简单示例:例子1:考试成绩学生A:80分学生B:90分学生C:85分学生D:85分学生E:92分学生F:90分将这组数据从小到大进行排序:80, 85, 85, 90, 90, 92可以看出,在这个数据集中,85和90出现的次数最多,都出现了两次。

因此,该数据集有两个众数,分别为85和90。

3. 应用众数解决问题众数在实际问题中有广泛的应用,尤其在统计和数据分析领域。

以下是一些使用众数解决问题的示例:例子2:销售额分析某零售店每天记录当天的销售额,经过一段时间的统计,得到以下数据:1000元, 500元, 800元, 1200元, 900元, 500元, 800元, 1000元, 1200元计算众数可以帮助我们确定销售额中的常见金额,进而帮助零售店制定更合理的促销策略。

在这个例子中,500元、800元、1000元和1200元均出现了两次,因此这四个数字都是众数。

例子3:调查结果分析某市进行了一项民意调查,调查问卷中有一个问题是选择自己最喜欢的颜色。

经过统计,得到以下数据:红色, 蓝色, 绿色, 红色, 蓝色, 黄色, 蓝色, 红色, 红色通过计算众数,可以确定最受欢迎的颜色是红色,因为红色出现的次数最多。

4. 注意事项和局限性在计算众数时,需要考虑以下几个注意事项和局限性:- 如果数据集存在多个数值出现次数相同且均为最大值,那么就存在多个众数。

- 如果数据集中所有数值都只出现一次,那么该数据集没有众数。

算法设计与分析:2-2众数问题

算法设计与分析:2-2众数问题

算法设计与分析:2-2众数问题2-2 众数问题问题描述给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。

多重集S中重数最⼤的元素称为众数。

例如,S= {1,2,2,2,3,5}。

多重集S的众数是2,其重数为3。

对于给定的n个⾃然数组成的多重集S,计算S的众数及其重数 。

数组实现Javaimport java.util.Arrays;public class Main {public static void main(String[] args) {int[] numbers = {1, 2, 2, 2, 3, 5};// int[] numbers = {1, 2, 2, 2, 3, 5, 1, 1, 1, 1};// int[] numbers = {1, 2, 2, 2, 3, 5, 1, 1, 1};// int[] numbers = {1, 2, 2, 2, 3, 5, 5, 5, 5, 5, 5};// int[] numbers = {2, 2, 2, 2, 2, 2};// int[] numbers = {2};// int[] numbers = {2, 2};// int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 2, 2, 3, 4, 5};int maxNum = Arrays.stream(numbers).max().getAsInt();int[] count = new int[maxNum+1];for(int i=0; i<numbers.length; i++){count[numbers[i]]++;}int tmpCount = 0;int tmpValue = 0;//loop by array numbers length// for(int i=0; i<numbers.length; i++){// if(count[numbers[i]] > tmpCount){// tmpCount = count[numbers[i]];// tmpValue = numbers[i];// }// }//loop by the maximum number in array numbersfor(int i=0; i<=maxNum; i++){if(count[i] > tmpCount){tmpCount = count[i];tmpValue = i;}}System.out.println("The number: "+tmpValue+" appeared most times: "+tmpCount);}}分治法实现Javaimport java.util.Arrays;public class Main {// private static int[] numbers = {1, 2, 2, 2, 3, 5};// private static int[] numbers = {1, 2, 2, 2, 3, 5, 1, 1, 1, 1};// private static int[] numbers = {1, 2, 2, 2, 3, 5, 1, 1, 1};// private static int[] numbers = {1, 2, 2, 2, 3, 5, 5, 5, 5, 5, 5};// private static int[] numbers = {2, 2, 2, 2, 2, 2};// private static int[] numbers = {2};// private static int[] numbers = {2, 2};private static int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 2, 2, 3, 4, 5};private static int leftest = 0;private static int rightest = numbers.length-1;private static int left, right;private static int count=0;private static int number;public static void main(String[] args) {Arrays.sort(numbers);mode(leftest, rightest);System.out.println("The number: "+number+" appeared most times: "+count);}private static void mode(int l, int r){int midIndex = getMidIndex(l, r);split(numbers, midIndex, l, r);if(count < right-left+1){count = right-left+1;number = numbers[midIndex];}if(left-l > count)mode(l, left-1);if(r-right > count)mode(right+1, r);}private static int getMidIndex(int l, int r){return (l+r)/2;}private static void split(int[] numbers, int midIndex, int l, int r){left = midIndex;right = midIndex;while (left-1 >=l && numbers[--left] == numbers[midIndex]);while (right+1<=r && numbers[++right] == numbers[midIndex]);if(numbers[l] != numbers[midIndex])left++;if(numbers[r] != numbers[midIndex])right--;}}Map实现Javaimport java.util.*;public class Main {public static void main(String[] args) {int[] numbers = {1, 2, 2, 2, 3, 5};// int[] numbers = {1, 2, 2, 2, 3, 5, 1, 1, 1, 1};// int[] numbers = {1, 2, 2, 2, 3, 5, 1, 1, 1};// int[] numbers = {1, 2, 2, 2, 3, 5, 5, 5, 5, 5, 5};// int[] numbers = {2, 2, 2, 2, 2, 2};// int[] numbers = {2};// int[] numbers = {2, 2};// int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 2, 2, 3, 4, 5};Map<Integer, Integer> kvMap = new HashMap<>();for (int i = 0; i < numbers.length; i++) {Integer v = kvMap.get(numbers[i]);kvMap.put(numbers[i], v == null ? 1 : v + 1);}//ArrayListList<Map.Entry<Integer, Integer>> entries = new ArrayList<>(kvMap.entrySet());// 对entries按出现频率从⼤到⼩排序Collections.sort(entries, new Comparator<Map.Entry<Integer, Integer>>() {@Overridepublic int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {return e2.getValue() - e1.getValue();}});System.out.println("The number: "+entries.get(0).getKey()+" appeared most times: "+entries.get(0).getValue());int size = entries.size();for (int i = 1; i < size; i++) {// 如果之后的entry与第⼀个entry的value相等,那么这个entry的键也是众数if (entries.get(i).getValue().equals(entries.get(0).getValue())) {System.out.println("The number: "+entries.get(i).getKey()+" appeared most times: "+entries.get(i).getValue());} else {break;}}}}Sample outputThe number: 2 appeared most times: 3Reference王晓东《计算机算法设计与分析》(第3版)P41。

众数计算公式例题

众数计算公式例题

众数计算公式例题好的,以下是为您生成的关于“众数计算公式例题”的文章:咱们在数学的世界里呀,众数可是个挺有趣的概念。

啥是众数呢?简单说,就是一组数据中出现次数最多的那个数。

那怎么通过计算找到众数呢?咱们来瞅瞅下面这些例题。

比如说,有这么一组数据:3,5,5,7,8,5,9。

那这里面的众数是啥呢?咱们来数数,3 出现了 1 次,5 出现了 3 次,7 出现了 1 次,8 出现了 1 次,9 出现了 1 次。

很明显,5 出现的次数最多,所以这组数据的众数就是 5 啦。

再来看一个例子,班级里同学的身高分别是:140cm,145cm,150cm,145cm,155cm,145cm,160cm。

咱们来找找众数。

数一下就知道,140cm 出现 1 次,145cm 出现 3 次,150cm 出现 1 次,155cm出现 1 次,160cm 出现 1 次。

所以这组数据的众数就是 145cm,看来这个身高在班级里比较常见呢。

前几天我去菜市场买菜,就碰到了跟众数有关的有趣事儿。

我在一个水果摊前,摊主说这周卖得最好的水果是苹果、香蕉和橙子。

我好奇地问他每种水果分别卖了多少。

他说苹果卖了 15 斤,香蕉卖了 20 斤,橙子卖了 18 斤。

嘿,这可不就是一组数据嘛!在这组数据里,20 这个数最大,也就意味着香蕉是这周卖得最多的水果,它就是这组数据的众数。

从这个小小的例子就能看出来,众数在咱们生活里其实还挺有用的,能帮摊主知道哪种水果更受欢迎,好准备更多货。

咱们继续看例题,有一组考试成绩:85 分,90 分,88 分,90 分,92 分,85 分。

这里面 85 分出现了 2 次,90 分出现了 2 次,88 分出现了 1 次,92 分出现了 1 次。

这时候就有点特别啦,85 分和 90 分出现的次数一样多,都是最多的。

这种情况下,这组数据就有两个众数,85 分和 90 分。

还有一组数据,比如班级同学参加课外活动的情况,跳绳的有 10 人,跑步的有 8 人,打球的有 12 人,下棋的有 10 人。

众数问题分支算法c++

众数问题分支算法c++

众数问题分支算法c++众数(Mode)是指在一组数据中出现次数最多的数值。

解决众数问题的分支算法可以通过C++来实现。

下面是一个简单的示例代码:cpp.#include <iostream>。

#include <vector>。

#include <unordered_map>。

int main() {。

std::vector<int> nums = {1, 2, 2, 3, 4, 2, 5, 2, 2}; // 示例数据。

std::unordered_map<int, int> countMap; // 使用无序map来统计每个数字出现的次数。

int maxCount = 0;int mode = 0;for (int num : nums) {。

countMap[num]++; // 统计每个数字出现的次数。

if (countMap[num] > maxCount) {。

maxCount = countMap[num]; // 更新最大出现次数。

mode = num; // 更新众数。

}。

}。

std::cout << "众数是," << mode << std::endl;return 0;}。

在这个示例中,我们首先定义了一个包含示例数据的整数向量nums。

然后,我们使用无序map countMap 来统计每个数字出现的次数。

我们遍历nums中的每个数字,更新countMap中相应数字的出现次数,并且实时更新最大出现次数和对应的众数。

最后,我们输出找到的众数。

这个算法的时间复杂度为O(n),其中n是数据的个数。

这是一种简单而高效的分支算法来解决众数问题。

希望这个示例能够帮助你理解如何用C++来实现众数问题的分支算法。

求众数算法范文

求众数算法范文

求众数算法范文众数,又称为众数或者众数,是统计学中常用的一个概念,用于描述样本中出现次数最多的数值。

求众数的算法有多种,下面将介绍其中的几种常见算法。

一、暴力法:暴力法是最简单直接的方法,遍历整个样本,统计每个数值出现的次数,然后找到出现次数最多的数值即可。

这个算法的时间复杂度为O(n^2),对于大规模的样本来说效率比较低。

二、哈希表法:哈希表法是一种常见的求众数的方法。

首先遍历整个样本,将每个数值作为键,出现次数作为值,存放到哈希表中。

然后再遍历哈希表,找到出现次数最多的数值即可。

这个算法的时间复杂度为O(n),效率相对较高。

三、排序法:排序法是一种比较简单的方法。

首先将样本进行排序,然后遍历排序后的样本,统计每个数值出现的次数,找到出现次数最多的数值即可。

这个算法的时间复杂度取决于排序算法的效率,一般为O(nlogn)。

四、中位数法:中位数法是一种比较巧妙的方法。

首先将样本进行排序,然后找到排序后样本中的中位数。

由于众数是出现次数最多的数值,而中位数是出现次数超过一半的数值,因此中位数一定是众数。

这个算法的时间复杂度为O(nlogn)。

五、摩尔投票法:摩尔投票法是一种高效的求众数的方法。

算法的基本思想是在样本中找出一对不同的数值,然后将它们从样本中删除,直到最后剩下的数值。

最后剩下的数值即为众数。

这个算法的时间复杂度为O(n)。

六、桶计数法:桶计数法是一种适用于数值范围较小的求众数的方法。

首先创建一个和样本中最大数值相等长度的桶,然后遍历样本,将每个数值作为桶的索引,增加对应桶的计数。

最后找到桶中计数最多的数值即为众数。

这个算法的时间复杂度为O(n),但需要额外的空间来存储桶。

以上介绍了几种常见的求众数的算法,不同的算法适用于不同的场景。

在实际应用中,可以根据具体的问题选择合适的算法来求解众数。

同时,还可以结合其他统计指标来综合分析样本的分布情况,更加全面地理解样本的特征。

众数计算方式

众数计算方式

众数是指一组数据中出现次数最多的数值。

计算一组数据的众数的方法如下:
1. 列出数据:首先,将所有数据值列出来。

2. 统计频率:对于每个数据值,统计它在数据集中出现的次数。

3. 找出出现次数最多的值:找出所有数据值中出现次数最多的那个值。

这个值就是众数。

4. 考虑重复情况:如果一组数据中有多个数据值出现次数相同,且都是出现次数最多的,那么这多个数据值都是众数。

5. 无众数的情况:如果一组数据中所有数据值都只出现一次,那么这组数据没有众数。

举例来说,假设有一组数据:5, 3, 8, 3, 8, 8, 2, 3, 3, 8。

首先统计每个数值出现的次数:
5 出现1 次
3 出现3 次
8 出现4 次
2 出现1 次
在这组数据中,8 出现的次数最多,为4 次,因此众数是8。

如果数据集非常大或者数据是实时更新的,通常会使用计算器或计算机程序来统计和计算众数,以便更快速和准确地得到结果。

在编程语言中,通常有内置函数或库可以直接用来计算一组数据的众数。

已知中位数和平均数求众数的方法

已知中位数和平均数求众数的方法

已知中位数和平均数求众数的方法一、概述中位数、平均数和众数是描述数据集中数据趋势的三个重要统计量,它们在统计分析和数据挖掘中具有重要意义。

其中,中位数指的是一组数据中处于中间位置的数值,平均数是所有数值的总和除以数值的个数,而众数则是数据集中出现次数最多的数值。

在实际应用中,往往已知数据集的中位数和平均数,需要求解众数。

下面我们将介绍已知中位数和平均数求众数的方法。

二、分析数据集在进行求解众数之前,首先需要对数据集进行分析,包括计算中位数和平均数,并对数据进行排序。

假设我们有一组数据集合{3, 5, 7, 5, 9, 12, 5, 15, 18, 5, 21, 5, 18},我们的目标是求解该数据集的众数。

三、求解方法1. 确定中位数我们需要确定数据集的中位数。

中位数的计算方法为:如果数据集中的数据个数是奇数个,则中位数为排序后的中间数;如果数据集中的数据个数是偶数个,则中位数为排序后中间两个数的平均值。

对于给定的数据集{3, 5, 7, 5, 9, 12, 5, 15, 18, 5, 21, 5, 18},首先需要进行排序,得到{3, 5, 5, 5, 5, 7, 9, 12, 15, 18, 18, 21},由于数据集中的数据个数为12个,是偶数个,因此中位数为中间两个数的平均值,即(7+9)/2=8。

2. 计算平均数接下来,我们需要计算数据集的平均数。

平均数的计算方法为:平均数 = 数据集中所有数值的总和 / 数据集中数据个数通过对数据集的所有数值进行求和,然后除以数据个数,即可得到平均数。

对于给定的数据集{3, 5, 5, 5, 5, 7, 9, 12, 15, 18, 18, 21},我们可以得到平均数为(3+5+5+5+5+7+9+12+15+18+18+21)/12=9.5。

3. 寻找众数在已知中位数和平均数的情况下,下面介绍如何求解众数。

(a) 若中位数等于平均数如果中位数等于平均数,说明数据集中没有重复的数值,此时众数即为中位数和平均数。

摩尔算法求众数

摩尔算法求众数

摩尔算法求众数一、摩尔算法求众数的概念摩尔算法呢,就像是一个超级聪明的小侦探,专门用来找众数这个特殊的家伙。

众数嘛,就是在一堆数里出现次数最多的那个数。

比如说,1、2、2、3、2,这里的2就是众数啦。

摩尔算法有它自己独特的一套方法来找这个众数哦。

二、摩尔算法求众数的基本原理摩尔算法的原理就像是在一个大派对里找最受欢迎的人。

它会先随便选一个数当作“候选人”,然后就开始一个个数地去核对。

如果碰到和这个“候选人”一样的数,就给这个“候选人”加一票。

要是碰到不一样的数呢,就给这个“候选人”减一票。

如果这个“候选人”的票数变成0了,那就再重新选一个新的“候选人”。

这样一直循环下去,最后剩下的那个“候选人”就很有可能是众数啦。

三、摩尔算法求众数的具体步骤1. 先随便挑一个数作为初始的“候选人”,同时设置一个票数为1。

就像在一群小朋友里,先随便指一个小朋友说:“嘿,你就是我们要找的最受欢迎的小朋友啦,先给你一票。

”2. 然后从下一个数开始一个个检查。

这就好比开始在派对里一个个人去问喜不喜欢这个“候选人”小朋友。

如果碰到和这个“候选人”一样的数,票数就加1。

就像又有一个小朋友说:“我也喜欢这个小朋友。

”那这个“候选人”的票数就多一票啦。

如果碰到不一样的数,票数就减1。

就像有个小朋友说:“我不喜欢这个小朋友。

”那这个“候选人”的票数就少一票。

3. 当票数变成0的时候,就重新选一个新的“候选人”,再把票数设置为1。

这就像之前那个“候选人”小朋友发现没什么人喜欢他了,那就再重新选一个小朋友来当“候选人”。

4. 一直这样循环检查所有的数,最后剩下的那个“候选人”就是众数啦。

四、摩尔算法求众数的例子比如说我们有这样一组数:3、3、1、2、3、1、3。

1. 我们先选3作为“候选人”,票数设为1。

2. 碰到下一个3,票数加1,变成2。

3. 碰到1,票数减1,变成1。

4. 碰到2,票数减1,变成0。

5. 因为票数变成0了,我们重新选1作为“候选人”,票数设为1。

众数(Mode)算法

众数(Mode)算法

众数(Mode)算法 1.求众数有很多种解法,直觉上第⼀种就是⽤哈希表统计,这种⽅法需要O(n)的时间和空间。

另⼀种叫摩尔投票法,需要O(n)的时间和O(1)的空间,⽐哈希表要好,这种投票法先将第⼀个数字假设为众数,然后把计数器设为1,⽐较下⼀个数和此数是否相等,若相等则计数器加1,否则计数器减1.然后看此时计数器的值,若为0,则将下⼀个值设为候选众数。

以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。

精妙!通俗的讲,他是把原数组精简化,相互抵消。

⾸先是有个强⼤的前提存在,就是众数⼀定存在。

如果计数器减到0了,说明⽬前不是候选者的数字的个数已经跟候选者出现的个数相同了,那么这个候选者已经很weak,不⼀定能出现超过半数,我们选择更换当前的候选者。

那么可能你会有疑问,那万⼀后⾯⼜⼤量出现了之前的候选者怎么办,不需要担⼼,如果之前的候选者在后⾯⼤量出现的话,其⼜会重新变为候选者,直到最终验证成为正确的众数。

using System;using System.Windows.Forms;namespace repo.素材{public partial class ModeSolve : Form{public ModeSolve(){InitializeComponent();}///<summary>///求众数///</summary>///<param name="sender"></param>///<param name="e"></param>private void button1_Click(object sender, EventArgs e){//int[] numer = new int[] { 3, 3, 0, 1, 3, 2, 4 };int mresult = majorityElement(numer); //majorityElementIO(numer);//System.Diagnostics.Debug.WriteLine(mresult);}///哈希表统计,需要O(n)的时间和空间。

众数的算法分析

众数的算法分析

众数的算法分析 版权申明:本⽂为博主窗户(Colin Cai)原创,欢迎转帖。

如要转贴,必须注明原⽂⽹址 /Colin-Cai/p/12664044.html 作者:窗户 QQ/微信:6679072 E-mail:6679072@ 所谓众数,源于这样的⼀个题⽬:⼀个长度为len的数组,其中有个数出现的次数⼤于len/2,如何找出这个数。

基于排序 排序是第⼀感觉,就是把这个数组排序⼀下,再遍历⼀遍得到结果。

C语⾔来写基本如下:int find(int a, int len){sort(a, len);return traverse(a, len);} 排序有时间复杂度为O(nlogn)的算法,⽐如快速排序、归并排序、堆排序,⽽遍历⼀遍排序后的数组得到结果是时间线性复杂度,也就是O(n)。

所以整个算法时间复杂度是O(nlogn)。

寻找更好的算法 上⾯的算法实在太简单,很多时候我们第⼀感就可以出来的东西未必靠谱。

我们是不是可以找到⼀种线性时间级别的算法,也就是Θ(n)时间级别的算法?Θ是上下界⼀致的符号。

其实我们很容易证明,不存在⽐线性时间级别低的算法,也就是时间o(n),⼩o不同于⼤O,是指低阶⽆穷⼤。

证明⼤致如下: 如果⼀个算法可以以o(n)的时间复杂度解决上述问题。

因为是⽐n更低阶的⽆穷⼤,那么⼀定存在⼀个长度为N的数组,在完成这个算法之后,数组内被检测的元素⼩于N/2。

假设算法运算的结果为a,然后,我们把这个数组在运算该算法时没有检测的元素全部替换为成同⼀个不是算法所得结果a的数b。

然后新的数组,再通过算法去运算,因为没有检测的数不会影响其算法结果,结果⾃然还是a,可实际上,数组超过N/2次出现的数是b。

从⽽导致⽭盾,所以针对该问题的o(n)时间算法不存在。

我们现在可以开始想点更加深⼊点的东西。

我们⾸先会发现,如果⼀个数组中有两个不同的数,将数组去掉这两个数,得到⼀个新数组,那么这个新数组依然和⽼数组⼀样存在相同的众数。

查找众数

查找众数

5、1、2、5、5、5、5、3、5、4 用变量 C 记录目前出现最多的那个候选 用变量 M 记录候选 C 减去删除以后出现的次数。 从左开始扫描序列: 如果新的选票和 C 相同,就增加 M;
如果新的选票和 C 不同,就删除它和一个 C,M 就减一; 如果 M 被减成 0 了,重新选定一个新的候选,重新计数。
return ( result ) end
如果序列存在众数,这样选定的候选既是众数。
最后验证它是否是众数即可。
5 C,M 5,1
1 ?,0
2
5
5
5
5
3
5
3
4
2,1
?,0 5,1
5,2 5,3
5,2 5,3 5,2 5,1
function majority( array x[1..n] ) begin C ← x[1]; M ← 1; //第一次扫描删去除 C 以外的所有选票 for i ← 2 to n step 1 do begin if ( M=0 ) then begin C ← x[i]; M ← 1; end else if ( C=x[i] ) then M ← M+1 else M ← M-1 end
四、基于归纳的算法

分析:
若 xi ≠ xj,删除这两个数后,原序列中的众数仍是新序 列的众数。 (注意,否命题不成立:1、2、5、5、3中没有众数,但删 除1和2后,5变成了众数。) 设法从众数的候选者中删除尽可能多的数,减小问题的规模, 最终剩下一个数。 找到两个不同的选票,就将其删除,然后从剩余选票中查找 众数。
【例】 查找众数
问题:已知一数列,判断是否存在众数,若查找,则求出众 数。 令 E 是整数序列 x1,x2,...,xn。 E 中 x 的重数(multiplicity)是 x 在 E 中出现的次 数。 如果某个数 z 的重数大于 n/2,则它就是 E 中的众数 (majority)。 应用:用整数表示选举中的投票,问题就是判断是否有人赢 得了选举。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法分析与设计
实验报告
实验名称:众数问题
实验日期: 2011/03/13 学生姓名:谌浩旗
学生学号: ********
一、实验目的
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。

多重数集S中的重数最大的元素称为众数。

例如,S={1,2,2,2,3,5}。

多重集S得众数是2,其重数为3。

对于给定的由n个自然数组成多重数集S,计算S的众数及其重数。

二、实验环境
Windows7 + Visual Studio 2010
三、实验内容
1.设计思路
考虑到如果要用线性时间解决该问题,可以定义一个容量大的数组,大小要不小于数组S中的最大数,这样势必浪费大量的空间。

因而考虑另一种相对时间复杂度较高的方法。

先将数组S排序,然后遍历一遍,几下个数最多的值及其个数。

2.相关模块
#include<iostream>
#include<fstream>
using namespace std;
int Random(int l, int r);
void Swap(int &a, int &j);
int Partition(int *a, int l, int r);
int RandomizedPartition(int *a, int l, int r);
//快速排序
void RandomizedQuickSort(int *a, int l, int r);
void main()
//文件输入输出流的定义
char *inputFile = "input.txt",
*outputFile = "output.txt";
ifstream fin(inputFile, ios::in);
ofstream fout(outputFile, ios::out);
int n;
//获取数组大小
fin >> n;
int *a = new int [n];
//获取数组
for (int i = 0; i < n; ++i)
fin >> a[i];
//对数组进行排序
RandomizedQuickSort(a, 0, n - 1);
//找出众数
int count = 1, //记录当前数的个数
maxCount = 1; //记录历史最大个数
int value = a[0], //记录当前数的值
maxValue = a[0]; //记录历史最大个数的数的值for (int i = 1; i < n; ++i)
{
//如果这个值与当前记录值相同
if (a[i] == value)
{
//计数器自增
++count;
//如果数目大于历史最大数目则更新
if (count > maxCount)
{
maxValue = value;
maxCount = count;
}
}
//如果不同,则当前记录值变更,计数器变回1
else
{
value = a[i];
count = 1;
}
}
//将结果写入输出文件
fout << maxValue << endl << maxCount;
//system("pause");
}
int Random(int l, int r)
{
int i = rand() % (r - l + 1);
return i + l;
}
void Swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int Partition(int *a, int l, int r)
{
int i = l,
j = r + 1;
int temp = a[l];
while (true)
{
while (a[++i] < temp && i <= r);
while (a[--j] > temp);
if (i > j) break;
Swap(a[i], a[j]);
}
a[l] = a[j];
a[j] = temp;
return j;
}
int RandomizedPartition(int *a, int l, int r) {
int i = Random(l, r);
Swap(a[l], a[i]);
return Partition(a, l, r);
}
void RandomizedQuickSort(int *a, int l, int r) {
if (l < r)
{
int i = RandomizedPartition(a, l, r);
RandomizedQuickSort(a, l, i - 1);
RandomizedQuickSort(a, i + 1, r);
}
}
四、实验结果分析及结论
运行前:
运行后:
此解决方案的时间复杂度取决于排序算法的选取,这里选取的快排,因而时间复杂度为O(nlogn) + O(n) = O(nlogn)。

相关文档
最新文档