哈希表(字符串哈希)

本文探讨如何计算字符串的哈希值,将字符串转换为十进制数并模一个较小的数Q以减小存储需求。举例说明,如字符串'ABCD',通过特定的算法减少哈希冲突。此外,介绍了使用哈希数组h[]存储字符串前缀哈希值的方法,以及如何利用前缀哈希计算任意子串的哈希值。文章提供了相关题目和代码供进一步理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何求字符串哈希?

举例子:求字符串"ABCD"的哈希值,"ABCD"字符串看成是P进制的(1234)p,其对应的十进制数就是1*p^3+2*p^2+3*p^1+4*p^0,这样就可以把一个字符串转化为一个数字。但是这个数字可能比较大不好存储,所以要对这个数字模一个比较小的数Q,通过取模就可以把这个数即这个字符串映射到0~Q-1之间的一个数。

注意:

1.不能把字母映射成0。例如:A如果映射成0, A (0)p=0,AA (00)p=0 不对

2.减少哈希冲突:经验值p=131或13331,Q=2^64 这种情况基本不会发生哈希冲突

字符串前缀哈希:

用一个数组h[]存储字符串前缀的哈希值。例如:"ABCDEFG" ,h[0]=0,h[1]="A"的哈希值,h[2]="AB"的哈希值,h[3]="ABC"的哈希值······

前缀哈希计算任意一个子串的哈希值公式:

已知h[l-1]和h[r],计算l~r段的哈希值:h[r]-h[l-1]*p^(r-l+1)

题目:

代码:

#include <iostream>
#inclu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值