算法设计--众数和重数问题(分治法)
2016-10-19 21:36
781 查看
问题描述:
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的n个自然数组成的多重集S,计算S的众数及其重数 。
问题分析:
1、 分治法
分治法解题过程主要分为分、治、合三个步骤“,应用该方法的基本过程如下:
(1) 将原问题分解为若干个规模较小的子问题
(2) 对这些子问题分别求解
(3) 对各个子问题的解进行合并
2、 众数:一组数据中出现次数最多的数值,叫众数。有时一组数据中有多个众数。
重数:重数是指该众数出现的次数。
3、 根据以下实例理解分治法求解众数及其重数
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S = {1,2,2,2,3,5}。
多重集S的众数是2,其重数是3.
算法实现:
运行结果
由于初始数组为int s[] = {1,2,2,2,3,5};所以运行结果中众数为 2 重数为 3
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的n个自然数组成的多重集S,计算S的众数及其重数 。
问题分析:
1、 分治法
分治法解题过程主要分为分、治、合三个步骤“,应用该方法的基本过程如下:
(1) 将原问题分解为若干个规模较小的子问题
(2) 对这些子问题分别求解
(3) 对各个子问题的解进行合并
2、 众数:一组数据中出现次数最多的数值,叫众数。有时一组数据中有多个众数。
重数:重数是指该众数出现的次数。
3、 根据以下实例理解分治法求解众数及其重数
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S = {1,2,2,2,3,5}。
多重集S的众数是2,其重数是3.
算法实现:
// Test_01.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" void split(int s[],int n,int &l,int &r){ int mid = n/2; for(l = 0; l<n; ++l){ if(s[l] == s[mid]) break; } for(r = l+1;r<n;++r){ if(s[r] != s[mid]) break; } } //num表示众数 maxCnt表示重数 void getMaxCnt(int &mid,int &maxCnt, int s[],int n){ int l ,r; split(s,n,l,r); //将数组进行切割成两端 int num = n/2; int cnt = r - 1; if(cnt > maxCnt){ maxCnt = cnt; mid = s[num]; } //l表示左边的个数,左边的个数必须大于中位数的个数,才有进行搜索的意义 if(l+1 > maxCnt){ getMaxCnt(mid, maxCnt, s, l+1); } //同理,右边的个数将要大于中位数的个数才有继续搜寻的意义,同时右边数组的起始位置进行改变 if(n-r > maxCnt){ getMaxCnt(mid, maxCnt, s+r, n-r); } } int _tmain(int argc, _TCHAR* argv[]) { int s[] = {1,2,2,2,3,5}; 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; }
运行结果
由于初始数组为int s[] = {1,2,2,2,3,5};所以运行结果中众数为 2 重数为 3
2 3 请按任意键继续. . .
相关文章推荐
- 计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题
- 【趣味算法设计】众数问题&社会名流问题
- 算法设计--蛮力法&&分治法求最近对问题(C++实现)
- 分治法实现众数问题--例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。
- 【算法设计】最大子矩阵问题
- php初学者的问题-编码-设计模式-面向对象-算法-框架
- 分治法编程问题之最接近点对问题的算法分析
- 算法---众数问题
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 棋盘覆盖问题的算法设计
- 【算法分析与设计】最小生成树问题
- 【算法设计】最大子段和问题
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 【算法分析与设计】全排列问题
- 折半查找实现算法二(递归办法)PS:编译后有一个warning,但不影响结果,代码设计上应该还有些问题
- 分治法编程问题之最接近点对问题的算法分析
- 工作流引擎设计中的遍历算法的问题
- 分治法 - 合并算法设计