学习笔记-Rabin-Karp哈希
在数学一本通上看过这两人名字,现在又出现了...
思想:
用一个整数表示一个字符串
\(w_{str}\)=(\(a_0\) \(p^{n-1}\)+\(a_1\) \(p^{n-2}\)+...+\(a_{n-1}\) \(p^0\)) (\(MOD\) \(q\))
注意:
字符转换成\(a_n\)时最好不要转为0,例如遇到"a","aa","aaa"的情况
优越之处:
我们可以在O(1)内取出任意子串的Hash值
怎么实现?
- 记录下所有前缀的Hash值
我们知道
\(w_{pre_{i-1}}\) \(=(\) \(a_0\) \(p^{i-1}\)+\(a_1\) \(p^{i-2}\)+...+\(a_{i-1}\) \(p^0\)) (\(MOD\) \(q\))
\(w_{pre_{j}}\) \(=(\) \(a_0\) \(p^{j}\)+\(a_1\) \(p^{j-1}\)+...+\(a_{j}\) \(p^0\)) (\(MOD\) \(q\))
所以
- \(w_{str_{i,j}}\)
\(=(\) \(a_i\) \(p^{j-i}\)+\(a_{i+1}\) \(p^{j-i-1}\)+...+\(a_{j}\) \(p^0\))
\(=\) \(w_{pre_{j}}\) \(-\) \(w_{pre_{i-1}}\) \(p^{j-i+1}\) (\(MOD\) \(q\))
然而....
在做TJOI2017 DNA时我发现取模太慢了,不如用unsigned long long自然溢出,这样一下就快了很多。
同时还有一个优化技巧,预处理出p值的幂,这样也能快不少。
应用:
字符串匹配
思路:
和KMP一样是\(O(N+M)\)的时间复杂度,只需要遍历文本串比较哈希值就可以了。
题目:
这个比较多应该都找得到
求最长公共前缀(Longest Common Prefix):
给定两个字符串a,b,有m个询问,每次分别给出两个起始位置x,y,求a串从x开始,b串从y开始的最长公共前缀(LCP)长度;
思路
二分+RK Hash
如上文预处理出每个前缀的Hash值,我们就能O(1)内求出子串Hash值,然后不断二分长度L就好了
根据fstqwq的说法,时间复杂度 \(O(m\log L)\)
然而,自己摸索出了一个骚操作(好象又在哪里听过这种做法?),用倍增,因为二分的上下届可能比较大,不如倍增来的快.
题目:
--update--
TJOI2017DNA
https://www.luogu.org/problemnew/show/P3763我的题解:https://www.luogu.org/blog/Rye-Catcher/solution-p3763
luogu上搜中文和算法都没有,搜英文有一道CF的题不过要用树链剖分,可惜我现在的知识点不够;
另外我惊人地发现一道JSOI2008火星人的题目和SP3109 STRLCP - Longest Common Prefix几乎一模一样
转载于:https://www.cnblogs.com/Rye-Catcher/p/8723665.html
学习笔记-Rabin-Karp哈希相关推荐
- 算法学习笔记13:哈希算法
哈希算法(上):如何防止数据库中的用户信息被脱库 什么是哈希算法 应用一:安全加密 应用二:唯一标识 应用三:数据校验 应用四:散列函数 解答开篇 哈希算法(下):哈希算法在分布式系统中有哪些应用 应 ...
- C++ STL学习笔记
C++ STL学习笔记一 为何要学习STL: 数据结构与算法是编程的核心,STL中包含各种数据结构和优秀的算法,确实值得深入学习,本文中虽然着重使用,但希望有心的朋友能多看看相关数据结构的实现,对于C ...
- 冰冰学习笔记:位图与布隆过滤器
欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
- perl 哈希(hash) 学习笔记
perl 哈希(hash)学习笔记(一) 1.什么是哈希 哈希是perl的一种数据类型,比较类似数组,用于存放数据,包括2部分关键字keys和值value.不同于数组,哈希访问元素的是按照名字访问标量 ...
- 学习笔记:C++进阶【继承、多态、二叉树进阶、map和set、哈希、C++11、异常、智能指针、特殊类设计、C++的类型转换】
文章目录 前言 一.继承 1. 继承的概念及定义 1.1 继承的概念 1.2 继承的定义 1.2.1 定义格式 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 2. 基类和派 ...
- 《神经网络与深度学习》邱希鹏 学习笔记 (1)
<神经网络与深度学习>邱希鹏 学习笔记 (1) 完成进度 第一章 绪论 深度学习与神经网络 人工智能 图灵测试 达特茅斯 *(Dartmouth)* 会议 人工智能的研究领域 人工智能发展 ...
- 计算机网络(第7版)谢希仁著 学习笔记 第四章网络层
计算机网络(第7版)谢希仁著 学习笔记 第四章网络层 第四章 网络层 4.3划分子网和构造超网 p134 4.3.1划分子网 4.3.2使用子网时分组的转发 4.3.3无分类编址CIDR(构建超网) ...
- 算法学习 (门徒计划)3-2 哈希表与布隆过滤器及经典问题 学习笔记
算法学习 (门徒计划)3-2 哈希表与布隆过滤器及经典问题 学习笔记 前言 哈希表 哈希操作 冲突处理 开放定址法 再哈希法 公共溢出区 链式地址法 扩容哈希表 设计简易哈希表 总结 布隆过滤器 对比 ...
- pbds库学习笔记(优先队列、平衡树、哈希表)
目录 pbds库学习笔记(优先队列.平衡树.哈希表) 前言 概述 priority_queue优先队列 概述 参数 堆的基本操作的函数 对比STL新增函数 modify修改 Dijkstra最短路径演 ...
最新文章
- 射线与三角形求交,并判断是否在三角形内的完整代码(带测试)
- LLVM每日谈之二十三 LLVM/Clang编译Linux内核资料
- 今晚直播 | 微软亚洲研究院徐毅恒:预训练时代下的文档智能
- OpenGL上下文共享示例
- 2013.10u-boot移植之增加nand保存环境变量
- python使用近似公式计算e_python如何算自然底数e(方法二)
- Apollo自动驾驶入门课程第①讲—无人驾驶概览
- Diango博客--7.自动生成文章摘要
- java socket ftp登录_基于java socket的简单FTP功能实现
- 142.4. Gearman
- linux下用tcpdump抓包
- SQL错误Duplicate column name 'NAME'名字重复应使用别名
- 输入一个链表,输出该链表中倒数第k个结点
- ActiveMQ 无法启动 提示端口被占用 解决方案
- 游标需要手动关闭吗MySQL,【MySQL必知必会】使用游标
- 系统架构设计师考试总结
- 抗DoS、DDoS防火墙产品大检阅(转)
- HIVE SQL分位数percentile使用方法案例
- 莫安迪2019平面设计作品展示
- 【ZZULIOJ】1023: 大小写转换