欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

散列

程序员文章站 2022-03-15 21:35:43
...

散列的定义与整数散列

问题一

给N个整数数,再给出M个整数,问这个M个数中的每个数分别是否在N个数中出现过,其中N,M

<=10510^5 ,且对所有正整数均不超过10510^5 。例如N=5,M=3,N个正整数为{8,3,7,6,2},欲查询的M个正整数为{7,4,2},于是后者中只有7和2在N个正整数中出现过,而4是没有出现过的。

思路:用空间换时间
#include<iostream>
using namespace std;
const int maxn=100010;
bool hashTable[maxn]={false};
int main()
{
	int n,m,x;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%d", &x);
		hashTable[x]=true;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>x;
		if(hashTable[x]==true) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
 } 

同样的,如果题目要求M个欲查询的数中每个数在N个数中出现的次数,那么可以把hashTable数组替换为int型,然后在输入N个数时进行预处理,即当输入的为x时,就令hashTable[x]++,这样就可以用O(N+M)的时间复杂度输出每个欲查询的数出现的次数。代码如下:

#include<iostream>
using namespace std;
const int maxn=100010;
//bool hashTable[maxn]={false};
int hashTable[maxn]={0};
int main()
{
	int n,m,x;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		hashTable[x]++;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>x;
		cout<<hashTable[x]<<endl;
	}
	return 0;
}
相关标签: 算法积累