一道关于大数据面试题(1)

      大数据时代来临,现在好多面试都有大数据题目,下面大家一起来看一道大数据题目吧

题:

       文件中产生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;
}

大家有没有觉得其实大数据题也就是纸老虎,就是看起来不好处理,其实也没那么困难(当然也有可能是我太聪明。)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章