哈希表

哈希就是将某种类型的值映射到同种类型或其他类型的值。可以做到在常数时间内查询。

c++ STL中提供的map,就可以作为哈希表使用。

1 #include<iostream> //使用pair
2 #include<map>
3 using namespace std;
4 map<int,int> mp;
5 mp.insert(pair<int,int>(x,y)) //插入数对(x,y)
6 mp.count(x) //查询是否出现过关键字x,是返回1,否返回0
7 mp[x]=y; //可以像数组一样,通过关键字直接使用
8 //若关键字未出现过,则mp[x]是该类型默认值
9 mp.clear() //清空map

但是时间复杂度不低,是O(nlogn)的。还可以自己实现哈希表,在这里直接放一种比较不错的方法。

 1 int h[p]; //p是一个较大的质数,通常不小于1e7
 2 //初始化h数组为-1
 3 void insert(int x) {
 4     int i=x%p;
 5     while(h[i]!=-1&&h[i]!=x) {++i;if(i==p) i=0;}
 6     h[i]=x;
 7 }
 8 int query(int x) {
 9     int i=x%p;
10     while(h[i]!=-1&&h[i]!=x) {++i;if(i==p) i=0;}
11     if(h[i]==x) return 1;
12     else return 0;
13 }

通过取模得到一个位置,如果是空的,那么把数放上去就行,否则向后找,直到找到一个空位置,放上去;查询时也是如此。

一般来说,当p超过一千万时,冲突的概率就很小,因此每次操作的时间近似常数,而且只要p足够大,那么这样做结果一定是正确的。

原文地址:https://www.cnblogs.com/Mr94Kevin/p/9746631.html