博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分治法求众数问题 (配图)
阅读量:7138 次
发布时间:2019-06-28

本文共 874 字,大约阅读时间需要 2 分钟。

採用分治法。以中间为界限。 先计算环绕中间这个数字的众数情况。然后左右分开递归计算结果,取最值就可以。

左右递归计算的时候要先做推断。假如左边或是右边的个数都比已求的重数小。就不是必需计算了。即使左边或是右边所有都是一样的。那么他的重数也是小于已求的,所以不是必需进行运算,这一周在加深分治算法的学习,这题着实花了我不少时间。

详细代码:

// 用分治法求众数#include 
#include
using namespace std;// 本程序的关键。 以中间的数字为界限。 确定左右起始和终止界限void split(int s[], int n, int &l, int &r){ int mid = n/2; for(l=0; l
maxCnt) { maxCnt = cnt; mid = s[num]; } // l 表示左边的个数。左边的个数必须大于 maxCnt 才有必要搜寻 if (l+1 > maxCnt) { getMaxCnt(mid, maxCnt, s, l+1); } // 右边搜寻, 右边数组的起始地址要变更 if (n-r > maxCnt) { getMaxCnt(mid, maxCnt, s+r, n-r); }}int main(void){ int s[] = {1, 2, 2, 2, 3, 3, 5, 6, 6, 6, 6}; int n = sizeof(s)/sizeof(s[0]); int maxCnt = 0; int num = 0; getMaxCnt(num, maxCnt, s, n); printf("%d %d\n", num, maxCnt); return 0;}

大概思路图:

你可能感兴趣的文章
验证码识别技术研究
查看>>
WSDL文件生成java类
查看>>
我的友情链接
查看>>
CentOS7配置本地镜像及安装gluster服务
查看>>
android手势创建及识别
查看>>
弹了个框。。。不过不太好。 待解决
查看>>
keras 保存训练的最佳模型
查看>>
创业找投资,你要警惕的三种人---情商培养
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
大数据波分传输工程方案设计主要细节
查看>>
Z字形扫描(201412-2)
查看>>
如何确定Windows Server 2012中虚拟机的动态内存可用大小
查看>>
P2327 [SCOI2005]扫雷
查看>>
Hibernate基础实例
查看>>
索引设计规范
查看>>
python笔记4:计算输入时间为当年的第几天
查看>>
Linux 常用命令集合
查看>>
ARP的应用案例,测试ARP防火墙的主动防御功能;
查看>>
浅谈ipsec
查看>>