小项目——大数据处理

来源:互联网 发布:天翼合伙人软件 编辑:程序博客网 时间:2024/05/21 17:51


之前上课的时候老师给我们留下一个作业,自己写一个大数据的处理,题目分为三部分


1、0-9的数字,统计0-9出现次数最多的数字。可以定义10个计数器

2、数组最大可以定义5个计数器,怎么做?

3、1000个范围在0-9的数据从文件中读取,将奇数放到一个文件,将偶数放到另一个文件中,怎么做?


留下这三个问题,让我们自己思考。

下面就是对这三个问题的解答:

1、代码实现

#include <stdio.h>typedef struct Data{int num;//数字int times;//数字出现的次数}Data;//大数据//arr存放的数据范围0~9,//统计arr中出现次数最多的数字Data TimesMax(int *arr,int len){int brr[10] = {0};//计数器,0~9//brr[0]是0的计数器//......//brr[9]是9的计数器for(int i=0;i<len;i++){brr[arr[i]]++;//哈希表,数据和存放数据的位置有关系}Data da;da.num = 0;da.times = brr[0];for(int i=1;i<10;i++){if(da.times < brr[i]){da.times = brr[i];da.num = i;}}return da;}int main(){int arr[] = {0,2,1,5,7,9,1,2,1,5,1,6,1,7,8,1,2,1,3,0,9,1,6,1,8};//数据范围0~9Data d = TimesMax(arr,sizeof(arr)/sizeof(arr[0]));printf("数字=%d,次数=%d\n",d.num,d.times);//1,9return 0;}


2、代码实现

#include <stdio.h>typedef struct Data{int num;//数字int times;//数字出现的次数}Data;//大数据//arr存放的数据范围0~4,//统计arr中出现次数最多的数字Data TimesMax(int *arr,int len){int brr[5] = {0};//计数器,0~4//brr[0]是0的计数器//......//brr[4]是4的计数器Data da;for(int j = 0;j < 2;j++){for(int i=0;i < len;i++){if(arr[i] < 5 * (j + 1) && arr[i] > 5 * j){brr[arr[i]]++;}}if(j == 0){da.num = 0;da.times = brr[0];}for(int i = 0;i < 5;i++){if(da.times < brr[i]){da.times = brr[i];da.num = i;}}}return da;}int main(){int arr[] = {0,2,1,5,7,9,1,2,1,5,1,6,1,7};//数据范围0~9Data d = TimesMax(arr,sizeof(arr)/sizeof(arr[0]));printf("数字=%d,次数=%d\n",d.num,d.times);//1,9return 0;}

3、代码实现

#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <time.h>#define NUM 1000000#define ITEM_NUM 10000#define AMOUNT 4 //分组数typedef struct Data{int num;//数字int times;//数字出现的次数}Data;//得到哈希文件path中的重复次数最多的数据static Data TimesMaxHash(const char *path){FILE *fr = fopen(path,"rb");assert(fr != NULL);int arr[ITEM_NUM] = {0};int tmp;while(fread(&tmp,sizeof(int),1,fr) > 0){arr[tmp/AMOUNT]++;}fclose(fr);Data d = {0,0};for(int i=0;i<ITEM_NUM;i++){if(d.times < arr[i]){d.times = arr[i];d.num = AMOUNT*i + tmp%AMOUNT;}}return d;}//数据范围0~32767,但是能使用的数组10000长度//需要分成4部分Data TimesMax(const char *path){FILE *fr = fopen(path,"rb");assert(fr != NULL);FILE *fwArr[4];char pathArr[AMOUNT][100];int i;for(i=0;i<AMOUNT;i++)//生成临时文件文件名{sprintf(pathArr[i],"%d.txt",i);fwArr[i] = fopen(pathArr[i],"wb");assert(fwArr[i] != NULL);}int tmp;while(fread(&tmp,sizeof(int),1,fr) > 0){fwrite(&tmp,sizeof(int),1,fwArr[tmp%AMOUNT]);}fclose(fr);for(i=0;i<AMOUNT;i++){fclose(fwArr[i]);}Data d[AMOUNT];for(i=0;i<AMOUNT;i++){d[i] = TimesMaxHash(pathArr[i]);}for(i=0;i<AMOUNT;i++){remove(pathArr[i]);}int maxIndex = 0;for(i=1;i<AMOUNT;i++){if(d[maxIndex].times < d[i].times){maxIndex = i;}}return d[maxIndex];}//创建一个path文件,并生成NUM个0~9之间的数字void CreateFile(const char *path){FILE *fw = fopen(path,"wb");assert(fw != NULL);int tmp;srand(time(NULL));for(int i=0;i<NUM;i++){tmp = rand();//0~32767fwrite(&tmp,sizeof(int),1,fw);}fclose(fw);}int main(){char *path = "big.txt";CreateFile(path);Data d = TimesMax(path);printf("数字:%d,次数:%d\n",d.num,d.times);return 0;}












原创粉丝点击