首页 > 编程知识 正文

中位数计算器,中位数计算得分

时间:2023-05-06 14:48:00 阅读:277005 作者:4400

题目

中位数计算。选择你熟悉的编程语言实现教材P31上公式(2.3)的算法,用于估算大量数据的中位数。下载测试数据文件(1百万条数据,中位数为49899),选择不同的区间大小(width),考察计算结果与真实中位数的误差。

公式

代码实现 matlab clear all;clc;N = 1000000;width = 100; %区间长度[a] = textread('rand1m.txt','%d');%此处可直接使用median(a)求出中位数49899max = max(a); %用其他语言的话,最值可用冒泡排序求出min = min(a);num = (max - min) / width;num = round(num); %向上取整count = zeros(num,1); %保存各区间的个数%计数for i = 1:N count(floor((a(i)-min)/width+1)) = count(floor((a(i)-min)/width+1)) + 1;end%确定中位数所在的区间位置index%计算该区间以前的频数和sigmasigma = 0;index = 1;while N/2-sigma>0 sigma = sigma + count(index); index = index +1; endindex = index -1;sigma = sigma - count(index);%根据公式计算中位数L1 = min + width*(index-1);median = L1 +((N/2-sigma)/count(index)) * width;median = fix(median); C #include<stdio.h>const int width=100; //区间长度void main(){ FILE *fp1,*fp2; int a,max=2000,min=2000,N=0,median; if( (fp1 = fopen("rand1m.txt","r"))==NULL ) printf("error"); //取出最大值与最小值 while(fscanf(fp1,"%d%*[^0-9]",&a)>0){ if(a>=max) max = a; if(a<=min) min = a; N++; } fclose(fp1); int num = (max - min) / width +1; //区间个数 int* count = new int[num]; //区间频数 for(int i=0; i<num; ++i) count[i]=0; if( (fp2 = fopen("rand1m.txt","r"))==NULL ) printf("error"); //计数 while(fscanf(fp2,"%d%*[^0-9]",&a)>0){ count[(a-min)/width]++; } fclose(fp2); //确定区间index 统计index前所有区间频数和sigma int sigma = 0; int index = 0; while(N/2 - sigma >0){ sigma += count[index]; index ++; } index --; sigma -= count[index]; //套用公式 int L1 = min + width*index; //区间下限 double rate = (1.0) * (N/2-sigma) / count[index]; median = L1 + rate * width; printf("L1=%dnmedian=%dn",L1,median);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。