数组的众数问题分治法解法
2009-12-10 13:51
246 查看
★问题描述:
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。
多重集S的众数是2,其重数为3。
★编程任务:
对于给定的由n个自然数组成的多重集S,编程计算S的众数及其重数。
★数据输入:
输入数据由文件名为input.txt的文本文件提供。文件的第1行多重集S中元素个数n;接下来的n行中,每行有一个自然数。
★结果输出:
程序运行结束时,将计算结果输出到文件output.txt中。输出文件有2行,第1行给出众数,第2行是重数。
输入文件示例 输出文件示例
input.txt output.txt
6 2
1 3
2
2
2
3
5
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
这回是对上次发帖后改用分治法解决的,还有待改进之处。
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。
多重集S的众数是2,其重数为3。
★编程任务:
对于给定的由n个自然数组成的多重集S,编程计算S的众数及其重数。
★数据输入:
输入数据由文件名为input.txt的文本文件提供。文件的第1行多重集S中元素个数n;接下来的n行中,每行有一个自然数。
★结果输出:
程序运行结束时,将计算结果输出到文件output.txt中。输出文件有2行,第1行给出众数,第2行是重数。
输入文件示例 输出文件示例
input.txt output.txt
6 2
1 3
2
2
2
3
5
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
这回是对上次发帖后改用分治法解决的,还有待改进之处。
#include<iostream> #include<fstream> using namespace std; //结构体用来保存众数的元素与重数 typedef struct { int element;//元素 int sum;//重数 }zs; //记录中位数的起始下标 typedef struct { int low; int high; }node; //快排 zs x; //int data=1; void sort(int a[],int s,int t)//对a[s]到a[t]的元素排序 { int i=s,j=t; int temp; if(s<t)//区间里至少存在一个元素的情况 { temp=a[s];//用区间的第一个元素做基准 while(i!=j)//区间两端交替向中间扫描,知道I=J { while(j>i&&a[j]>temp) j--;//从右向左扫描,找到第一个小于temp的a[j] if(i<j)//表示找到a[j],则a[i],a[j]交换 { a[i]=a[j]; i++; } while(i<j&&a[i]<temp) i++;//从左向右扫描,找到第一个大于temp的a[i] if(i<j)//表示找到a[i],则a[i],a[j]交换 { a[j]=a[i]; j--; } } a[i]=temp; sort(a,s,i-1);//对左递归 sort(a,i+1,t);//对右递归 } } //中位数 int madian(int *a,int l,int r) { int x=r+l+1; // if(x%2) return a[x/2];//为奇数时 // else // return (a[x/2]+a[x/2+1])/2;//为偶数时 } //返回中位数的起始点 node spalit(int *a,int med,int l,int r) { node m; m.low=l;m.high=r; for(int i=0;i<=r;i++) { if(med==a[i]) { m.low=i; break; } } for(int j=r;j>=0;j--) { if(med==a[j]) { m.high=j; break; } } return m; } //众数的重数求取 void mode(int *a,int l,int r) { if(l>=r)return; //x.sum=0; else { node n; int temp=0; int med; med=madian(a,l,r); n=spalit(a,med,l,r); temp=n.high-n.low+1; if(x.sum<temp) { x.element=med; x.sum=temp; } if(n.low-l>temp)// { if(x.sum<temp) { x.element=med; x.sum=temp; } mode(a,l,n.low-1); } if(r-n.high>temp) { if(x.sum<temp) { x.element=med; x.sum=temp; } mode(a,n.high+1,r); } } } void main() { x.sum=0; int n; int *a; ifstream in("C://inputdate.txt"); if(!in) { cout<<"the file can't open!"<<endl; } in>>n; a=new int ; for(int i=0;i<n;i++) { in>>a[i]; } sort(a,0,n-1); mode(a,0,n-1); cout<<x.element<<" "<<x.sum<<endl; delete []a; }
相关文章推荐
- 数组的众数问题的分治解法
- 数组的众数问题的非分治解法
- 算法导论C语言实现: 分治策略 -- 最大子数组问题
- RMQ问题的树状数组解法
- 分治策略算法之最大字数组和问题
- 最长公共子串问题的后缀数组解法
- 约瑟夫环,数三退一类问题(数组解法)
- 算法导论:分治策略__最大子数组问题
- 最大子数组问题的三种解法
- 数组排序问题的两种方法:插入排序算法和递归(分治)算法
- 最长公共子串问题的后缀数组解法
- 算法导论之分治策略:最大子数组问题
- 众数问题-递归和分治
- n皇后问题纯数组解法
- 约瑟夫问题的数组解法
- 【算法设计-分治】最大子数组问题
- 分治策略 求两同长数组的中位数问题
- 分治——最大子数组问题
- NYOJ 众数问题的三种解法
- 最大子数组问题的分治求解算法