大数据时代来临,现在好多面试都有大数据题目,下面大家一起来看一道大数据题目吧
题:
文件中产生100000 (十万)个随机数字,数字的取值范围0~32767 , 按如下要求实现,在实现过程中能够使用的数组最长为10000 ,个别变量的内存忽略。找到重复次数最多的那个数字(如果有多个,选择任意一 个)
乍一看这个题我们可能这个数字庞大难以下手,这个题我的思路就是创建一个长度32767的数组,用数组下标保存出现的数字,用数组中每一个下标的所对应的元素保存该数字出现的次数,(大家有没有发现这个和我们前几天学的顺序表刚好相似)然后利用循环遍历数组来比较出现次数最多的那一个,但是题目中给我了限制数组长度为了10000,我们的32767的长度肯定无法创立,所以面对这种情况我们该怎么办呢?他不让我们建立大数组我们可以建立四个小数组,然后比较出四个中的最大就好了,还有一个问题就是我们应该如何验证我们所计算出来的数据呢?我们可以就建立一个大小32767的数组和那4个小数组的进行比较,如果我们的结果相同那就证明我们准确,下面我来给大家展示我谱写的代码
#include "stdio.h"
#include "stdio.h"
#include "stdlib.h"
#include "assert.h"
#define num 1000000
typedef struct Max
{
int data;
int times;
}Max;
void file(char*path)//建立文件存放数据
{
FILE *fw=fopen(path,"wb");//wb:打开或者新建一个二进制文件,只允许读;
assert(fw!=NULL);
int tmp;
for(int i=0;i<num;i++)
{
tmp=rand();
fwrite(&tmp,sizeof(int),1,fw);
}
fclose(fw);
}
Max verify(char*path)//使用一个大的的数组进行计算,为了和后面的四个数组的结果进行对比
{
FILE *fr=fopen(path,"rb");//rb:用读写方式打开二进制文件;
assert(fr!=NULL);
int *arr=(int*)calloc(RAND_MAX+1,sizeof(int));//RAND_MAX是rand函数返回值刚好是32767,calloc动态数组置0;
int tmp;
Max a={0,0};
while(fread(&tmp,sizeof(int),1,fr)>0)
{
arr[tmp]++;//动态数组arr下标保存数字,值代表出现次数;
}
for(int i=0;i<RAND_MAX+1;i++)
{
if(a.times<arr[i])
{
a.times=arr[i];
a.data=i;
}
}
fclose(fr);
free(arr);
return a;
}
Max part(char*path)
{
int len=RAND_MAX/4+1;
int *arr=(int*)calloc(len,sizeof(int));
FILE *fr=fopen(path,"rb");
assert(fr!=NULL);
int tmp;
Max b={0,0};
while(fread(&tmp,sizeof(int),1,fr)>0)
{
arr[tmp/4]++;//避免数组越界所以/4
}
for(int i=0;i<len;i++)
{
if(b.times<arr[i])
{
b.data=i*4+i%4;//还原除4之前的数字
b.times=arr[i];
}
}
fclose(fr);
free(arr);
return b;
}
Max part2(char *path)
{
char *path1 = "E:\\1.txt";//余数为0
char *path2 = "E:\\2.txt";//余数为1
char *path3 = "E:\\3.txt";//余数为2
char *path4 = "E:\\4.txt";//余数为3
FILE *fr = fopen(path,"rb");
FILE *fw1 = fopen(path1,"wb");
FILE *fw2 = fopen(path2,"wb");
FILE *fw3 = fopen(path3,"wb");
FILE *fw4 = fopen(path4,"wb");
assert(fr!=NULL&&fw1!=NULL && fw2!=NULL && fw3!=NULL&&fw4!=NULL);
int tmp;
while(fread(&tmp,sizeof(int),1,fr) > 0)// 将原文件中的数据散列到4个不同的文件中
{
if(tmp%4==0)
{
fwrite(&tmp,sizeof(int),1,fw1);
}
else if(tmp%4==1)
{
fwrite(&tmp,sizeof(int),1,fw2);
}
else if(tmp%4 == 2)
{
fwrite(&tmp,sizeof(int),1,fw3);
}
else
{
fwrite(&tmp,sizeof(int),1,fw4);
}
}
Max arr[4];
arr[0] = part(path1);
arr[1] = part(path2);
arr[2] = part(path3);
arr[3] = part(path4);
int max= 0;//保存次数最多的数据的下标
for(int i=0;i<4;i++)
{
if(arr[max].times < arr[i].times)
{
max = i;
}
}
fclose(fr);
fclose(fw1);
fclose(fw2);
fclose(fw3);
fclose(fw4);
return arr[max];
}
int main()
{
char *path = "E:\\big data.txt";
file(path);
Max tmp = verify(path);
Max tmp2 =part2(path);
printf("数字是=%d,出现次数=%d\n",tmp.data,tmp.times);
printf("数字是=%d,出现次数=%d\n",tmp2.data,tmp2.times);
return 0;
}
大家有没有觉得其实大数据题也就是纸老虎,就是看起来不好处理,其实也没那么困难(当然也有可能是我太聪明。)