哈希表模板 |
您所在的位置:网站首页 › 模数一般分为 › 哈希表模板 |
哈希表
把大的区间映射到小的区间,一般为0~N x∈(-109,109) x mod 105∈(0,105) 模数一般要取成质数,且该质数要离2的整数次幂尽可能远,这样冲突的概率是最小的。 可能出现冲突,按冲突的处理方式可分为两种 存储结构
2.拉链法 类似于邻接表 #include #include using namespace std; const int N=100003;//n为大于范围的第一个质数 int h[N];//存放链表头结点,没有则为-1; e[N],ne[N]; int idx=0; void insert(int x){//头插法 int k=(x%N+N)%N; e[idx]=x; ne[idx]=h[k]; h[k]=idx++; } bool query(int x){ int k=(x%N+N)%N; //这里注意不等于(x+N)%N //数学里-10%3=2, c++里 -10%3=-1 //为了让(x+N)%N不为负数, for(int i=h[k];i!=-1;i=ne[i]){ if(e[i]==x)return true; } return false; } int main(){ int n; scanf("%d",&n); memset(h,-1,sizeof(h)); //初始时哈希表为空 for(int i=0;i insert(x); }else{ bool ans=query(x); if(ans)puts("Yes"); else puts("No"); } } return 0; }常用操作: 1.添加 2.查找 3.删除 一般不会真的删除,只会开一个bool数组标记 字符串哈希方式字符串前缀哈希法 1.定义某一前缀的哈希值:定义方法:把字符串看成是一个p进制的数,每一位字母表示p进制数的每一位数字,把字符串转化为数字 注意: 不能把字母映射为0,会把不同字符串映射成同样数字,是不对的 假定人品足够好,不存在冲突,完全不考虑冲突的情况 一般P取131或13331,Q取264 2.对于某一字符串,先预处理出所有前缀的哈希 相对KMP来讲除了不能求循环结,其他都可 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |