算法学习--KMP与Trie

简介: 算法学习--KMP与Trie

KMP


KMP 算法是给定一个源字符串 S (蓝色), 和一个模板字符串 P (红色), 在 S 中去寻找 P 字符串, 并给出 P 在 S 字符串当中开始的下标



next[j]=k 的含义是: 以 P[j] 为结尾的模板串, 其前缀与后缀相等的最大长度为 k

设源串 S 与 模板串 P, 每下一步都是比较 s[i]p[j+1] 是否相等, 如果相等的话就继续, 如果不相等, 则就把 P 字符串后移, 再重新尝试去匹配, 因为每次比较的是 s[i]p[j+1], 所以这要减少 j 就能起到后移的效果, 先减小到 next[j], 不能继续匹配的话就继续减小, 直到 0 为止, 到 0 就说明 P 要从头开始尝试匹配了



求 next 数组就是先拿 P 去匹配自己(P)

如果 p[i]==p[j+1], 则 next[i]=j+1, 否则 next[i]=j=0(此时 j 一定等于 0, 也就是 next[i]=0, 表示需要从头开始)


831. KMP字符串 - AcWing题库


#include<iostream>
using namespace std;
const int NN=1e5+10, MM=1e6+10;
char p[NN], s[MM];
int n, m;
int ne[NN]; // 不用 next 这个单词, 防止重名
int main(){
    // KMP 算法让数组从下标 1 开始方便操作
    scanf("%d%s", &n, p+1);
    scanf("%d%s", &m, s+1);
    // 用 p 匹配 p 来求 ne 数组的值
    // i 从 2 开始遍历就可以了, ne[1] 一定为 0 
    for(int i=2, j=0;i<=n;i++){
        while(j && p[i]!=p[j+1]) j=ne[j]; // 减小 j , 使得 p[i]==p[j+1], 或者直到 j==0 为止
        if(p[i]==p[j+1]) j++;
        ne[i]=j;
    }
    for(int i=1, j=0;i<=m;i++){
        while(j && s[i]!=p[j+1]) j=ne[j];
        if(s[i]==p[j+1]) j++;
        if(j==n){
            printf("%d ", i-n); // 本来应该是 i-n+1, 这里要把下标从 1 开始转回从0开始
            j=ne[j]; // 继续向后匹配
        }
    }
    cout<<endl;
    return 0;
}


Trie

相关文章
|
11天前
|
机器学习/深度学习 人工智能 资源调度
【博士每天一篇文献-算法】连续学习算法之HAT: Overcoming catastrophic forgetting with hard attention to the task
本文介绍了一种名为Hard Attention to the Task (HAT)的连续学习算法,通过学习几乎二值的注意力向量来克服灾难性遗忘问题,同时不影响当前任务的学习,并通过实验验证了其在减少遗忘方面的有效性。
28 12
|
4天前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
6天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
11天前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks
本文提出了一种基于任务条件超网络(Hypernetworks)的持续学习模型,通过超网络生成目标网络权重并结合正则化技术减少灾难性遗忘,实现有效的任务顺序学习与长期记忆保持。
14 4
|
11天前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之RWalk:Riemannian Walk for Incremental Learning Understanding
RWalk算法是一种增量学习框架,通过结合EWC++和修改版的Path Integral算法,并采用不同的采样策略存储先前任务的代表性子集,以量化和平衡遗忘和固执,实现在学习新任务的同时保留旧任务的知识。
50 3
|
12天前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-综述】基于脑启发的连续学习算法有哪些?附思维导图
这篇博客文章总结了连续学习的分类,包括经典方法(重放、正则化和稀疏化方法)和脑启发方法(突触启发、双系统启发、睡眠启发和模块化启发方法),并讨论了它们在解决灾难性遗忘问题上的优势和局限性。
13 2
|
1天前
|
算法
KMP算法
KMP算法
4 0
|
1月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
【7月更文挑战第19天】Trie树,又称前缀树,是优化字符串搜索的高效数据结构。通过利用公共前缀,Trie树能快速插入、删除和查找字符串。
48 2
|
1月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
|
1月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战

热门文章

最新文章