数据结构--哈希表
作者:互联网
哈希表的主要作用:
把一个庞大的空间或值域映射到一个比较小的空间(10^5~10^6)
映射做法:x%(10^5~10^6);同时,取模的数要取成一个质数可以使冲突的概率最小。
因为值x的范围(10^9)比较大,映射的范围(10^5~10^6)比较小,所以可能会产生冲突(把若干不同的数映射成同一个数)
一、存储结构
题目:例题--哈希表(模拟散列表)_宋菜菜的博客-CSDN博客
1、开放寻址法
开一个比题目数据范围大2~3倍的数组(防止冲突),每一个值x插入或查找时,通过find函数返回值x需要插入或查找的下标。
int find(int x)//返回值x的下标
{
int k=(x%N+N)%N;//如果x为负数(如-10^9),需要变成正数;
while(h[k]!=null&&h[k]!=x)
{
k++;
if(k==N) k=0;
}
return k;
}
2、拉链法
开三个数组h[],e[],ne[](e[]和ne[]分别代表单链表的值的存储数组和next数组),通过h[]的下标实现值x的插入和查找操作。
void insert(int x)//将值x插入
{
int k=(x%N+N)%N;
e[idx]=x; //单链表
ne[idx]=h[k];
h[k]=idx++;
}
bool find(int x)//查找值x(存在返回true,不存在返回false)
{
int k=(x%N+N)%N;
for(int i=h[k];i!=-1;i=ne[i])
if(e[i]==x) return true;
return false;
}
二、字符串哈希方式
1、字符串前缀哈希法
预处理出所有前缀的哈希(数组h[i]表示前i个字母的哈希值)
1)把字符串哈希成一个数字(如何定义某一个前缀的哈希值?)
把字符串看成P进制的数
当P=131或13331,Q=2^64时,一般情况下不会出现冲突。把字符串的哈希值h[]定义成无符号长整型(超出范围就会溢出),相当于进行取模。
2)计算出任意子串的哈希值(如l~r之间的子串):h[r]-h[l-1]*p[r-l+1]。
因为子串是从高位到低位的,h[l-1]中1~l-1之间的子串和h[r]中1~l-1之间的子串不一样。
标签:子串,10,--,x%,int,哈希,字符串,数据结构 来源: https://blog.csdn.net/qq_63930662/article/details/122848400