求众数问题算法的思路(用递归与分治策略)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求众数问题算法的思路(用递归与分治策略)相关的知识,希望对你有一定的参考价值。

给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数.例如,S=2,4,5,7,1,2,2,6,9,7S的众数为2,其重数为3 对于这个问题本人还没有任何思路,不知道怎么下手,恳请有经验的哥哥姐姐们指点!!求此问题的解决思路

参考技术A 题目要求输入若干不超过100的非负整数,输出众位数,若有多个,从小到大输出。
#include <stdlib.h>
#include <string.h>
int main()

int n;
scanf("%d",&n);
int i,j,a[100],m,max=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)

scanf("%d",&m);
a[m]++; //这是程序的巧妙之处,利用数组的下标作为出现数字的保存,而且避免了相同数字的重复记录。

for(i=0;i<100;i++)
for(j=0;j<100;j++)

if(a[i]>a[j]&&a[i]>max) //利用变量储存最大数,想了挺久才想出加上a[i]>max的条件。
max=a[i];

for(i=0;i<100;i++)
if(a[i]==max)
printf("%d ",i);
return 0;
参考技术B 不用递归可以吗?我想先排个序,然后相同的数字一定会在一起的,然后数一数哪一种数是最多的就行了,我以前写过.递归分治好像没什么优势吧

如何使用分治法求众数

在一个数组里求出现次数最多的数为众数
请用分治法求众数
要求有具体代码

参考技术A #include<stdio.h>

int largest = 0; //the quantity
int element; //number
int a[10];
int med;

int median(int p,int r)

int s = r - p + 1;
if(s%2==0)
return a[s/2-1];
else
return a[s/2];


void split(int p,int r,int *p1,int *r1)

int i;
for(i=p;i<r;i++)

if(a[i]==med)

*p1 = i;
break;


for(i=*p1+1;i<r;i++)

if(a[i]!=med)

*r1 = i;
break;




void mode(int p,int r)

int *p1,*r1;
med = median(p,r);
split(p,r,p1,r1);
if(largest<*r1-*p1+1)

largest = *r1-*p1;
element = med;

if(*p1-1>largest)
mode(p,*p1-1);
if(r-*r1>largest)
mode(*r1+1,r);


void main()

int n,i,j;
FILE *fp1,*fp2;
fp1 = fopen("input.txt","r");
if(fp1==NULL)

printf("error\n");
return;

fscanf(fp1,"%d",&n);
printf("the quantuty of the number %d\n",n);
i = 0;
while(fp1!=NULL)

fscanf(fp1,"%d",&a[i]);
i++;
if(i>=n)
break;

for(i=0;i<n;i++)

printf("%d\t",a[i]);

printf("\n");
fclose(fp1);
mode(0,n);
fp2 = fopen("output.txt","w");
if(fp2==NULL)

printf("error\n");

fprintf(fp2,"%d\n%d",element,largest);
fclose(fp2);
参考技术B 要哪种语言的呀? 参考技术C 要哪种语言的呀?

以上是关于求众数问题算法的思路(用递归与分治策略)的主要内容,如果未能解决你的问题,请参考以下文章

算法分析之递归与分治策略

分治策略

五大常见算法策略——递归与分治策略

计算机算法设计与分析之递归与分治策略——二分搜索技术

递归与分治策略

2_3 递归与分治策略(二分搜索技术)