哈希表
哈希就是将某种类型的值映射到同种类型或其他类型的值。可以做到在常数时间内查询。
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足够大,那么这样做结果一定是正确的。