众数问题
来源:互联网 发布:机械三维设计软件课程 编辑:程序博客网 时间:2024/04/24 07:44
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。 多重集S的众数是2,其重数为3。
对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。
Input
输入的第1行多重集S中元素个数n;接下来的n 行中,每行有一个自然数,值在整数范围内
Output
方法二:先排序,然后再统计,时间复杂度较高。
例如,S={1,2,2,2,3,5}。 多重集S的众数是2,其重数为3。
对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。
Input
输入的第1行多重集S中元素个数n;接下来的n 行中,每行有一个自然数,值在整数范围内
Output
程序运行结束时,将计算结果输出。输出文件有2 行,第1 行给出众数,第2 行是重数。如果很多数的出现次数相同则输出最小的那个。
方法一:递归实现
– 先根据某数X,将小于X的放于其左,大于X的放于其右– 统计X出现的次数T– 如果X左边数的个数>T,向左递归– 如果X右边数的个数>T,向右递归
代码如下:
#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAX 100int Random(int p, int r){//随机化 //return rand()*(r-p)/32767+p;return rand()%(r-p)+p;}void Swap(int* a, int* b){ int temp; temp= *a; *a = *b; *b = temp;}int Partition(int* y, int p, int r){ int i = p, j = r+1; int x = y[p]; while(true){ while(y[++i]<x&&i<r); while(y[--j]>x); if(i>=j) break; Swap(&y[i],&y[j]); } y[p] = y[j]; y[j] = x; return j;}int RandomizedPartition(int* y, int p, int r){ int i = Random(p,r); Swap(&y[i],&y[p]); return Partition(y,p,r);}void FindModeIndex(int* y,int i,int* left_index,int* right_index){ int mode=y[i];int left=i;int right=i;while(y[--left]==mode);while(y[++right]==mode);left++;right--;*left_index=left;*right_index=right;}void FindMode(int* y, int p, int r, int* mode, int* count){ int i = RandomizedPartition(y,p,r);int left_index;int right_index;int count_mid,count_left,count_right; FindModeIndex(y,i,&left_index,&right_index);count_mid=right_index-left_index+1;count_left=left_index-p;count_right=r-right_index;if(count_mid>=*count){*mode=y[i];*count=count_mid;} if(count_left>=count_mid) FindMode(y,p,left_index-1,mode,count); if(count_right>=count_mid) FindMode(y,right_index+1,r,mode,count);return;}int main(){int n;int* a;int i;int mode;int count;a=(int *)malloc(sizeof(int)*MAX);scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&a[i]);i=0;mode=MAX;count=0; FindMode(a,0,n-1,&mode,&count);printf("mode is %d\ncount is %d\n",mode,count);free(a);return 0;}
方法二:先排序,然后再统计,时间复杂度较高。
方法三:利用数组或散列表统计,如果数据分布稠密采用数组,如果数据分布稀疏采用散列表。
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- C++使用VS2010导出Excel的方法及步骤
- Xml帮助类
- iOS学习之UIPickerView控件的简单使用
- ORACLE PL/SQL编程之八:把触发器说透
- C# 获取AD组中的用户信息
- 众数问题
- 什么是尺度
- 网页兼容常用的CSS hack
- mediastreamer2的初始化方法 ms_init源码分析。
- TOP 子句
- libvirt安装过程
- ubuntu下ffmpeg编译安装
- 深入分析 Java 中的中文编码问题
- jsp页面js提交传递中文字符时乱码处理