使用场景

哈希匹配算法比较适合适用于多次对固定串内部匹配的算法。

预备理解

哈希匹配算法的原理是采用一种哈希函数将字符串映射成一个数字,之后就演化为两种方法:
第一种:假如数字相同,则去遍历匹配两串;
第二种:采用两种哈希函数,假如两组不同哈希映射后得到的数字相同则判断为字符能够匹配的上。
第二种方法的速度快但是存在误判即将不能够匹配的上判断为匹配的上,只是若是哈希函数设计的好这种概率会非常的低。

这里采用的哈希函数为:
K=(C0∗Base0+C1∗Base1+C3∗Base3+...)(modP)K=(C_0*Base^0+C_1*Base^1+C_3*Base^3+...) (mod P)K=(C0​∗Base0+C1​∗Base1+C3​∗Base3+...)(modP)
其中BaseBaseBase和PPP一般选择为素数

但是假如是求子串中(l,r)(l, r)(l,r)中位置的部分哈希映射后的值,则变为
K=(Cl∗Base0l+Cl+1∗Base1+Cl+2∗Base3+...)(modP)K=(C_l*Base^0l+C_{l+1}*Base^1+C_{l+2}*Base^3+...) (mod P)K=(Cl​∗Base0l+Cl+1​∗Base1+Cl+2​∗Base3+...)(modP)
但是很明显在预处理时只能处理出从头开始的字符,那么问题就变成了
K=(Cl∗Basell+Cl+1∗Basel+1+Cl+2∗Basel+3+...)/Basel(modP)K=(C_l*Base^{l}l+C_{l+1}*Base^{l+1}+C_{l+2}*Base^{l+3}+...)/Base^l (mod P)K=(Cl​∗Basell+Cl+1​∗Basel+1+Cl+2​∗Basel+3+...)/Basel(modP)
但是在外面整体求模后是不能直接除以BaselBase^lBasel,所以这里面涉及了求模的逆元的运算。

逆元

求模的逆元,代表这x∗x−1=1(modP)x * x^{-1}=1(modP)x∗x−1=1(modP),例如在mod7的情况下2就是4的逆元,因为(2 * 4)% 7 = 1,在里面就可以将除法算式转化为乘法算式,而如何求一个数在mod下的逆元呢,推理过程为:
x×x−1≡1(modP)令:P%x=rP=kx+rkx+r≡0(modP)kr−1+x−1≡0(modP)x−1≡−kr−1(modP)\begin{aligned} x\times x^{-1}&\equiv1\ (mod\ P) \\ 令:P\%x&=r \\ P &= kx+r \\ kx+r &\equiv0\ (mod\ P) \\ kr^{-1}+x^{-1} &\equiv0\ (mod\ P) \\ x^{-1} &\equiv-kr^{-1}\ (mod\ P) \end{aligned} x×x−1令:P%xPkx+rkr−1+x−1x−1​≡1 (mod P)=r=kx+r≡0 (mod P)≡0 (mod P)≡−kr−1 (mod P)​
很显然其中k=P/x,r=Pk=P/x,r=Pk=P/x,r=P%xxx

代码

下面就是通过哈希匹配算法进行字符串匹配的代码实现:

init()函数用来初始化逆元数组,Base数组以及前缀和数组。

通过两个哈希映射得到区间字符串的哈希值,比较两个哈希值即可判断字符是否相等。

字符串匹配算法之哈希匹配算法相关推荐

  1. 哈希匹配算法在单片机上的应用

    hash-match 哈希匹配算法在单片机上的应用 Github下载链接 hash-match设计前言 在单片机日常开发中,总会遇到根据收到的不同数据执行不同的程序,通常都会使用memcmp或者str ...

  2. Swift3.0语言教程获取字符串编码与哈希地址

    Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...

  3. 双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法

    双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法 一.理论描述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词 ...

  4. golang按key值进行升序排序(ksort),对字符串进行sha1哈希

    在对接PHP语言实现的签名的时候,看见对方用了ksort,由于golang里面对map的遍历是无序的,所以用golang实现了对map按key值进行升序排序: package mainimport ( ...

  5. LeetCode-791. 自定义字符串排序【哈希表,字符串,排序】

    LeetCode-791. 自定义字符串排序[哈希表,字符串,排序] 题目描述: 解题思路一:哈希表,我们首先遍历给定的字符串 order,将第一个出现的字符的权值赋值为 0,第二个出现的字符的权值赋 ...

  6. java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...

    ** 朴素模式匹配算法.kmp模式匹配算法.kmp模式匹配算法改进.java代码** 思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法 package edu.hubu.base ...

  7. redis的数据结构||1) 字符串类型2) 哈希类型3) 列表类型4) 集合类型 5) 有序集合类型详解

    2. 下载安装     1. 官网:https://redis.io     2. 中文网:http://www.redis.net.cn/     3. 解压直接可以使用:         * re ...

  8. LeetCode 1048. 最长字符串链(哈希+DP)

    文章目录 1. 题目 2. 解题 1. 题目 给出一个单词列表,其中每个单词都由小写英文字母组成. 如果我们可以在 word1 的任何地方添加一个字母使其变成 word2,那么我们认为 word1 是 ...

  9. Bzoj4598: [Sdoi2016]模式字符串 点分治 哈希

    国际惯例的题面: 这种关于树上路径的题,我也没什么好办法,只好点分治. 考虑当前分治重心为root,如何统计经过分治重心的路径的答案. 我们令prf[i]表示某个点到root的路径(不含root)已经 ...

最新文章

  1. 这才是面试官想听的:详解「递归」正确的打开方式
  2. jQuery之get方法
  3. FPGA管脚分配文件的保存
  4. Python 缩进问题-inconsistent use of tabs and spaces in indentation.原因及解决方法
  5. c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!
  6. 计算机基础及ms office应用,全国计算机等级考试一级计算机基础及MS Office应用模拟练习系统...
  7. pdf常用字体包 -baijiahao_PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
  8. 正则基础之——\b 单词边界
  9. ant4 多个form 验证_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...
  10. 小程序--计算正负数个数
  11. 快速学会php视频,PHP视频从入门到精通---适合PHP初学者
  12. Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中,实现查询的方法...
  13. 怎么把Word转PDF格式?分享几种好用的转换方法
  14. Springcloud OAuth 授权码踩坑系列(二)
  15. C#使用Microsoft.Office.Interop.Word操作word书签位置插入Wingdings 2复选框
  16. css3 图片阴影、翘边效果
  17. js脚本根据身份证号获取性别、年龄、家庭地址、生日
  18. php ssl 465,帝国CMS邮件无法发送 SSL465端口无法发送的问题解决办法
  19. 细菌觅食算法BFOA
  20. 背景是不规则图案css,CSS3 实现花式背景图案

热门文章

  1. 2019已落幕,2020再出发
  2. 数学基础(高数、线代、概率论、统计学等等)
  3. Sofia nua模块--高层UA库
  4. tensorflow报错:AttributeError: 'module' object has no attribute 'get_or_create_global_step'
  5. 2-6 CAD基础 移动(move)
  6. java前锋,编程语言世界里的最佳“11人”
  7. python求解矩阵_python矩阵运算
  8. 如何才能最大限度发挥大数据的价值?
  9. python处理杂乱无章的文本
  10. Word海报随意排版、链接文本框有妙招