[Hash]统计数字

题目大意

给定n个数,每个数均不超过1.5*109,统计这些数各自出现的次数,并按照从小到大的顺序输出统计结果。

题目解析

数据规模有1.5*109,所以散列关键字本身作为地址会爆

所以想到用哈希表
除了记录某个S是否出现,还要记录出现的次数,所以可以用一个二维数组,加一个存储出现次数的即可。

完后,将哈希表里的数放在一个新开的数组,排序后输出

#include
#include
#include
#define h(x) x%p
#define p 1000007//质数 
using namespace std;
struct A
{
	int x,n;
}ans[p];
int n,x,a[p][2],num;
//a[x][0] 记录哈希函数值为x的S值,a[x][2] 记录这个 S 值出现了几次
int loc(int x)
{
	int k=h(x),i=0;
	while(a[(k+i)%p][0]!=0&&a[(k+i)%p][0]!=x)
	 i++;
	return (k+i)%p;
}//查找关键字在哈希表的位置 
bool cmp(A a,A b)
{
	return a.x0)
	 {
	   ans[++num].x=a[i][0];
	   ans[num].n=a[i][1];
	 }
	sort(ans+1,ans+1+num,cmp);//快速排序 
	for(int i=1;i<=num;i++)
	 cout<

你可能感兴趣的:([Hash]统计数字)