算法学习--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

相关文章
|
1天前
|
算法 C语言
KMP算法(C语言实现)
KMP算法(C语言实现)
6 0
|
4天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
6天前
|
算法 搜索推荐 程序员
第六十三练 字符串匹配 - KMP算法
第六十三练 字符串匹配 - KMP算法
8 2
|
6天前
|
机器学习/深度学习 算法 网络架构
什么是神经网络学习中的反向传播算法?
什么是神经网络学习中的反向传播算法?
11 2
|
6天前
|
机器学习/深度学习 算法
算法人生(5):从“元学习”看“战胜拖延”(没兴趣版)
元学习是让机器学会学习策略,适应新任务的机器学习范式。通过定义任务分布、采样任务、内在和外在学习循环来优化模型,增强其跨任务适应性和泛化能力。面对不感兴趣的任务导致的拖延,我们可以借鉴元学习的思路:重新评估任务价值,寻找通用兴趣点;设定奖励激发行动;改变环境以提高执行力。通过调整视角、自我激励和优化环境,可以克服因无兴趣而产生的拖延。
|
6天前
|
机器学习/深度学习 存储 算法
算法人生(4):从“选项学习”看“战胜拖延”(担心失败版)
选项学习是强化学习的一种策略,通过定义、学习和切换选项来解决复杂任务,将大任务分解为可重复使用的子任务,以提高学习效率和适应性。面对因担心失败而拖延的问题,我们可以借鉴选项学习的思想:将大任务拆分为小目标,正视失败作为成长的一部分,回顾成功经验并寻求支持。通过这种方式,逐步增强自信,降低拖延现象。
|
6天前
|
算法 网络协议
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
8 1
|
6天前
|
机器学习/深度学习 算法
应用规则学习算法识别有毒的蘑菇
应用规则学习算法识别有毒的蘑菇
|
6天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
6天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。