分治法求众数问题

该博客探讨了如何使用分治法解决众数问题,即找到一个数组中出现次数最多的元素。通过分析中位数的重数和其首次出现的位置,判断左右两侧是否可能存在众数。在初始算法基础上,作者发现了潜在的问题,并通过排序来改进算法,但注意到这会增加时间空间复杂度。博客强调了算法优化的重要性,并欢迎读者交流讨论。
摘要由CSDN通过智能技术生成

问题描述:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。要求对给定的又n个自然数的组成的多重集S,计算S的众数及其重数。

读完问题我们发现求众数就是求一个数组里面出现最多的数,假设我们先求出中位数的重数,再求出中位数第一次出现的位置(中位数可能有多个),如果发现这个位置左边的数的个数小于这个重数那么我们就不用再往左边寻找了,因为左边已经没有比这个中位数的重数更大的数了,右边同理。

经过上面的分析我们再把问题细化一下,找出这个中位数在这个数组中第一次出现的位置,取出从这个位置再加这个中位数的重数组成一个子数组,那么如果这个子数组左边的数目小于这个子数组的个数,也就是重数个数,那么左边不会有众数出现,右边同理。

接下来就是代码了:

#include <stdio.h>

#define MAXSIZE 10

int n = 0 ; //存储众数
int s = 0 ; //存储众数的重数

int count(int a[], int p, int q){
/*统计中位数的重数*/
    int m = a[(p+q)/2] ;
    int counts = 0 ;
    for(int i=0; i<MAXSIZE; i++){
        if(a[i]==m)
            counts++ ;
    }
    return counts ;
}

int start(int
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值