标题:[讨论]算法实现题 众数问题
只看楼主
slovey
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-6-16
 问题点数:0 回复次数:13 
[讨论]算法实现题 众数问题
«问题描述:
给定含有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
6
1
2
2
2
3
5

output.txt

2
3


这是算法...
但我还看不懂...
我认为文件操作还好弄.就算法,它是用递归来做的.


void mode(int LL,int RR)
{
int L1,R1;
int med=median(a,LL,RR);
split(a,med,LL,RR,L1,R1);
if(largest<R1-L1+1) largest=R1-L1+1;element=med;
if(L1-LL>largest) mode(LL,L1-1);
if(RR-R1>largest) mode(R1+1,RR);
}
//median用于找中位数,split用中位数将数组分2为段.



[此问题还有待解决,谢谢各位的参与!]


//首先在此文件夹下建立名为qingsongin2.txt的文件
//其内容为6 1 2 2 2 3 5 之格式.其中第一的数为数组表长度
#include<iostream>
#include<fstream>
#define MAXSIZE 20
using namespace std;

typedef int KeyLype;
typedef int Status;

typedef struct {
KeyLype key;
} RedType;
typedef struct {
RedType r[MAXSIZE + 1];
int length;
} SqList;

int SelectSort(SqList &L)
{
int i,j,t;
for(j=0;j<L.length;j++)
for(i=1;i<=L.length-j;i++)
if(L.r[i].key<L.r[i-1].key)
{
t=L.r[i].key;
L.r[i].key=L.r[i-1].key;
L.r[i-1].key=t;
}
return 0;
}//简单选择排序
int median(SqList L,int a,int b)
{
int med;
if((a+b)%2==0)
med=(a+b)/2;
else
med=(a+b-1)/2;
return med;

}

int L1(SqList L,int med)
{
while(med>=1&&med<=L.length)
{ if(L.r[med].key==L.r[med-1].key)
med--;
else
return med-1;
}
}

int R1(SqList L,int med)
{
while(med>=1&&med<=L.length)
{ if(L.r[med].key==L.r[med+1].key)
med++;
else
return med+1;
}
}

void mode(SqList L,int a,int b,int &max_num,int &max_count)
{
if(a==b)
return ;
else
{
int l1,r1;
int med,j,k;
k=j=med=median(L,a,b);
l1=L1(L,med);
r1=R1(L,j);
if(max_count<r1-l1-1)
{
max_count=r1-l1-1;
max_num=L.r[k].key;
}
if(l1-a+1>max_count)
mode(L,a,l1,max_num,max_count);
if(b-r1+1>max_count)
mode(L,r1,b,max_num,max_count);
}

}

int main()
{
ifstream fin("qingsongin2.txt");
ofstream fout("qingsongout2.txt");
SqList L;
int max_num;//众数
int max_count;//众数的个数


if (fin.fail())
{
cout<<"输入qingsongin2.txt文件出错!"<<endl;
return -1;
}

if (fout.fail())
{
cout<<"fout(\"qingsongout2.txt\");"<<endl;
return -2;
}
int n;//n是数组表的长度
fin>>n;
int i;
for(i=1;i<=n;i++)
//cin>>L.r[i].key;
fin>>L.r[i].key;
L.length=n;
//cout<<endl;
SelectSort(L);
mode(L,1,L.length, max_num,max_count);
//cout<<"众数是:"<<max_num<<endl;
//cout<<"重复次数是:"<<max_num<<endl;
fout<<"众数是:"<<max_num<<endl;
fout<<"它的个数是:"<<max_count<<endl;
cout<<"请查看此文件夹下的qingsongout2.txt文件"<<endl;
return 0;

}

但它的前提是已排好序的.
如果不排呢?又该怎样做?


[此贴子已经被作者于2007-10-30 21:31:29编辑过]

搜索更多相关主题的帖子: 众数 算法 讨论 
2007-10-27 11:27
TLZL
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-10-18
得分:0 
如果不涉及文件操作的话,这题就不难了

