大数据处理

先在0-10以内的数字找到其中重复次数最多数字

先让一个数组长度为十,让0到10的数字每出现一次就让数组中对应下标的数字加一

定义一个结构体让结构体定义一个整型一个保存现在出现次数最多的数字另一个保存出现最多数字的次数

定义结构体代码如下

typedef struct Hash
{
	int num;
	int times;
}Hash;

然后输出结构体中的代表 最多次数的数字 和 最多次数的数字的次数的两个值
代码如下
void GetMaxTimes0(int *arr,int len)
{                    
	int brr[10] = {0};//数据出现的范围
	Hash h = {0}; //保存出现次数最多的数字及次数
	for(int i=0;i<len;i++)//遍历arr
	{
		brr[arr[i]]++;
	}
	for(int i=0;i<10;i++)//遍历brr
	{
		if(brr[i] > h.times)
		{
			h.num = i;
			h.times = brr[i];
		}
	}

	printf("数字=%d,次数=%d\n",h.num,h.times);
}
但是这只在小范围数字中才有效,如果数字范围太广遍历时间就会太长
可以通过哈希和归并来解决  

哈希的除留余数 让遍历得到的数字余一个数等于这个数的放在一起比较  代码如下
void GetMaxTimes(int *arr,int len)
{
	int brr[5] = {0};//数据出现的范围
	Hash h0 = {0}; //保存出现偶数次数最多的数字及次数
	Hash h1 = {0};//保存出现奇数次数最多的数字及次数
	int i;
	for(i=0;i<len;i++)//处理x%2 == 0的数据
	{//0,2,4,6,8->0,1,2,3,4
		if(arr[i]%2 == 0)
		{
			brr[arr[i]/2]++;
		}
	}
	for(i=0;i<5;i++)
	{
		if(brr[i] > h0.times)
		{
			h0.times = brr[i];
			h0.num = i*2;//将下标还原原有的数字
		}
	}

	memset(brr,0,5*sizeof(int));

	for(i=0;i<len;i++)//处理x%2 == 1的数据
	{//1,3,5,7,9->0,1,2,3,4
		if(arr[i]%2 != 0)
		{
			brr[arr[i]/2]++;
		}
	}


	for(i=0;i<5;i++)
	{
		if(brr[i] > h1.times)
		{
			h1.times = brr[i];
			h1.num = 2*i+1;
		}
	}

	h0 = (h0.times>h1.times) ? h0 : h1;
	printf("数字=%d,次数=%d\n",h0.num,h0.times);
}
或者可以把这些数字每几个放一起比较得出来的在进行比较  代码如下
void GetMaxTime(const char *path)
{
	FILE *fr = fopen(path,"rb");
	assert(fr != NULL);
	int brr[10] = {0};
	Hash h = {0,0};
	int tmp;
	while(fread(&tmp,sizeof(int),1,fr) > 0)//等同arr
	{
		brr[tmp]++;
	}

	for(int i=0;i<10;i++)
	{
		if(brr[i] > h.times)
		{
			h.num = i;
			h.times = brr[i];
		}
	}

	fclose(fr);

	printf("数字=%d,次数=%d\n",h.num,h.times);
}
通过随机数来建立一个大小为一万的数字库
void CreateNum(const char *path)
{
	FILE *fw = fopen(path,"wb");
	assert(fw != NULL);

	int tmp;
	for(int i=0;i<NUM_SIZE;i++)
	{
		tmp = rand()%10;
		fwrite(&tmp,sizeof(int),1,fw);
	}

	fclose(fw);
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值