散列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;
}
}