散列hash初步

散列的思想是将某个元素尽可能唯一地映射到一个整数,即用一个数唯一地表示一个元素。

实例1:
查找m个数在n个数中是否出现。
例如n=5的数组{1,2,3,4,5},查找m=3的3个数{1,2,0},则1和2存在,0不存在。

实例2:
查找m个数在n个数中出现的次数。
例如n=5的数组{1,2,2,3,5},查找m=2的2个数{1,2},则1出现了1次,2出现了2次。

思路:
一个典型的空间换时间的思路,就是用一个足够大的数组,此处设为hashTable[],用它覆盖所有可能的数,对每个数x,hashTable[x]表示它的性质。
例如,输入数字的范围为0~9999共10000个数,则初始化为一个数组hashTable[10000]。对于数字N,hashTable[N]表示它的性质。
这样,在依次读入n个数时就可以对每个数字N做预处理,直接将hashTable[N]设定为相应的状态。查询时读取hashTable[N]即可。

对于实例1,可令hashTable的类型为bool,hashTable[N]为true表示该数出现,false表示未出现。初始时,hashTable[]全部为false,每读到一个数字N,将hashTable[N]设为true。
对于实例2,可令hashTable的类型为int。初始时,hashTable[]全部0。每读到一个数字N,将hashTable[N]+1。

代码:

#include <iostream>
using namespace std;

//bool hashTable[10000] = { false };
int hashTable[10000] = { 0 };

int main()
{
	int n, m, x;
	cin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		cin >> x;
		hashTable[x] = true;
		//++hashTable[x];
	}
	for (int i = 0; i < m; ++i)
	{
		cin >> x;
		//cout << hashTable[x];
		if (hashTable[x] == true)
			cout << "YES";
		else
			cout << "NO";
		cout << endl;
	}
}
posted @ 2021-01-20 15:23  MorpheusDong  阅读(56)  评论(0编辑  收藏  举报