华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 957|回复: 0
打印 上一主题 下一主题

字符串哈希技术

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2020-2-18 14:01:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
即将一个字符串转化成一个整数,并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复出现过。
考试使用这种方法效率很高,不用写教复杂的KMP算法。
(如果直接把string当做键,则每次在map中查找时要一个一个字符地找,跟存在数组中每区别,比较数值当然更快。)

由哈希函数的性质,对于一个字符串:S=s1s2...sn,我们把每个字符转换成idx(si)=si-'a'+1 当然直接用字符串的ASCII码表示也可以,则哈希模型为Hash(i)=Hash(i-1)*p+idx(si),其中p为素数。最终算出的Hash(n)作为该字符串的哈希值。所以构造哈希函数的关键点在于使不同字符串的哈希冲突率尽可能小。下面介绍几种哈希函数:

1、自然溢出方法:利用unsigned long long 自然溢出,相当于自动对2^64−1取模
     定义哈希函数:unsigned long long hash[n];
     公式:Hash(i) = Hash(i-1)*p+idx(si)
2、单哈希方法
     公式:Hash[i] = (Hash[i-1]*p+idx(si))%mod
     p,mod均为质数,p<mod,p,mod取尽量大时冲突很小
3、双哈希方法:将字符串用不同mod单哈希两次,结果用二元组表示
     Hash1(i) =(Hash1(i-1)*p+idx(si))%mod
     Hash2(i) =(Hash2(i-1)*p+idx(si))%mod
     Hash[i]:<Hash1[i],Hash2[i]>
     这种方法很安全,清北学堂讲课的大神说 好像还没有一个被卡的例子。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 12:23 , Processed in 0.094927 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表