博客
关于我
KMP算法详细讲解(看完不会请打我)
阅读量:221 次
发布时间:2019-02-28

本文共 2224 字,大约阅读时间需要 7 分钟。

详解 KMP 算法中的 next 数组与代码实现

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,广泛应用于文本搜索、数据处理等领域。其核心思想在于利用前缀和后缀的最长公共部分(LPS,Longest Prefix Suffix)来优化匹配过程,从而减少不必要的比较操作,提高效率。

1. next 数组的作用

next 数组用于记录每个位置发生不匹配时,应该回溯到的位置。具体来说,next[i] 表示在目标串的第 i 个字符发生不匹配时,应该将 j(目标串的当前匹配指针)跳转到的位置,继续与主串进行比较。

2. next 数组的计算方法

next 数组的计算分为以下几个步骤:

  • 初始化:首先,next 数组的第一个元素被初始化为 -1,这表示当目标串的第一个字符发生不匹配时,应该将 j 设为 -1,开始从下一个字符开始匹配。

  • 遍历目标串:从左到右遍历目标串的每个字符,维护两个指针 j 和 k:

    • j 表示当前匹配的位置。
    • k 表示前缀的当前长度。
  • 更新前缀长度:如果当前字符与前缀字符匹配,则 k 增加 1。

    • 如果 k 达到目标串的长度,说明已经找到了一个完整的前缀,更新 next 数组中的相应位置。
    • 否则,更新 next 数组中的当前位置为 k。
  • 处理不匹配情况:如果当前字符与主串的字符不匹配,则将 k 设为 next[k],并继续比较。

  • 通过上述步骤,可以逐步构建出 next 数组,使得在匹配过程中能够高效地跳转到最近的有效位置,减少不必要的比较。

    3. KMP 算法的代码实现

    KMP 算法的代码实现主要包含两个部分:

  • 预处理阶段:计算目标串的 next 数组。
  • 匹配阶段:利用 next 数组进行高效的字符串匹配。
  • 以下是 KMP 算法的伪代码:

    function KMP(str_main, str_target)    // 1. 初始化 next 数组    n = length(str_target)    next = array of size n, initialized to 0    k = 0    for i from 0 to n-1:        while k > 0 and str_target[k] != str_main[i]:            k = next[k]        if str_target[k] == str_main[i]:            k += 1        next[i] = k        k = next[i]    // 2. 主循环进行匹配    i = 0  // 指针,遍历主串    j = 0  // 指针,遍历目标串    while i < length(str_main) and j < length(str_target):        if str_main[i] == str_target[j]:            i += 1            j += 1        else:            j = next[j]    if j == length(str_target):        return i - j  // 返回匹配的位置    else:        return -1  // 未找到

    4. next 数组的具体计算

    为了更好地理解 next 数组的计算过程,我们可以通过一个具体的例子来分析:

    假设目标串为 ABABCABAB,主串也为 ABABCABAB

  • 初始化:next 数组的长度为 8,初始值均为 0。
  • 遍历目标串
    • i = 0,k = 0:比较 AA,相等,k 增加到 1,next[0] = 1。
    • i = 1,k = 1:比较 BB,相等,k 增加到 2,next[1] = 2。
    • i = 2,k = 2:比较 AC,不相等,k = next[2] = 0,比较 AA,相等,k 增加到 1,next[2] = 1。
    • i = 3,k = 1:比较 BB,相等,k 增加到 2,next[3] = 2。
    • i = 4,k = 2:比较 CC,相等,k 增加到 3,next[4] = 3。
    • i = 5,k = 3:比较 AA,相等,k 增加到 4,next[5] = 4。
    • i = 6,k = 4:比较 BB,相等,k 增加到 5,next[6] = 5。
    • i = 7,k = 5:比较 CC,相等,k 增加到 6,next[7] = 6。
  • 最终,next 数组为:[1, 2, 1, 2, 3, 4, 5, 6]。

    5. KMP 算法的优化效果

    通过 next 数组,KMP 算法在匹配过程中能够快速跳转到最近的有效位置,避免了暴力搜索中的大量不必要比较。例如,在主串和目标串不匹配时,j 会跳转到 next[j],并继续比较,而不是从头开始重新匹配。

    6. 总结

    KMP 算法通过预处理目标串,构建 next 数组,实现了高效的字符串匹配。其核心思想是利用前缀和后缀的最长公共部分来减少回溯次数,从而降低了时间复杂度,提高了匹配效率。理解 next 数组的计算过程和逻辑是掌握 KMP 算法的关键,通过多练习和分析,可以更深入地掌握这一高效的算法。

    转载地址:http://mjsi.baihongyu.com/

    你可能感兴趣的文章
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>