1. 程式人生 > >[Hash]統計數字

[Hash]統計數字

題目大意

給定n個數,每個數均不超過1.5*109,統計這些數各自出現的次數,並按照從小到大的順序輸出統計結果。

題目解析

資料規模有1.5*109,所以雜湊關鍵字本身作為地址會爆

所以想到用雜湊表
除了記錄某個S是否出現,還要記錄出現的次數,所以可以用一個二維陣列,加一個儲存出現次數的即可。

完後,將雜湊表裡的數放在一個新開的陣列,排序後輸出

#include<iostream>
#include<cstdio>
#include<algorithm>
#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.x<b.x;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
	  scanf("%d",&x);
	  int t=loc(x);
	  a[t][0]=x;
	  a[t][1]++;//次數+1 
	}
	for(int i=1;i<p;i++)
	 if(a[i][1]>0)
	 {
	   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<<ans[i].x<<" "<<ans[i].n<<endl;
}