标签:子串 10 -- x% int 哈希 字符串 数据结构
哈希表的主要作用:
把一个庞大的空间或值域映射到一个比较小的空间(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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。