2007-10-27 11:58
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 

1.排序,然后线性搜索.

2.用2叉树来存储,

效率差不多,后者略优,直接在读文件时排序。

ps:不要重复法帖撒!


Fight  to win  or  die...
2007-10-27 12:34
lxtx
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-26
得分:0 
#include<iostream>
#include<fstream>
#include<sstream>
#include <vector>
using namespace std;
void main(){
vector<char> a;
vector<char> c;
char b;
int i=0,j=0,pos=0,n=0;
//-----------------------------
ifstream in("input.txt");
ofstream out("output.txt");
c.push_back(in>>b);
a.push_back(in>>b);
//-----------------------------
while(!in.eof()){
a.push_back(in>>b);
for(int m=0;m<j;m++)
if(c[m]!=b){
c.push_back(b);
j++;
}
i++;
}//----------------------------
for(int m=0;m<j;m++){
int n1=0;
for(int k=0;k<i;k++){
if(a[k]=c[m]) n1++;
}
if(n1>n){
n=n1;
pos=m;
}
}//----------------------------
out<<n<<endl<<c[pos];
}
2007-10-27 14:14
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
得分:0 
以下是引用TLZL在2007-10-27 11:58:09的发言:
如果不涉及文件操作的话,这题就不难了

难在读入的数据存储上


学好C++
2007-10-27 20:26
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1026
专家分:177
注 册:2007-5-10
得分:0 

hash

2007-10-28 01:16
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
得分:0 
5楼的代码好像不能通过啊

兵法的精要在于韬晦自己
2007-10-28 02:49
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
hash速度慢快的.
知道n就直接定义y=x的函数.

倚天照海花无数,流水高山心自知。
2007-10-28 11:23
slovey
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-6-16
得分:0 

这是算法...
但我还看不懂...


void mode(int LL,int RR)
{
int L1,R1;
int med=median(a,LL,RR);
split(a,med,LL,RR,L1,R1);
if(largest<R1-L1+1) largest=R1-L1+1;element=med;
if(L1-LL>largest) mode(LL,L1-1);
if(RR-R1>largest) mode(R1+1,RR);
}
//median用于找中位数,split用中位数将数组分2为段.

2007-10-28 16:34
slovey
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-6-16
得分:0 

如果不用递归.
程序如下:
#include<iostream>
#include <fstream>
#define N 6
using namespace std;

/*void mode(int LL,int RR)
{
int L1,R1;
int med=median(a,LL,RR);
split(a,med,LL,RR,L1,R1);
if(largest<R1-L1+1) largest=R1-L1+1;element=med;
if(L1-LL>largest) mode(LL,L1-1);
if(RR-R1>largest) mode(R1+1,RR);
}*/


int main()
{
ifstream fin("qingsongin.txt");
ofstream fout("qingsongout.txt");

if (fin.fail())
{
cout<<"输入qingsongin.txt文件出错!"<<endl;
return 1;
}

if (fout.fail())
{
cout<<"fout(\"qingsongout.txt\");"<<endl;
return 2;
}

/*int i, n, x;

fin>>n;
cout<<n<<" n 1 cout"<<endl;
fout<<n<<" n 1 cout"<<endl;

for(i=0; i<n;i++) {
fin>>x;
cout<<x<<" x 2 cout"<<endl;
fout<<x<<" x 2 fout"<<endl;
}
*/
int T[N];
// cout<<"请输入几个数字:"<<endl;
for(int j=0;j<N;j++)
fin>>T[j];
int num=T[0];//众数
int count=0;//众数的个数
int maxnum=num;
int maxcount=0;
for(int i=0;i<N;i++)
{
if(T[i]==num) count++;
else
{
if(maxcount<count)
{
maxnum=num;
maxcount=count;
}
num=T[i];
count=1;
}
}
fout<<"众数是:"<<maxnum<<endl;
fout<<"它的个数是:"<<maxcount<<endl;
//

return 0;
}

2007-10-28 20:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-181152-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.426549 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved