哈希表小结

哈希表

存储结构:
1. 开放寻址法
2. 拉链法

字符串哈希用途

利用字符串前缀哈希方法快速判断同一个字符串两个不同区间的字符串是否相等.
如果hash值相等则认为两个区间的字符串相同,否则不相等

时间复杂度 O ( 1 ) O(1) O(1)

主要步骤

step1: 把字符串看成P进制数
**step2:**预处理字符串所有的前缀hash值, hash[i] = (hash[i - 1] * P + str[i]) mod Q
**step3: **计算区间hash值hash[l, r] = hash[r] - hash[l-1] * p[r - l + 1]

前人经验:P一般取 131 或者 13331, Q 取 $2 ^ {64} $, 冲突概率小

主要注意点

**技巧:**由于 Q 取 2 64 2^{64} 264次方,可以直接用 unsigned long long 存 h[N]、p[N], 相当于取模
**注意:**计算时候需要用到 P的 n次方,需要预处理,p[0] = 1

代码模板

typedef unsigned long long ULL;
const int P = 131;//P进制
ULL h[N], p[N];//p[i] 表示 p 的 i 方.

//计算指定区间字符串的哈希值
ULL get_hash(int l, int r)
{
    return h[r] - h[l-1] * p[r - l + 1];
}

p[0] = 1;
for(int i = 1; i <= n; i++)
{
    p[i] = p[i - 1] * P;//计算p的i方
    h[i] = h[i - 1] * P + str[i];//计算下标以i为结尾的子串的哈希值
}

主要应用

字符串哈希

reference

哈希表是一种重要的数据结构,用于实现快速查找。在电话簿查询系统中,哈希表可用于存储电话号码和对应的联系人姓名等信息。本次实验中,我们采用了线性探测法解决哈希表中的冲突问题。 线性探测法是指当哈希表中某个槽已经被占用时,继续往后探测,直到找到一个空槽为止。我们可以通过一个叫做“探测长度”的变量来记录需要探测的距离,以免陷入死循环。 在实现哈希表时,我们需要考虑以下几个问题: 1. 哈希函数的设计:哈希函数决定了元素在哈希表中的位置。一个好的哈希函数需要满足以下几个条件:均匀性、高效性、容易实现。 2. 哈希表的大小:哈希表的大小需要根据实际情况进行调整,通常需要考虑数据规模和内存限制等因素。 3. 冲突解决方法:哈希表中可能会存在冲突,我们需要采用合适的方法解决。 在本次实验中,我们使用了C语言实现了一个简单的电话簿查询系统。具体实现过程如下: 1. 定义了一个哈希表结构体,包含了哈希表的大小、元素个数、哈希函数和数据数组等信息。 2. 实现了一个简单的哈希函数,将字符串转换为一个整数作为哈希值。 3. 采用线性探测法解决了哈希表中的冲突问题。 4. 实现了插入、删除和查找等操作。 5. 最后,我们对实验进行了测试,并得出了一些结论。例如,随着哈希表大小的增加,查询时间逐渐减少,但空间占用也会增加。 总的来说,本次实验让我们更加深入地理解了哈希表和线性探测法,并提高了我们的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

soyisou

您的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值